类型后面加问号 int?

单问号---用于给变量设初值的时候,给变量(int类型)赋值为null,而不是0!

双问号---用于判断并赋值,先判断当前变量是否为null,如果是就可以赋一个新值,否则跳过!

public int? para = null; //public int para;如果不注释掉此行,而把上一行注释掉的话,下面会报错!

public int par() {     return this.para ?? 0; } 如:c#声明变量加问号(?)的区别

DateTime StartTime和DateTime? StartTime有什么区别? 新的语法,可空值类型。

如Int32、结构体等这样的类型是不可能为空的,常见的如int,DateTime都是不可能为空的。所以在需要判断是否有值的场合,可以用加问号的可空值类型,如int?,DateTime?

这时,可以为空(null),并且可以通过它的HasValue属性来判断是否有值,并通过Value属性获得真正的值。 它可以通过对包装类型直接赋值的方式隐式创建,如: int? a=32;

//使用Nullable<T>结构,用Nullable<int>实例化。变量x现在可以像int那样使用了,进行赋值或者使用运算符执行一些计算。因为我们转换了
//Nullable<T>类型的运算符。x还可以是空。可以检查Nullable<T>的HasValue和Value属性,如果该属性有一个值,就可以访问该值。
Nullable<int>x; x=4; x+=3; if(x.HasValue) { int y=x.Value; } x=null;
//可空类型使用非常频繁,所有C#有一种特殊的语法,用于定义这种类型的变量。定义这类变量时,不使用一般结构的语法,而使用?运算符。在下
//面的例子中,x1和x2都是可空int类型的实例。
Nullable<int>x1;
int?x2;

//可空类型可以与null和数字比较,如上所示。这里,x的值与null比较,如果x不是null,就与小于0的值比较。 int?x=GetNullableType(); if(x==null) Console.WriteLine("x is null"); else if(x<0) Console.WriteLine("x is smaller than 0 ");
//可空类型还可以使用算术运算符。变量x3是变量x1和x2的和。如果这两个可空变量中有一个值是null,它们的和就是null。 int?x1=GetNullableType(); int?x2=GetNullableType(); int?x3=x1+x2;
//非可空类型可以转换为可空类型。从非可空类型转换为可空类型时,在不需要强制类型转换的地方可以进行隐式转换。这种转换总是成功。
int y1=4;
int?x1=y1;

//但从可空类型转换为非可空类型可能会失败。如果可空类型的值是null,把null值赋予非可空类型,就会抛出InvalidOperationException类型的
//异常。这就是进行显式转换时需要类型转换运算符的原因。
int?x1=GetNullableType();
int y1=(int)x1;

//如果不进行显式类型转换,还可以使用接合运算符从可空类型转换为非可空类型。接合运算符的语法是??,为转换定义了一个默认值,以防止可空类型
//的值是null。这里,如果x1是null,y1的值就是0.
int?x1=GetNullableType();
int y1=x1??0;
You can reach me by surfing the web ---- huntjobs.cn,or sending e-mails to me,Here is my qq MailBox:1424870395@qq.com
原文地址:https://www.cnblogs.com/HedgehogBlog/p/3539772.html