2016-11-18 65 views
76

eski sözdizimi daha yeni bir yol (eski örnek) kullanmak için herhangi bir avantaj var mı"x is null" ve "x == null" arasındaki fark nedir? C# 7'de

if (x is null) return; 

yerine

if (x == null) return; 

arasında kullanabilirim?

Anlambilim farklı mıdır?

Sadece bir lezzet meselesi mi? Değilse, ne zaman kullanacağız.

Reference. Başka bir sabite null değiştirdiğinizde null için

+1

Sadece baktığım bağlantı budur, ancak size çok fazla bilgi vermez, bu yüzden OP'nin soruyu sorduğunu tahmin ediyorum. Sayfanın en önemli kısmı bu testin olmasıdır. "Is" operatörü, bir nesnenin çalışma zamanı türünün belirli bir türle uyumlu olup olmadığını kontrol etmek için kullanılır. Başka bir deyişle, bir nesnenin türünün olmasını beklediğimiz şey olduğunu doğrulamak için "is" operatörünü kullanırız. Şu sözdizimine bakalım: –

+1

@SimonPrice C#: C# 6'nın şu anki sürümü hakkındadır. Bu soru, [pattern matching] 'a sahip C# 7 ile ilgilidir (https://blogs.msdn.microsoft.com/dotnet/2016/08/24/neyin-new-in-csharp-7-0 /). –

+0

@bigown Ne tür bir detay arıyorsunuz? –

cevap

69

biz Ancak C# 6 ile kullanılan ne bir fark yoktur, her şey ilginç hale gelir.

Örneğin bu al:

Test(1); 

public void Test(object o) 
{ 
    if (o is 1) Console.WriteLine("a"); 
    else Console.WriteLine("b"); 
} 

Test verimleri a. Eğer bunu o == (object)1 ile karşılaştırırsanız, normal olarak ne yazacağınızı bir fark yaratır. is, karşılaştırmanın diğer sitesinde bulunan türü dikkate alır. Bu süper!

Ben == null vs is null sabit desen, 'kazara' çok tanıdık bir şey olduğunu düşünüyorum nerede is operatörün sözdizimi ve eşittir operatörü verimi aynı sonucu. svick gibi


, is null calls System.Object::Equals(object, object) where == calls ceq yorumladı. is için

IL:

IL_0000: ldarg.1    // Load argument 1 onto the stack 
IL_0001: ldnull    // Push a null reference on the stack 
IL_0002: call bool [mscorlib]System.Object::Equals(object, object) // Call method indicated on the stack with arguments 
IL_0007: ret     // Return from method, possibly with a value 

IL == için:

IL_0000: ldarg.1    // Load argument 1 onto the stack 
IL_0001: ldnull    // Push a null reference on the stack 
IL_0002: ceq     // Push 1 (of type int32) if value1 equals value2, else push 0 
IL_0004: ret     // Return from method, possibly with a value 

yaklaşık null konuştuğumuzdan beri, bu only makes a difference on instances beri hiçbir fark yoktur.

+0

Evet, bu yeni özelliği de anladım. Ben genellikle 'switch' yapıları, biraz C# ile sınırlı olduğu için yararlı olacağını düşünüyorum. Ama 'null' ifadesiyle, sanırım bir yolu ya da diğerini kullanarak aynı olur. – Pikoh

+0

Sanırım öyle. Oluşturulan CIL üzerindeki etkileri bilmiyorum, ama sanırım bir fark yaratmayacaktı. –

+9

@PatrickHofman ['' '' 'object.Equals (x, null)', '==' '' ceq' olarak derler. '' Gibi görünüyor (http://tryroslyn.azurewebsites.net/#b:master/ f:% 3Eilr/K4Zwlgdg5gBAygTxAFwKYFsDcAoADsAIwBswBjGUogQxBBgGEYBvbGNmAge06JgFkAjAApOBAFapSyGAA8AlDAC8APlkwwdCMCJEcASC49 + AJhHjJ0 + UtUylimFp04AvkA ==) Ancak, sonuç sizin söylediğiniz gibi olmalıdır. – svick