В C# 4, не был там короткий путь для проверки нулевые значения как так:
if( myobject?.myproperty?.myotherproperty?.value != null )
Значение возвратило бы пустой указатель и не выдало бы исключение.
У кого-либо есть ссылка на то, как использовать ее или по крайней мере синтаксис?
В Groovy этот оператор называется оператор безопасной навигации.
Он пока недоступен в C#, даже в C# 4.
Если достаточное количество людей выскажется в его поддержку, возможно, он попадет в гипотетическую будущую версию C#...
В C# также есть оператор ??, который используется для проверки на null. Это немного лучше, чем оператор ?
(x ?? -1) эквивалентно (x!= null ? x: -1)
Неа, извините, ничего подобного. Они рассматривали этот вариант, но он не попал в список.
Как уже говорили другие, в C# нет встроенного способа сделать это. Несколько месяцев назад я написал сообщение в блоге о способе сделать это с помощью выражений, с методом расширения NullSafeEval
:
if (myobject.NullSafeEval(o => o.myproperty.myotherproperty.value) != null)
...
Но это только доказательство концепции, я не тестировал его тщательно, и это довольно медленно...
В C # / C ++ я могу добиться этого с помощью тернарного оператора, хотя код был бы ужасным. Вы уверены, что хотите использовать это?
if ((myobject! = Null? (Myobject.myproperty! = Null? (Myobject.myproperty.myotherproperty! = Null? Myobject.myproperty.myotherproperty.value: null): null ): null)! = null)
class MyOtherProperty
{
public string value;
}
class MyProperty
{
public MyOtherProperty myotherproperty;
}
class MyObject
{
public MyProperty myproperty;
}
Мой код модульного теста:
[TestMethod()]
public void TestTernaryOperator()
{
MyObject myobject = new MyObject();
Debug.WriteLine (string.Format ("{0}, {1}", myobject != null, myobject.myproperty != null));
Debug.WriteLine(string.Format("IsNotNull = {0}", IsNotNull(myobject)));
myobject.myproperty = new MyProperty();
Debug.WriteLine (string.Format ("{0}, {1}, {2}", myobject != null, myobject.myproperty != null, myobject.myproperty.myotherproperty != null));
Debug.WriteLine(string.Format("IsNotNull = {0}", IsNotNull(myobject)));
myobject.myproperty.myotherproperty = new MyOtherProperty ();
Debug.WriteLine (string.Format ("{0}, {1}, {2}, {3}", myobject != null, myobject.myproperty != null, myobject.myproperty.myotherproperty != null, myobject.myproperty.myotherproperty.value != null));
Debug.WriteLine(string.Format("IsNotNull = {0}", IsNotNull(myobject)));
myobject.myproperty.myotherproperty.value = "Hello world";
Debug.WriteLine(string.Format("{0}, {1}, {2}, {3}", myobject != null, myobject.myproperty != null, myobject.myproperty.myotherproperty != null, myobject.myproperty.myotherproperty.value != null));
Debug.WriteLine(string.Format("IsNotNull = {0}", IsNotNull(myobject)));
}
bool IsNotNull(MyObject myobject)
{
bool isNotNull = (myobject != null ? (myobject.myproperty != null ? (myobject.myproperty.myotherproperty != null ? myobject.myproperty.myotherproperty.value : null) : null) : null) != null;
return isNotNull;
}