C# 4: как встроенное обнаружение нулей?
В C# 4 не было короткого пути для проверки нулевых значений, например:
if( myobject?.myproperty?.myotherproperty?.value != null )
значение возвращает null и не создает исключение.
у кого-нибудь есть ссылка на то, как использовать его или, по крайней мере синтаксис?
5 ответов
этот оператор называется безопасный оператор навигации в 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 ? (мой_объект.свойства myproperty != null ? (мой_объект.свойство myProperty.myotherproperty != null ? мой_объект.свойство myProperty.myotherproperty.значение: 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;
}