在学习面向对象的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()