博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#运算符几点小结
阅读量:7071 次
发布时间:2019-06-28

本文共 1905 字,大约阅读时间需要 6 分钟。

c#主要支持下面所示的运算符:

ContractedBlock.gif
Code
比较不常用却又很重要的运算符:

1、is运算符和as运算符

is运算符可以检查对象是否与特定的类型兼容。比如下例中要检查变量是否与object类型兼容:

int
 i
=
0
;
if
(i 
is
 
object
)
{
  Console.WriteLine(
"
i is an object.
"
);
}
as运算符用于执行引用类型的显式类型转换。如果要转换的类型和指定的类型兼容,转换就会成功进行;如果类型不兼容,as运算符就会返回值null。举例如下:

object
 obj1
=
"
a string
"
;
object
 obj2
=
5
;
string
 str1
=
 obj1 
as
 
string
;
//
 str1="a string";
string
 str2
=
 obj2 
as
 
string
;
//
str2=null;
注:as运算符允许在一步中进行安全的类型转换,不需要先使用is运算符测试类型,再执行转换。

2、checked和unchecked运算符

有如下的代码:

byte
 b
=
255
;
b
++
;
Console.WriteLine(b.ToString());
byte数据类型只能包含0~255的数,所以b值的增量会溢出。CLR如何处理溢出?C#提供了checked和unchecked运算符。如果把一块代码段标志为checked,CLR就会执行溢出检查,如果发生异常,就抛出异常。

byte
 b
=
255
;
checked
{
  b
++
//
抛出OverflowException
}
Console.WriteLine(b.ToString());
如果要禁止溢出检查,可以把代码标记为unchecked:

byte
 b
=
255
;
unchecked
{
  b
++
;
}
Console.WriteLine(b.ToString());
在上述代码中,不会抛出异常,但会丢失数据,因为byte数据类型不能包含256位,溢出的位会丢失,b变量得到的值是0.

注:unchecked是默认值。只有在需要把几个未检查的代码行放在一个明确标记为checked的大代码块中,才需要显式使用unchecked关键字。

3、sizeof运算符

学过c的都知道,sizeof可以用来确定堆栈中值类型需要的长度(单位是字节):

unsafe
{
  Console.WriteLine(
sizeof
(
int
));
//
结果为4,因为int有四个字节,32位  
}
4、可空类型和运算符

如果在程序中使用可空类型,就必须考虑null值在与各种运算符一起使用时的影响。通常可空类型与一元或二元运算符一起使用时,如果其中一个操作数或两个操作数都是null,其结果就是null。

int
?
=
 
null
;
int
?
=
 a
+
4
//
b=null;
int
?
=
 a
*
2
//
c=null;
注意,在比较可空类型时,只有有一个操作数是null,比较的结果就是false。即不能认为因为一个条件是false,那么它的对立面就是true。

int
?
a
=
null
;
int
?
b
=
10
;
if
(a
>=
b) 
//
空值a显然不能和b比较
  Console.WriteLine(
"
a>=b
"
); 
else
  Console.WriteLine(
"
a<b
"
);
5、空接合运算符(??)

空接合运算符为处理可空类型和引用类型时表示Null值的可能性提供了一种快捷方式。这个运算符放在两个操作数之间,第一个操作数必须是一个可空类型或引用类型,第二个操作数必须与第一个操作数的类型不同,或者可以隐含地转换为第一个操作数的类型。空接合运算符的计算如下:如果第一个操作数
不是null
,则整个表达式就等于第一个操作数的值。但如果第一个操作数
是null
,则整个表达式就等于第二个操作数的值。例如:

int
?
a
=
null
;
int
 b;
b
=
a
??
10
//
 b的值为10;
a
=
15
;
b
=
a
??
10
;
//
  b的值为15;

注意:如果第二个操作数不能隐含地转换为第一个操作数的类型,就生成一个编译错误。

本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/archive/2009/05/02/1444067.html,如需转载请自行联系原作者

你可能感兴趣的文章
Elasticsearch の 初体验|一文了解她
查看>>
聊聊flink的Triggers
查看>>
自建最轻量的react+webpack+es6架构
查看>>
聊聊reactor extra的retry
查看>>
reactor-netty中HttpClient对TcpClient的封装
查看>>
数据库安全性操作——操作原则及SQL注入
查看>>
Java网络爬虫实操(9)
查看>>
前面有一个Redux,我们去撩(聊)一下它。
查看>>
iOS开发证书"此证书的签发者无效"解决方法
查看>>
Python实现的通用树结构,支持节点索引,常数时间查找
查看>>
网络传输协议
查看>>
iOS Principle:Category
查看>>
Java多线程之synchronized增强版——ReentrantLock
查看>>
MVP设计模式应该这样掌握
查看>>
Git标签的管理和配置命令别名
查看>>
对UIView,UIWindow和CALayer的理解
查看>>
使用javap分析Java的字符串操作
查看>>
Node.js-Koa2-MongoDB构建RESTful Api
查看>>
饿了么UETool原理初探
查看>>
Android基础 和服务器交互你必须知道的json处理
查看>>