2013-05-27 7 views
8

Mam niektóre kod C# z poniższej deklaracji tablicowej. Zauważ singiel ? po Color.Co robi? operator oznacza w C# po deklaracji typu?

private Color?[,] scratch; 

W moim badają I odkryli, że jeśli masz kod, takich jak:

int? a; 

Zmienna a nie jest inicjowany. Kiedy i gdzie byś tego użył?

+0

Jeśli robiłeś jakieś matematyczne obliczenia w oparciu o wprowadzone przez użytkownika, co chcesz zrobić pewni, że wprowadzili liczbę, aby równanie nie używało domyślnej wartości – Sayse

+2

Jak dodać znacznik 'nullable' obok nie wiesz co to jest'? '? –

+0

Jestem zawsze zaskoczony, gdy widzimy, że gdy pytanie jest proste, istnieje wiele duplikatów odpowiedzi. – Nolonar

Odpowiedz

15

? to tylko cukier syntaktyczny, oznacza to, że pole jest zerowe. W rzeczywistości jest to skrót od Nullable<T>.

W języku C# i Visual Basic zaznaczasz typ wartości jako zerowalny, używając ? notacja po typie wartości. Na przykład int? w C# lub Integer? w języku Visual Basic deklaruje typ wartości całkowitej, który można przypisać null.

Nie można przypisać null do typów wartości, int jest typ wartości nie może posiadać null wartość, int? z drugiej strony może przechowywać wartość zerową.

Tak samo jest w przypadku Color, ponieważ jest to struktura (a więc typ wartości) i nie może posiadać wartości null, z Color?[,] robisz tablicę wartości pustych Color.

za pytanie:

Zmienna 'a' nie jest inicjowany. Kiedy i gdzie użyłbyś tego ?

Korzystając ? ze zmienną, nie czyni ona zainicjowana null lub jakąkolwiek inną wartość, to musi jeszcze zostać zainicjowany.

int? a = null; 

int b = null;//error since b is not nullable 
+0

Co powiesz w oświadczeniu. klient? .Close(); ? – Rahly

+0

Jeśli jest to po prostu cukier syntaktyczny, to w jaki sposób '?' I 'Nullable ' są wymienialne? – dakab

+0

@dakab, w czasie kompilacji zmienią się, na przykład "int?" Stanie się 'Nullable ' – Habib

4

Oznacza to, że zdefiniowany typ jest zerowy. Sprawdź numer this link, aby uzyskać więcej informacji.

Z nullables można zrobić:

int? i = null; 

I oczywiście zrobić kontrole zerowe:

if (i == null) 
{ 
    // do stuff here ... 
} 
0

To oznacza, że ​​obiekt może mieć null -value oprócz normalnego zakresu.

Od MSDN:

typy dopuszczające wartość null są przypadki struct pustych. Typ null może reprezentować poprawny zakres wartości dla jego bazowego typu wartości plus dodatkową wartość pustą. Na przykład, wartość Nullable, wymawiana jako "Nullable of Int32", może być przypisana dowolnej wartości z -2147483648 do 2147483647 lub może być przypisana wartość pusta.
...

Przykład

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); 
     } 
    } 
} 
0

Color? oznacza NullableColor i odpowiada Nullable<Color>.

Color c = null;//ERROR Color is a struct, cannot be null! 
Color? c = null;//OK 

Nullable Types