C#语法:int?类型?.运算符和? ?运算符的用法

在学习面向对象的C++语法,常常只是学习过?:的三元运算符,用于条件判断和赋值

三元运算符有三个操作数:

<test> ? <resultIfTrue> : <resultIfFalse>

其中,计算<test>可得到一个布尔值,运算符的结果根据这个值确定是<resultIfTrue>,还是<resultIfFalse>

使用三元运算符可以测试int变量myInteger的值:

string resultString = (myInteger < 10) ? "Less than 10" : "Greater than or equal to 10";

三元运算符的结果是两个字符串中的一个,这两个字符串都可能赋给resultString。把哪个字符串赋给resultString,取决于myInteger的值与10的比较。

如果myInteger的值小于10,就把第一个字符串赋给resultString;

如果myInteger的值大于或等于10,就把第二个字符串赋给resultString。

而C#中的int ? 类型、??运算符和?.运算符则意义在于可空类型

这一语法点属于泛型

大多数的值类型都是必须包含一个值,比如int、double和所有的结构。

而有时让值类型为空是非常有用的,尤其在处理数据库时,泛型使用System.Nullable<T>类型提供了使值为空的一种方式。

如:代码声明了一个变量nullableInt,它可以拥有int变量能包含的任意值,还可以拥有值null。所以可以使变量赋值为null。

System.Nullable<int> nullableInt;

nullableInt = null;

如果nullableInt是一个int类型的变量,上面的代码时不能编译的。

前面的赋值等价于:

nullableInt = new System.Nullable<int>();

 声明可控类型的变量不使用上述语法,而是使用下面的语法

int ? nullableInt;

 int ? 是 System.Nullable<int>的缩写。

int ? 和 int 类型是不一样的,运算时需要进行显示转换,但如果op1为null,会生成System.InvalidOperationException类型的异常

int ? op1 = 5;
int result = (int)op1 * 2;

 ?? 运算符:空接合运算符:一个二元运算符,允许给可能等于 null 的表达式提供另一个值

如果第一个操作数不是 null,该运算符就等于第一个操作数, 否则,该运算符就等于第二个操作数。

以下两个表达式的作用相同的: op1 可以是任意可空表达式

op1 ?? op2 
op1 == null ? op2 : op1 

以下示例:op1为null,所以op1*2也是null;但??运算符检测此情况,把值5赋予result;在结果中放入int类型的变量result不需要显式转换。??运算符会自动处理这个转换。

int ? op1 = null;
int result = op1 * 2 ?? 5;

还可以把??等式的结果放在int ?中:

int ? result = op1 * 2 ?? 5;

?.运算符:Elvis 运算符或空条件运算符

如果想得到给定客户的订单数,就需要在设置计数值之前检查空值:

int count = 0;

if(customer.order ! = null)

{

count = customer.orders.Count();

}

如果客户没有订单(即为 null),使用?.运算符,会把 int? count 设置为 null, 而不是抛出一个异常:

int ? count = customer.orders?.Count();

可在结果是 null 时设置一默认值:

int ? count = costumer.orders?.Count() ?? 0; 

如果 costumer.orders?.Count()值为 null, count 的值为 0;

如果不为 null, count 的值为 costumer.orders?.Count()


版权声明:本文为dlwlrma_516原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。