Bir türden sonra soru işaretinin amacı nedir (örneğin: int? MyVariable)?


433

Tipik olarak soru işaretinin ana kullanımı koşulludur x ? "yes" : "no".

Ama bunun için başka bir kullanım gördüm, ancak ?operatörün bu kullanımının bir açıklamasını bulamıyorum .

public int? myProperty
{
   get;
   set;
}

Yanıtlar:


437

Bu, söz konusu değer türünün boş değerli bir tür olduğu anlamına gelir

Null olabilecek türler, System örneğidir. Null edilebilir yapı. Bir boş değer, temel değer türü için doğru değer aralığını ve ek bir boş değeri temsil edebilir. Örneğin Nullable<Int32>, "Int32 Nullable" olarak telaffuz edilen a'ya -2147483648 ile 2147483647 arasında herhangi bir değer atanabilir veya null değeri atanabilir. A'ya Nullable<bool>true, false veya null değerleri atanabilir. Sayısal ve Boole türlerine null atama özelliği, özellikle veritabanları ve değer atanamayan öğeler içeren diğer veri türleriyle uğraşırken kullanışlıdır. Örneğin, bir veritabanındaki bir Boole alanı değerleri doğru veya yanlış depolayabilir veya tanımsız olabilir.

class NullableExample
{
  static void Main()
  {
      int? num = null;

      // Is the HasValue property true?
      if (num.HasValue)
      {
          System.Console.WriteLine("num = " + num.Value);
      }
      else
      {
          System.Console.WriteLine("num = Null");
      }

      // y is set to zero
      int y = num.GetValueOrDefault();

      // num.Value throws an InvalidOperationException if num.HasValue is false
      try
      {
          y = num.Value;
      }
      catch (System.InvalidOperationException e)
      {
          System.Console.WriteLine(e.Message);
      }
  }
}

3
Yapı için kullanılır. Sınıflar için gerçekten yararlı olduğunu düşünmeyin.
MonsieurDart

8
@MonsieurDart - Bu sorunun cevabının neden "değer türü" olduğunu söylüyor
Sean

3
@AntoineDahan - değer türlerinde nullable türleri yoktur çünkü tanım gereği nullable değildir. Örneğin , bir inttür ve karşılık gelen bir Integersınıfın olduğu Java'yı düşündüğünüzü düşünüyorum .
Sean

2
null olabilecek tür için daha yeni (2015) belgeler burada
dinozor

2
Ayrıca, soru işaretinin c # 6'da (VS 2015) bir nesneyi (türün örneği) izleyebileceğini unutmayın.
Zim

118

Bunun için bir kestirme yol Nullable<int>. Nullable<T>, bir değer türünün ayarlanmasına izin vermek için kullanılır null. Değer türleri genellikle boş olamaz .


3
artı bir kısaltma terimini kullanmak için, Oldukça düz ileri!
Hari

3
İkinci cümle beni karıştırıyor. "Yapamaz" derken ne demek istiyorsun? Derleyici düzeyinde veya uygulama bağlamında.
17'de sorunlu memur

5
@problemofficer for definition, value typesnull olamaz. Bir değer atamadan bir int veya bool (değer türleri olan) bildirirseniz, yine de değerleri (sırasıyla 0 ve false) olur, yani. boş olmazlardı. reference typesÖte yandan, nesne veya Sınıfım gibi atanmamışlar boş olacaktır. Değer türleri ve referans türleri arasındaki farkı okumak isteyebilirsiniz.
Klaus Byskov Pedersen

Açıklama için teşekkürler. Şimdi anlıyorum.
problem

62

İçinde

x ? "yes" : "no"

? if cümlesi bildirir . Burada: x , boole koşulunu temsil eder; Önceki kısım : olup daha sonra cümle ve yarı peşinde başka bir cümle.

Örneğin,

int?

? nullable türünü bildirir ve önceki türün null değere sahip olabileceği anlamına gelir.


