下面将介绍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
注意:sizeof 一般用来获取基本类型的所占字节数,扩展:基本类型(整数,浮点数(decimal 去除),字符类型,布尔类型)
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();
7、空值传播运算符(?.)用来判断 类 的对象是否为空,为空返回空,否则返回 对应的 字段 或 属性 值。
注意:当结果为空或其他的话,使用空值传播运算符更加方便,常用于方法的参数判定和赋值。
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;
}
运算符的优先级:
点击打开链接