C#中的问号

本人转载自:

http://msdn.microsoft.com/zh-cn/practices/dd391752.aspx

http://jhxk.iteye.com/blog/439888

在C# 中有个较为重要,而常被一些人忽视的符号—— 问号(? )。在这里整理一下它在C# 的几种情况:

1.     可空类型修饰符“T?” : 可空类型的基础类型可以是任何非可空值类型或任何具有struct 约束的类型参数(Nullable是.NET 2.0中新提供的一种用于标明一个值类型是否可以为空的技术。值类型后面加问号表示可为空null(Nullable 结构)),但不能是可空类型或引用类型。例如:int? 代表是可空的整形,而int?? 则是无效类型。即可空类型可以表示其基础类型的所有值和一个额外的空值。语法T? 是System.Nullable<T> 的缩写形式。可空类型具有一个HasValue 的bool 类型只读属性,当可空类型实例的该属性为true 时,则表示该实例是非空实例,包含一个已知值Value;HasValue 为false 时,访问Value 属性将导致System.InvalidOperationException 。可空类型T? 具有一个类型为T 的单个参数的公共构造函数,如new int?(123) 将获得一个值为123 的int? 类型实例。从T? 到由T 实现的任何接口都存在装箱转换,并且从由T 实现的任何接口都存在到T? 的拆箱转换。但是任何情况下可空类型都不满足接口约束,即使基础类型实现了该特定接口。

对于一个类型,如果既可以给它分配一个值,也可以给它分配空引用null(表示没有任何值),我们就说这个类型是可空的。
  因此,可空类型可表示一个值,或表示不存在任何值。例如,类似 String 的引用类型就是可空类型,而类似 Int32 的值类型不是可空类型。Nullable 结构支持将值类型扩展为可以为null,但不支持在引用类型上使用,因为引用类型本身就是可空的。
  因为值类型的容量只够表示适合于该类型的值,因此它不可为空;值类型没有表示空值所需的额外容量。

例:public int? age;

等同 Nullable<int>
  在 int 的基础上加入一个空值
  设置值的写法 Arg = 22;
  获取值的写法 Arg.Value;
  判断非空的写法 Arg.HasValue

Age是一个属性,它的值是可空的整形值。也就是说类的age成员有可能是空的,没有初始化过。使用的时候需要对Age的返回值进行判断:
if (Age.HasValue)
    i = Age.Value;
else
    i = 0;

2.     条件运算符“x ? y : z” : “x ? y : z” 的意思大部分程序员应该都熟悉,稍微啰嗦一下:) 如果表达式x 为true ,则计算y ;如果x 为false ,则计算z 。省却if{}else{} 的简单形式了。

3.     空合并运算符“??” : 该运算符是在泛型出现后,C# 词法语法中新增加的标记,同时出现的还有一个“::” (命名空间别名限定符)。形式为“a??b” 的空合并表达式要求a 为可空类型或引用类型 。如果a 为非空则表达式“a??b” 返回的结果为a ;否则返回b 。空合并运算符为 右 结合运算符 ,即操作时从右向左进行组合的。如,“a??b??c” 的形式按“a??(bb??cc)” 计算。

曾有人说过“ 细节决定胜负” ,我们程序员应该更好的把握编程语言的细节才能更好的保证软件质量。

时间: 2024-11-07 07:35:38

C#中的问号的相关文章

[我的疑问]String? = &quot;Skiy Chan&quot; 中的问号是什么意思?

1 var optionalName : String? = "Skiy Chan" String? = "Skiy Chan" 中的问号是什么意思?目前还在看api和视频教程,暂时还没弄懂这个意思.特别是api中的那串代码: var optionalString : String? = "Hello" optionalString == nil var optionalName : String? = "Skiy Chan"

python中的问号表达式

