下面将介绍C#中的常用到的运算符:条件运算符,is 运算符,as 运算符,sizeof 运算符,typeof 运算符,空合并运算符,空值传播运算符。
1、条件运算符( ?: )
条件运算符也称作三元运算符,是if..else 的简化形式,其名称的出处是他带有三个操作数。他首先判断一个条件,如果条件为真,返回第一个值,否则返回第二个值。恰当的使用三元运算符可以使程序更加简洁。
形式: condition ? true_value:false_value ,如:int a = c > 0 ? c -1:c+1;
// 一个方法,返回值是 int 类型,参数是 可空类型 int?,该方法用来判断参数是否为空,不为空返回 +1 值,否则返回 0 public int GetNum(int? a) { // 1. 使用if...else if(a != null) { return (int)a + 1; } else { return 0; } // 2.使用三元运算符 return a != null ? (int)a + 1 : 0; }
2、is 运算符
is 运算符用来判断变量是否是特定的类型或者是派生自该类型,是返回 true,否则返回 false。
int a = 1; // int 类型不是 long 类型,也不派生自 long 类型 bool type = a is long; // false // int 类型是 int 类型,派生自 object 类型 bool type1 = a is object; // true bool type2 = a is int; // true
上面只是简单的示例,下面是较复杂的,扩展:uint( 范围:0 ~ 2^32 - 1 ),long( 范围:-2^63 ~ 2^63 -1 ),ulong( 范围:0 ~ 2^64 -1 )
// 50 是一个整数,如果没有显示声明的话(用小写或大写字母: u 和 U 代表 uint ,l 和 L 代表 long),默认是 int object a1 = 50; // 特殊情况:int 类型的最大整数值是 2^31 - 1 = 2147483647,超过这个范围,会依次按照(uint,long,ulong)的范围去定义类型 object a2 = 2147483648; bool type3 = a1 is int; // true bool type4 = a2 is uint; // true
3、as运算符
as 运算符用于将引用类型的显示转换,如果要转换的类型是原类型或者是派生自原类型,则转换成功,否则返回 null。
注意:
(1)、as 运算符只能用于引用类型;
(2)、如果转换不成功会返回 null。
object a = "str"; object b = 5; // a 是 string 类型隐式转换成的 object 类型,as 转换成功 string c = a as string; // string // b 是 int 类型隐式转换成的 object 类型,as 将他转换成 string 类型,返回 null string c1 = b as string; // null
4、sizeof 运算符用于返回栈中值类型所需长度(单位:字节)。
// int 是 32 位的,占 4 个字节,1 个字节是 8 位 int a = sizeof(int); // 4
5、typeof 运算符用于返回 指定类型的 System.Type 对象,常用于反射。
注意:typeof 和 GetType() 有相同的作用,区别是:typeof 的参数是 类型,GetType() 的参数是类型的变量
// typeof 的参数是类型,GetType() 方法通过类型的变量调用 Type a = typeof(AAA); AAA aa = new AAA(); Type b = aa.GetType();
6、空合并运算符(??)用于引用类型或是可空类型,返回一个非空的值,当第一个操作数不为空的时候返回第一个,否则返回第二个。
注意:空合并运算符只用于判断 引用类型 和 可空类型 并返回一个非空的值。
// 可空类型的变量 a int? a = null; // 当 a 不为空的时候,?? 将 a 显示转换成了 int 类型并赋值给 b,否则 b = 0; int b = a ?? 0; AAA c = new AAA(); AAA d = c ?? new AAA();
注意:当结果为空或其他的话,使用空值传播运算符更加方便,常用于方法的参数判定和赋值。
public class AAA { public static int GetNum(BBB aaa) { int result = 0; if(aaa != null) { // aaa 不为空的时候判断他的字段 bbb 是否为空,不为空返回 bbb 的 字段 ccc 的值,否则返回 0 result = aaa.bbb != null ? aaa.bbb.ccc:0; } return result; } public static int GetNum1(BBB aaa) { // 按照运算符的优先级,相同的运算符是左关联的(从左到右计算) int result = (aaa ?.bbb?.ccc) ?? 0; return result; } } public class BBB { // 包含 CCC 类的一个变量 bbb public CCC bbb; } public class CCC { // 一个 int 类型的变量 ccc public int ccc = 1; }
出处:https://blog.csdn.net/cloproad/article/details/78923363