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?
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?
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.
Rozwiązaniem jest: 'if ((object) left == null)' lub 'if (ReferenceEquals (left, null))'. Ten pierwszy jest prawdopodobnie bardziej wydajny. – yfeldblum
@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
@Justice, ale nigdy nie zakładaj niczego o wydajności, zaufaj profilerowi :) – JaredPar
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ć.
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 –
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
@ 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. –
Jak wskazano przez innych, są one w większości równoważne.
Należy również przyjrzeć: http://en.wikipedia.org/wiki/Null_Object_pattern
Jest to bardzo użyteczna alternatywa po prostu sprawdzanie null odniesienia.
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#.
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;
}
};
Pierwszy z nich znany jest również jako Yoda condtion :) –