我正在使用Eto gui framework。我在他们的源代码中看到了一些魔法语法; 例如:
int x;
int? x;
void func(int param);
void func(int? param);
有什么不同?我很迷惑。
并且符号?
很难谷歌。
答案 0 :(得分:8)
这意味着它们是Nullable,它们可以包含空值。
如果您已定义:
int x;
然后你不能这样做:
x = null; // this will be an error.
但如果您已将x
定义为:
int? x;
然后你可以这样做:
x = null;
在C#和Visual Basic中,通过使用将值类型标记为可为空 的?值类型后的符号。例如,int?在C#或 整数?在Visual Basic中声明一个可以的整数值类型 分配为空。
我个人会使用http://www.SymbolHound.com来搜索符号,查看结果here
?
只是语法糖,相当于:
int? x
与Nullable<int> x
答案 1 :(得分:5)
struct
s(如int
,long
等)默认情况下无法接受null
。因此,.NET提供了名为struct
的通用Nullable<T>
,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
类,可以在名为<table>
的方法中生成HTML Write
标记。参见:
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>