2009-02-27 13 views
15

Są one równoważne:C#: Porównanie z wartością null

if (null==myobject) 
{ 
//do something 
} 

i

if (myobject==null) 
{ 
//do something 
} 

lub będą produkować inny kod?

+10

Pierwszy z nich znany jest również jako Yoda condtion :) –

Odpowiedz

41

W przypadku 99% ten kod jest równoważny.

Jedynym wyjątkiem jest sytuacja, gdy typ obiektu, o którym mowa, przesłania operator ==. Możliwe jest wprowadzenie błędu w ==, który powoduje problemy, gdy jeden parametr ma wartość null.

Szczególnym przykładem widziałem wcześniej jest następujący

public static bool operator==(Student left, Student right) { 
    return left.Equals(right); 
} 

To niepowodzenie podczas null jest po lewej stronie, a nie kiedy zerowa ale prawdopodobnie w po prawej stronie.

Jest to jednak dość daleko za rogiem.

+0

Rozwiązaniem jest: 'if ((object) left == null)' lub 'if (ReferenceEquals (left, null))'. Ten pierwszy jest prawdopodobnie bardziej wydajny. – yfeldblum

+0

@Justice, nigdy nie badałem JIT, ale jeśli zrobisz Object.Reference jest równa, C# wygeneruje wywołanie metody. W przypadku nieobecności operatora == C# wygeneruje bezpośrednie porównanie wartości z kodem IL opcode. Domyślam się, że ceq jest szybsze. – JaredPar

+4

@Justice, ale nigdy nie zakładaj niczego o wydajności, zaufaj profilerowi :) – JaredPar

9

Forma wyrażenia "if", która umieszcza stałą po lewej stronie, jest zatrzymaniem z C/C++, gdzie można uzyskać dowolne wyrażenie w instrukcji if.

Składnia C# dla instrukcji if wymaga, aby wyrażenie zostało ocenione jako bool, co oznacza, że ​​if (foo = 0) nie będzie się kompilować.

+0

Oh dobrze. Pamiętam kilka lat temu, kiedy uczyłem się języka C#, i przysiągłem sobie, że przypomniałem sobie ostrzeżenie lub błąd kompilatora podczas używania przypisania (przez przypadek) w instrukcji if, wraz z innymi urządzeniami bezpieczeństwa (takimi jak brakujące przerwanie w instrukcji przełączania). +1 –

+0

Robiliśmy to celowo, aby wykonać zadanie i sprawdzić wartość w tym samym czasie. Operator przypisania w C++ zwraca przypisaną wartość. Opuszczam tę funkcję, ale łatwo było ją wykorzystać. – Jasmine

+1

@ Jasmine: Czasami używam konstruktu - po prostu "if ((foo = bar()) == nullptr)". Zwykle to nie przeżywa przeglądu kodu - zmienia się na "foo = bar(); if (foo == nullptr)", który jest czystszy IMHO. –

6

The

if (null==myobject) { 

to bezpieczny sposób pisania instrukcji if. Pochodzi z C/C++, gdzie warunkiem jest wyrażenie ocenione na int. Jeśli wynik wynosi zero, co oznacza false, wszystko inne jest true. można napisać coś podobnego

if (variable == 1) { 

ale jeśli nie byli ostrożni można również napisać

if (variable = 1) { 

w takim przypadku masz zadanie, które zawsze ocenia na 1 i dlatego jest zawsze prawdziwa.

Można to skompilować i uruchomić bez żadnych problemów, ale wynik nie byłby zgodny z oczekiwaniami. Więc programistów C/C++ zaczął pisać takie rzeczy jak

if (1 == variable) { 

Nie będzie to skompilować jeśli go błędnie, więc zawsze miałem napisać to, jak rozumie ją napisać. To później staje się (dobrym) nawykiem i używasz go we wszystkich językach, które programujesz, np. C#.

2

Dla tych, którzy przegap, od tego, czy szukasz w celu zmniejszenia bałaganu, jest to również możliwe, aby umożliwić C-language -Style null sprawdzanie swoich klas C#:

class MyObj 
{ 
    public void implicit_null_comparison_demo() 
    { 
     MyObj mo = null; 
     // ... 

     if (mo)   // <-- like so (can also use !mo) 
     { 
      // it's not null... 
     } 
     else 
     { 
      // it's null... 
     } 
    } 

    public static implicit operator bool(MyObj mo) 
    { 
     return (Object)mo != null; 
    } 
}; 
Powiązane problemy