我正在使用Eto gui framework。我在他們的源代碼中看到了一些神奇的語法;例如: :什麼符號'?'類型名稱後的意思是
int x;
int? x;
void func(int param);
void func(int? param);
有什麼不同?我很困惑。 和符號?
很難谷歌。
我正在使用Eto gui framework。我在他們的源代碼中看到了一些神奇的語法;例如: :什麼符號'?'類型名稱後的意思是
int x;
int? x;
void func(int param);
void func(int? param);
有什麼不同?我很困惑。 和符號?
很難谷歌。
struct
小號(如int
,long
等)默認情況下不能接受null
。因此,.NET提供了一個名爲Nullable<T>
的通用struct
,其中T
類型參數可以來自任何其他struct
。
public struct Nullable<T> where T : struct {}
它提供了一個bool HasValue
屬性指示當前Nullable<T>
對象是否具有值;和T Value
屬性,獲取當前Nullable<T>
值的值(如果HasValue == true
,否則會拋出一個InvalidOperationException
):
public struct Nullable<T> where T : struct {
public bool HasValue {
get { /* true if has a value, otherwise false */ }
}
public T Value {
get {
if(!HasValue)
throw new InvalidOperationException();
return /* returns the value */
}
}
}
最後,在你的問題的答案,TypeName?
是Nullable<TypeName>
一條捷徑。
int? --> Nullable<int>
long? --> Nullable<long>
bool? --> Nullable<bool>
// and so on
和用法:
int a = null; // exception. structs -value types- cannot be null
int? a = null; // no problem
例如,我們有一個Table
類,在一個名爲Write
方法生成HTML <table>
標籤。請參閱:
public class Table {
private readonly int? _width;
public Table() {
_width = null;
// actually, we don't need to set _width to null
// but to learning purposes we did.
}
public Table(int width) {
_width = width;
}
public void Write(OurSampleHtmlWriter writer) {
writer.Write("<table");
// We have to check if our Nullable<T> variable has value, before using it:
if(_width.HasValue)
// if _width has value, we'll write it as a html attribute in table tag
writer.WriteFormat(" style=\"width: {0}px;\">");
else
// otherwise, we just close the table tag
writer.Write(">");
writer.Write("</table>");
}
}
上面的類 - 正如一個示例 - 的用法是一樣的東西,這些:
var output = new OurSampleHtmlWriter(); // this is NOT a real class, just an example
var table1 = new Table();
table1.Write(output);
var table2 = new Table(500);
table2.Write(output);
,我們將有:
// output1: <table></table>
// output2: <table style="width: 500px;"></table>
的[
+1但是..'value類型,將被存儲在堆棧中......' - 不是真的。參見:[該堆棧是實現細節,第一部分](http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx)作者Eric Lippert – Habib 2013-02-26 06:01:03
@Habib謝謝。我很快就讀了。問候。 – 2013-02-26 06:06:40
這意味着他們是Nullable,他們可以保留空值。
如果你定義:
int x;
那麼你可以這樣做:
x = null; // this will be an error.
,但如果你已經定義x
爲:
int? x;
,那麼你可以這樣做:
x = null;
在C#和Visual Basic,您標記使用 的一個值類型爲可爲空?值類型後的符號。例如,int?在C#或 整數?在Visual Basic中聲明一個整數值類型,可以是 指定爲null。
個人而言,我會用http://www.SymbolHound.com與符號搜索,看看結果here
?
只是語法糖,它等價於:
int? x
是相同Nullable<int> x
可能重複爲什麼會出現一個關於私有變量定義的問號?](http://stackoverflow.com/questions/2326158/why-is-there-a-questionmark-on-the-private-variable-definition) – 2013-02-26 07:45:15
可能的重複[C# - Basic問題:什麼是'?'?](http:// stackoverflo w_questions/2699373/c-sharp-basic-question-what-is) – 2013-02-28 22:43:06