9
'?' Arasında bir ilişki görmüyorum. null olabilen bir tür ve üçlü bir ifade bildirme. Cevabınızı oylama efendim.
Gus Crawford

36
Gus'ın yukarıdaki yorumuna katılmıyorum. Soru üçlü ifadeyle olası bir karışıklık olduğunu göstermektedir. Bu cevap bu sorunu ele almaktadır.
Mario Levesque

Bu tür boş karşılaştırmayı nerede kullanırsınız? Bir dönüş içinde izin verilmiyor gibi görünüyor. return value ? value : "isNull";bana string valueboole dönüştürülemez diyor.
C4d

Özellikle bu sorudaki diğer insanlarla kıyaslandığında bunun çok kıvrımlı bir cevap olduğunu söylemeliyim. -1
FastTrack

Bu kabul edilen cevap olmalı. Açık ve kesin olduğu için. +1
JP Dolocanog

49

Sıfırlanabilir Türler

Null olabilecek türler, System örneğidir. Null edilebilir yapı. Bir boş değer, temel değer türü için normal değer aralığını ve ek bir boş değeri temsil edebilir . Örneğin Nullable<Int32>, "Int32 Nullable" olarak telaffuz edilen bir [ ], -2147483648 ile 2147483647 arasında herhangi bir değer atanabilir veya null değer olarak atanabilir. Bir [ Nullable<bool>] değerine true veya false veya null atanabilir. Sayısal ve Boole türlerine null atama yeteneği, veritabanlarıyla ve değer atanamayan öğeler içeren diğer veri türleriyle uğraşırken özellikle yararlıdır. Örneğin, bir veritabanındaki bir Boole alanı değerleri doğru veya yanlış depolayabilir veya tanımsız olabilir.


11

türün null edilebilir olduğunu bildirir.


2
İlk girişiniz, sorucular örneği göz önüne alındığında, mantıklı değildir.
İkili Worrier

Sadece yukarıda derinlemesine cevaplar zaman değerlendirme merak ediyorum :)
Naga

6

pratik kullanım:

public string someFunctionThatMayBeCalledWithNullAndReturnsString(int? value)
{
  if (value == null)
  {
    return "bad value";
  }

  return someFunctionThatHandlesIntAndReturnsString(value);
}

1
OP hala aktifken, soru sorulduktan 5 yıl sonra, cevap artık geçerli olmayabilir.
Çilek

10
me 3 saat önce oldu :-)
AJBauer

3

Yukarıdaki yanıtlara eklemek için işte bir kod örneği

struct Test
{
    int something;
}
struct NullableTest
{
    int something;
}
class Example
{
    public void Demo()
    {
        Test t = new Test();
        t = null;

        NullableTest? t2 = new NullableTest();
        t2 = null;
    }
}

Bu bir derleme hatası verir:

Hata 12 Boş olmayan bir değer türü olduğu için null değeri 'Test'e dönüştürülemiyor

NullableTest için derleme hatası olmadığına dikkat edin. (t2 bildirimindeki?


2

int?kısaltmasıdır Nullable<int>. İki form birbirinin yerine kullanılabilir.

Nullable<T>Tkabul etmek için bir değer türüyle kullanabileceğiniz bir operatördür null.

Bunu bilmiyorum durumda: değeri türleri olarak değerleri kabul türleridir int, bool, charvs ...

Değerlere yapılan referansları kabul edemezler: Onlara referans türlerininnull aksine , açıkça kabul edebilecekleri bir atarsanız derleme zamanı hatası oluştururlar .

Neden buna ihtiyacın var? Çünkü bazen değer türü değişkenleriniz, veritabanından döndürülen eksik veya tanımsız değişken gibi çok iyi çalışmayan bir şey tarafından döndürülen boş başvuruları alabilir.

Microsoft Belgeleri okumanızı öneririm çünkü konuyu oldukça iyi kapsar.

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.