简介
在C#中的一些修饰符以及特殊符号的使用,也都是从C与C++中继承的特性,比如'?'和"?:",当然在C#中还加入了"??"符号,这些符号的作用具有较大的区别,可以简化程序编写时候的语句长度和行数,或者实现一些正常情况下不被编译器允许的功能。
目录
?: 三元运算符
说明
这一个符号的用法,主要是简化一个判断和返回数值的语句,功能上与if else一致,基本的格式是
判断语句?True返回值:False返回值
需要注意的是,三元运算符可能遇到数据转换的问题,这里引用一下关于三元运算符数据转换的说明
三元操作符类型的转换规则: 若两个操作数不可转换,则不做转换,返回值为Object类型。 若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字来转换,int类型转换为long类型,long类型转换为float类型等。 若两个操作数中有一个是数字S,另外一个是表达式,且其类型标示为T,那么,若数字S在T的范围内,则转换为T类型;若S超出了T类型的范围,则T转换为S类型
例子
判断输入的参数x是否小于参数y的表达式
static void Main(string[] args)
{
Func<int,int,string> isGreat = (x,y) => x > y ? "Yes":"No";
Console.WriteLine("Is great? :{0}",isGreat(10,20));
Console.ReadLine();
}
? 可空类型修饰符
说明
这一个符号主要是让一些不能为null的值表示为null,比如说通常情况下,任何非集合类,地址类的数据类型都不可以为null,比如int,float,在初始化的情况下,如果不赋值也不为null,若强制赋null则编译器会报错。
可空类型修饰符可以将这一个情况解决,提供能让一般值类型也能够空的方法。
例子
可以看到这一个简单的例子中,编译器报错,因为string类型是引用——符号代表的是内存地址,而这里int类型不是
在这里的位置,可以看到在int声明后增加了一个?符号,此时编译器就不会报错,可以允许int类型为null
static void Main(string[] args)
{
string str = null;//不出错
int? i = null;//编译器出错,不可为null的值类型
Console.WriteLine(str==null?"str is null":"str not null");
Console.WriteLine(i == null ? "i is null" : "str not null");
}
经过修改后编译运行得到的最终结果
?? 空合并运算符
说明
空合并运算符是在C#中比较新鲜的一个运算符,他的方法是判断是否是null并返回值,需要注意的是,在多个??一起出现在一行代码中的时候他的操作是从右往左进行的。如果运算符??左侧的值是null则返回右侧的值,如果左侧的值不为null则返回左侧值
例子
这里在一段程序里面设置了三个变量,前两个是字符串
static void Main(string[] args)
{
string str = null;//不出错
string str2 = null;
int j = 10;
Console.WriteLine(str??"is null"); //因为str为空所以返回is null
Console.WriteLine(str2??"12"??j.ToString()); //因为从右侧往左运算所以最终返回12
Console.ReadLine();
}
最终的结果