Null yapılabilir "int" türünün varsayılan değeri nedir? (soru işareti dahil)?


107

C # 'da, türündeki bir sınıf örneği değişkeninin varsayılan değeri int?nedir?

Örneğin, aşağıdaki kodda, MyNullableIntasla açıkça atanmamışsa hangi değere sahip olacaktır ?

class MyClass
{
    public int? MyNullableInt;
}

(Görünüşe göre cevap neredeyse kesinlikle ya ya nullda 0, ama bunlardan hangisi?)


9
Neden olumsuz oy? (Bu sorunun cevabı, davranışı test etmek için kodu gerçekten çalıştırmadan başlangıçta bana açık değildi; şaşırtıcı bir şekilde, StackOverflow'da bu sorunun bir kopyasını bulamadım veya Google aracılığıyla başka bir yerde kolayca bulamadım.)
Jon Schneider

1
Baktın olabilirdi burada - ilk google benim için çarptı.
500 - Dahili Sunucu Hatası

2
@ 500 - Bu makaleyi araştırırken buldum - aslında ona aşağıdaki kendi cevabımla bağlantı verdim - ancak anlayabildiğim kadarıyla, makale açık bir şekilde null atanabilir bir tür örneğinin varsayılan değerinin belirtilmiyor boş. Bu mu "HasValue için varsayılan değer yanlıştır. Değer özellik varsayılan değeri vardır", ama bu doğrudan bazı ek kazma olmadan benim orijinal soruya cevap vermez söylüyorlar.
Jon Schneider

2
Merak ediyorum, bunun nedeni bir kesme noktası ayarlayıp değerin ne olduğunu veya Immediate Window türünde int? x;sonucun ne olduğunu görebildiğiniz için miydi?
Rufus L

Yanıtlar:


139

int?- ve "tür?" Kullanan null yapılabilir herhangi bir tür için varsayılan değer beyanname - olduğunu null.

Neden durum bu:

  • int?Nullable <T> türü için sözdizimsel şekerdir (burada T'dirint ), bir yapı. ( referans )
  • Nullable<T>Tip sahip BOOL HasValue elemanı falseyapar Nullable<T>bir örneği "gibi hareket" nulldeğeri. Özellikle, Nullable <T> .Equals yöntemi , truebir Nullable<T>ile HasValue == falsegerçek bir nulldeğerle karşılaştırıldığında dönmek için geçersiz kılınır .
  • Gönderen C # Dili Şartname 11.3.4 , bir yapı örneğinin başlangıç varsayılan değer varsayılan değere ayarlanmış olduğu yapı değeri tip tüm alanları ve ayarlı olduğu yapı referans tipi alanlarının hepsi bu null.
  • boolC # 'da bir değişkenin varsayılan değeri false ( başvuru )' dur . Bu nedenle, HasValuevarsayılan bir Nullable<T>örneğin özelliği false; bu da o Nullable<T>örneğin kendisinin gibi davranmasını sağlar null.

Bir bildirimi olarak olarak int? x = null;değiştirdiğimde int? x;, kodda daha aşağıda derleyici hataları alıyorum: "Atanmamış yerel değişken x kullanımı".
John Pick

1
@JohnPick Bu, bir değişkeni kullanmadan önce başlatmayı "unutmanızdan" kaynaklanabilecek hataları önlemeyi amaçlayan bir C # derleyici özelliğidir. Eğer bir durum olabilir başlatılmamış int karşılaşmak? bir sınıf üyesi değişkeni olduğu zamandır. Her ikisine de buradan örnekler: blogs.msdn.microsoft.com/abhinaba/2005/11/08/…
Jon Schneider

Yani temelde burası sizin teknoloji blogunuz mu? Cevabı almak için kodu çalıştırmanız gereken soruları sorarsınız, ardından soruyu aynı dakika içinde kendiniz cevaplarsınız.
GôTô

4
@JonSchneider yeterince adil, o zaman benim hatam
GôTô

VS adlı derleyici ipucu / uyarı yanıltıcıdır: Field 'id' is never assigned to, and will always have its default value 0. Tuhaf değil mi?
Hendy Irawan

32

Aka değerleri Nullable<T>.GetValueOrDefault()kullanan matematik hesaplamaları ile çalışırken özellikle kullanışlı olan yöntemi paylaşmanın önemli olduğunu hissettim . Mülkü kontrol etmeniz gerekmediği birçok kez vardır ve bunun yerine kullanabilirsiniz .Nullable<int>int?HasValueGetValueOrDefault()

var defaultValueOfNullableInt = default(int?);
Console.WriteLine("defaultValueOfNullableInt == {0}", (defaultValueOfNullableInt == null) ? "null" : defaultValueOfNullableInt.ToString());

var defaultValueOfInt = default(int);
Console.WriteLine("defaultValueOfInt == {0}", defaultValueOfInt);

Console.WriteLine("defaultValueOfNullableInt.GetValueOrDefault == {0}", defaultValueOfNullableInt.GetValueOrDefault());

Yukarıdaki kodu gösteren komut satırı


0
var x = default (int?);
Console.WriteLine("x == {0}", (x == null) ? "null" : x.ToString());
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.