《csharp高级编程》 学习笔记 第六章 运算符和类型强制转换

第6章 运算符和类型强制转换
6.1 运算符
c和c++开发人员应很熟悉大多数。在这只记录一些不熟悉的。
(1).checked和unchecked运算符
byte b = 255;
checked
{
b++;
}
Console.WriteLine(b.ToString());
如果发生溢出,就抛出异常。
(2)is运算符
检查对象是否与特定的类型兼容。
"兼容"表示对象是该类型,或者派生于该类型。
int i = 10;
if (i is object)
{
Console.WriteLine("i is an object");
}
(3)as运算符
用于执行引用类型的显示类型转换。
如果要转换的类型与指定的类型兼容,转换就会成功进行。
如果不兼容,返回值null。
object o1 = "Some String";
object o2 = 5;
string s1 = o1 as string; //s1 = "Some String"
string s2 = o2 as string; //s1 = null
(4)sizeof运算符
注意:
只能在不安全的代码中使用sizeof运算符。
不安全的代码将在12章详细讨论。


(5)可空类型和运算符
对于布尔类型,可以指定true和false值。
但是如果要定义为undefined,则需要使用可空类型。
此时可空类型可以给应用程序提供一个独特的值。
通常可空类型与一元或二元运算符一起使用时,如果其中一个操作数或两个操作数都是null,其结果就是null。
例如:
int? a = null;
int? b = a + 4; // b = null
int? c = a * 5; // c = null
但是在比较可空类型时,只要有一个操作数是null,比较的结果就是false。
(6)空接合运算符
空接合运算符(??)放在两个操作数之间。
第一个操作数必须是一个可空类型或引用类型。
第二个操作数必须与第一个操作数的类型相同,或者可以隐含地转换为第一个操作数的类型。


空接合的计算如下:
如果第一个数不是null,则整个表达式值为第一个数。
如果是null,则等于第二个数。
int? a = null;
int b;
b = a ?? 10; // b has the value 10
a = 3;
b = a ?? 10; // b has the value 3


6.2 类型的安全性
IL可以对其代码强制加上强类型安全性。
因为csharp会编译为IL,所以它也是强类型的。
这说明数据类型并不是粽是可互换的。


6.2.1 类型转换
1. 隐式转换方式
只要能保证值不会发生任何变化,类型转换就可以自动进行。
2. 显示转换方式
long val = 30000;
int i = (int)val; // A valid cast.


字符串和整数的相互转换
int i = 10;
string s = i.ToString();


string s = "100";
int i = int.Parse(s);


6.2.2. 装箱和拆箱
string s = 10.ToString();
对于这句话,我们应该会有疑问,int不过是堆栈上一个4字节的值,是如果在它上面调用方法?
其实这个实现方式成为装箱(boxing)。


装箱和拆箱(unboxing)可以把值类型和引用类型互相转换。
装箱由于描述把一个值类型转换为引用类型。
运行库上会为堆上的对象创建一个临时的引用类型“box”。
int myIntNumber = 20;
object myObject = myIntNumber; // Box the int
int mySecondNumber = (int)myobject; // Unbox it back into an int


6.3 对象的相等比较


6.3.1引用类型的相等比较
System.Object定了三个不同的方法来比较对象的相等性。
1. ReferenceEquals()方法
此方法是一个静态方法,不能重写。
测试两个引用是否指向类的同一个实例。
即两个引用是否包含内存中的相同地址。
2. 虚拟的Equals()方法
因为这个方法是虚拟的,所以可以在自己的类中重写它。
3.静态的Equals()方法
作用与虚拟实例版本相同。
4.比较运算符==
大多数情况下,比较引用。
如果要把一些类看做值,其含义就会比较直观。
此时最好重写比较运算符。
一个显著的例子是System.String类。


6.3.2 值类型的相等比较


6.4 运算符重载
c++开发人员已经很熟悉。


6.5 用户定义的数据类型转换


public static implicit operator float (Currency value)
{
// processing
}
c++开发人员应注意,这种情况与c++是不同的。
在c++中,数据类型转换是类的实际成员。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值