我想知道什麼?
在C#中意味着什麼?
我看到的東西是:DateTime?
或int?
。我想這是特定於C#4.0?
我不能在谷歌找它,因爲我不知道這個東西的名字。
問題是我使用DateTime,並且我有很多鑄造錯誤(從DateTime
到DateTime?
)。C# - 基本問題:什麼是'?'?
謝謝
我想知道什麼?
在C#中意味着什麼?
我看到的東西是:DateTime?
或int?
。我想這是特定於C#4.0?
我不能在谷歌找它,因爲我不知道這個東西的名字。
問題是我使用DateTime,並且我有很多鑄造錯誤(從DateTime
到DateTime?
)。C# - 基本問題:什麼是'?'?
謝謝
要編寫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
你可以使用測試,如果已經設置了一個值並獲得實際值。
int i = n ??默認(INT); – 2010-04-23 14:43:38
@Brian Gideon,你是完全正確的,我只是想說明一個Nullable具有這兩個屬性。 – 2010-04-23 14:46:33
@ klausbyskov:指出這些屬性是很好的,但是你已經在一個例子中給出了它們,它們是一個糟糕的選擇 - 也許你可以分別記下它們,並使用'??'來分配'int' 。 – 2010-04-23 14:59:47
這意味着它是一個nullable type。
它允許您爲值類型(如int和DateTime)分配一個空值。它對數據庫中可選字段等內容非常有用。
的?
是一個空值類型它一直在C#。
可以使用??
運算符將其值類型混合:
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;
}
但我更喜歡??
有點遺憾:[編輯:顯然這只是有時會發生]
// 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;
這不是我的經驗:你能用主要方法和所有東西發佈完整的repro嗎?像這樣: static class程序 { private static int?一世; public static void Main() Console.WriteLine(i); } } – 2010-04-23 16:03:31
實際上,你是對的......當我在Snippet Compiler中進行直線測試時,它初始化爲null。當我在代碼隱藏頁中編寫代碼時,從另一個公共密封類訪問屬性時,我已經看到它們初始化爲它們的值類型默認值。我將不得不更深入地瞭解何時/爲何發生這種情況。 -1 from myself! – Matt 2010-04-23 17:36:27
這是一種聲明通用類Nullable<T>
的實現的簡寫方式,其中T是非空值類型。
所以
int? i = null;
相同
Nullable<int> i = null;
正如上面提到的Nullable<T>
暴露HasValue屬性,所以你可以檢查是否i
有它的工作之前的值。
有意思的是:如果你將Nullable<int> i = 3;
轉換爲對象,則可以將其轉換回int或Nullable<int>
,因爲它在裝箱前有一個值。但是,如果您將Nullable<int> i = null;
轉換爲對象,則在將其重新轉換爲int時會得到NullReferenceException,但您可以將其重新轉換爲Nullable<int>
。
正如其他人所說,在一個類型的名稱後,它表示可以爲空的類型。
?也用於條件操作符。
int max = x > y ? x : y
這相當於:
int max;
if(x > y)
{
max = x;
}
else
{
max = y;
}
這不是新的;自.NET 2.0以來就一直存在。 – Randolpho 2010-04-23 14:40:15
不要與傳統的C if-then-else運算符混淆,x <0? 「 - 」:「+」 – Qwertie 2010-04-23 16:02:23