Może to zrobić różnicę e w trzech przypadkach.
Jednym z nich jest przypadek, w którym literówka condition = null
jest ważna w if
. Jest to bardziej powszechne w językach w stylu C, które pozwoliłyby na null
w if
(ceniony jako false
), który jest większość z nich, ale nie C#.
Jest możliwe, aby stworzyć typ, który ma ten skutek w C#:
public class Test
{
public static bool operator true(Test x)
{
return true;
}
public static bool operator false(Test x)
{
return false;
}
}
void Main()
{
Test test = new test();
if (test = null)
{
Console.WriteLine("!");
}
}
Nie ma wiele razy, że przeciążenia tych operatorów sensu, zwłaszcza, że .NET 2.0 wprowadzone leki generyczne (miał większą wartość dla typów takich jak SqlBoolean
, które włączały wartość, aby wskazać true
, false
lub null
w sposób, w jaki używamy teraz bool?
).
Ta sprawa jest dość marginalna w języku C#.
Innym jest podobna, jeśli istnieje niejawna konwersja do bool
lub do typu, który z kolei realizuje true
i false
operatory:
void Main()
{
Test test = new Test();
if (test = null)
{
Console.WriteLine("!");
}
}
public class Test
{
public static implicit operator bool(Test x)
{
return true;
}
}
operatorzy niejawne są warte unikanie z kilku powodów, ale jest to nieco bardziej prawdopodobny niż pierwszy przykład, choć nadal nie jest powszechny.
Jeszcze inna jest sytuacja, gdy ==
jest przeciążony w niesymetrycznej sposób:
public class Test
{
public static bool operator == (Test x, Test y)
{
return ReferenceEquals(x, null);
}
public static bool operator !=(Test x, Test y)
{
return !(x == y);
}
}
void Main()
{
Test test = new Test();
if (test == null)
{
Console.WriteLine("This won't print.");
}
if (null == test)
{
Console.WriteLine("This will print.");
}
}
Ale ponieważ niesymetryczną ==
zawsze jest bug, to zależy od błędu w operatorze mieć żadnego wpływu . Prawdopodobnie zdarza się to nieco częściej niż pierwszy przypadek, ale powinno zostać naprawione, gdy tak się stanie, a więc jest jeszcze mniej realne.
Podczas gdy może mieć efekt w języku C#, sprawy są rzadkie i w większości oparte na tym, że ktoś zrobił coś, czego nie powinien.
Jako taka, jest to głównie kwestia stylu. Ludzie, którzy najpierw wstawili plik null
, wybierali go z języków, z których robi się różnicę.
To był hack w starych starszych wersjach C, zanim kompilatory zaczną generować ostrzeżenia o tym. Nie ma problemu w C#, ma typ * bool * w przeciwieństwie do C, więc będzie krzyczeć na ciebie, gdy napiszesz (obj = null) {} –