我们知道C语句中存在问号表达式,例如下面: a=2>1? 10: -10; 那么,Python脚本语言中是否也存在类似的问号表达式呢?答案是肯定的.而且存在两种方式. 方式1:使用if else实现 如下例: b = 5 a = 2 if b == 4 else 1 print a 方式2:使用逻辑运算符实现 如下例: b = 5 a = b == 4 and 2 or 1 要注意:使用逻辑运算时要保证and后面的变量值不能为非,否则会出错. 提示 python中的and和or和其它语言的区别很

地址栏中的问号有什么作用

比如这样的链接: http://www.xxx.com/Show.asp?id=77&nameid=2905210001&page=1 在这样的链接中,问号的含义不是上面文章中所提到的版本号问题,而是传递参数的作用.这个问号将show.asp文件和后面的id.nameid.page等连接起来. 除此之外,链接中的问号还有一个作用,就是清除缓存的作用. 比如这样的链接: http://www.xxxxx.com/index.html 和 http://www.xxxxx.com/index.

国际化测试中的问号,方块和乱码的原因

问号,方块和乱码的问题在国际化测试中很常见,为免自己忘记了,记下来,备忘. 显示方框是因为你的程序没有合适的字体. 问号是从Unicode到ANSI的转换不对.问号?的产生是因为Unicode到代码页转换失败. 乱码是CodePage对应的不对,1,系统或者软件缺少对应的字符编码,需要安装对应的字符编码表.2.二进制码进入计算机后被各种不同编码解释为不同符号.所以打开文件必须先知道编码方式.如果选择错误的代码页,就会显示乱码. 常见的BIG5和GB2312,中文,韩文显示问号?的产生是因为Uni

C#中一个问号和两个问号(a ?? b)的作用

不卖关子,直接开门见山: C#中两个问号的作用是判断??左边的对象是否为null,如果不为null则使用??左边的对象,如果为null则使用??右边的对象. 比如:a = b ?? c,如果b为null,则a = c,如果b不为null,则a = b. 下面一段代码演示了这两种情况: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 static void Main(string[] args) {     NewFuck();     Shit

C#语法中一个问号(?)和两个问号(??)的运算符是什么意思?

(1).C#语法中一个个问号(?)的运算符是指:可以为 null 的类型. MSDN上面的解释: 在处理数据库和其他包含不可赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型以及日期类型的功能特别有用.例如,数据库中的布尔型字段可以存储值 true 或 false,或者,该字段也可以未定义. (2).C#语法中两个问号(??)的运算符是指null 合并运算符,合并运算符为类型转换定义了一个预设值,以防可空类型的值为Null. MSDN上面的解释: ?? 运算符称为 null 合并运算符

C#语法中一个问号(?)与两个问号(??)有什么区别

(1).C#语法中一个个问号(?)的运算符是指:可以为 null 的类型. MSDN上面的解释: 在处理数据库和其他包含不可赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型以及日期类型的功能特别有用.例如,数据库中的布尔型字段可以存储值 true 或 false,或者,该字段也可以未定义. (2).C#语法中两个问号(??)的运算符是指null 合并运算符,合并运算符为类型转换定义了一个预设值,以防可空类型的值为Null. MSDN上面的解释: ?? 运算符称为 null 合并运算符

java中的问号与冒号? : 表达式

A:布尔表达式(真/假),B:执行语句 ,C :执行语句 最直观的: A ? B :C (如果A为真执行B否则执行C) android中的一段代码 return mData != null ? mData.size() : 0; return 代表返回 得出结果后 依靠它将数据返回给上层方法进行计算 (如果不懂只需要知道它代表意思:返回 发送)时间久了就懂了 如果(A)mData 不等于 null(空) 条件为真执行 B 获取mData的数量 mData.size 如果 (A)mData 等于

C# 中 双问号??的用法

int? x = null;int y = x ?? -1; 这里的y不能为null,但是等于x,x为null时赋值给y会报错.?? 可以在x==null时对y赋值-1 更多相关资料:https://msdn.microsoft.com/zh-cn/library/ms173224(VS.80).aspx