2010-04-23 3 views
15

Мне интересно, что означает ? в C#?
Я вижу вещи вроде: DateTime? или int?. Я полагаю, что это относится к C# 4.0?
Я не могу найти его в Google, потому что я не знаю названия этой вещи.
Проблема в том, что я использую DateTime, и у меня много ошибок при приеме (от DateTime до DateTime?).C# - Основной вопрос: что такое «?»?

Спасибо

+9

Это не ново; были вокруг с .NET 2.0. – Randolpho

+0

Не путать с традиционным оператором C if-then-else, x <0? "-": "+" – Qwertie

ответ

33

Это сокращенная для написания Nullable<int> или Nullable<DateTime>. Nullables используются с value types, которые не могут быть нулевыми (они всегда имеют значение).

Это не относится к C# 4.

Вы можете только назначить int? к int, если он имеет значение, так что ваш код должен был бы делать такие вещи, как:

int? n = 1; 
int i = n ?? default(int); //or whatever makes sense 

Также обратите внимание, что Nullable имеет два свойства, HasValue и Value, что вы может использовать тест, если значение установлено и получить фактическое значение.

+3

int i = n ?? по умолчанию (INT); –

+0

@Brian Gideon, вы совершенно правы, я просто хотел проиллюстрировать, что Nullable обладает этими двумя свойствами. –

+0

@klausbyskov: Прекрасно указывать эти свойства, но вы указали их в примере, где они являются плохим выбором - возможно, вы могли бы их записать отдельно и использовать '??' для присвоения 'int' , –

12

Это означает, что это nullable type.

Он позволяет назначить нулевое значение для значений типов, таких как int и DateTime. Это очень полезно с такими вещами, как дополнительные поля в базе данных.

5

? является обнуляемым тип значения.

Вы можете использовать оператор ??, чтобы смешать его с типами значений:

const int DefaultValue = -1; 

// get a result that may be an integer, or may be null 
int? myval = GetOptionalIdFromDB(); 

// the value after ?? is used if myval is null 
int nonNullable = myval ?? DefaultValue; 

обнуляемым типа можно сравнить с нулем, поэтому указанное выше является сокращением для:

if(myval != null) { 
    nonNullable = myval.Value; 
} else { 
    nonNullable = DefaultValue; 
} 

Но я предпочитаю ??

1

A getcha, предназначенный для просмотра: [edit: возможно, это случается иногда]

// nullable type properties may not initialize as null 
private int? foo; // foo = 0 

// to be certain, tell them to be null 
private int? foo = null; 
+0

Это не был мой опыт: Можете ли вы опубликовать полный репродукт с помощью основного метода и всего остального? Пример: Статический класс Программа { private static int? я; public static void Main() { Console.WriteLine (i); } } –

+0

На самом деле, вы правы ... когда я выполняю прямое тестирование в Snippet Compiler, он инициализирует значение null. Когда я написал код в код страницы, обратившись к свойствам из другого открытого закрытого класса, я видел, как они инициализируются как их значения по умолчанию. Мне придется копать глубже, чтобы узнать, когда/почему это происходит. -1 от себя! – Matt

1

Это сокращенный способ объявления реализации универсального класса Nullable<T>, где T - тип значения, не допускающего значения NULL.

Так

int? i = null; 

такая же, как

Nullable<int> i = null; 

Как уже упоминалось выше Nullable<T> предоставляет свойство HasValue, так что вы можете проверить, если i имеет значение, прежде чем работать над ней.

Интересно отметить: Если вы нанесли Nullable<int> i = 3; объекту, вы можете вернуть его обратно в int или Nullable<int>, потому что у него было значение перед боксом. Если, однако, вы добавили Nullable<int> i = null; к объекту, вы получите исключение NullReferenceException при возврате в int, но вы можете вернуть его обратно в Nullable<int>.

1

Как уже отмечалось, после названия типа это означает тип с нулевым значением.

? также используется в операторе условия.

int max = x > y ? x : y 

Это эквивалентно:

int max; 
if(x > y) 
{ 
    max = x; 
} 
else 
{ 
    max = y; 
} 
Смежные вопросы