第十一天:
6.9结构比较
数组和元组都实现接口IStructuralEquatable和IStructuralComparable,这两个接口不仅可以比较引用,还可以比较内容
略
第七章:运算符和类型强制转换
7.1略
7.2运算符
7.2.1运算符的简化操作
1 条件运算符
?:三元运算符
2 checked和unchecked运算符
如果把一个代码块标记为checked,CLR就会执行溢出检查,如果发生溢出,就抛出OverflowException异常。
如果要禁止溢出检查,则可以把代码标记为unchecked
使用:如checked{……}
3 is运算符
is运算符可以检查对象是否与特定的类型兼容。“兼容”表示对象或者是该类型,或者派生自该类型。
4 as运算符
as运算符用于执行引用类型的显式转换,如果要转换的类型与指定的类型兼容,转换就会成功,如果不兼容,as运算符就会返回null值。
5 sizeof运算符
使用sizeof运算符可以确定栈中值类型需要的长度(单位是字节):
如果对于复杂类型(和非基本类型)使用sizeof运算符,就需要把代码放在unsafe块中:
unsafe{
Console.WriteLine(sizeof(Customer));
}
6 typeof运算符
typeof运算符返回一个表示特定类型的System.Type对象。以后会述。
7 可空类型和运算符
例:
int? a=null;
int? b=a+4;//b=null;
int? c=a*5;//c=null;
比较可空类型时,只要有一个操作数是null,比较的结果就是false,即不能因为一个条件是false,就认为该条件的对立面是true,这在使用非可空类型的程序中很常见
8 空合并运算符 ??
这个运算符放在两个操作数中间,第一个操作数必须是一个可空类型或引用类型,第二个操作数必须与第一个操作数的类型相同,或者可以隐式地转换为第一个操作数的类型。
如果第一个操作数不是null,整个表达式就等于第一个操作数的值
如果第一个操作数是null,整个表达式就等于第二个操作数的值
7.2.2运算符的优先级
略
7.3类型的安全
7.3.1类型转换
1隐式转换
byte value1=10;
byte value2=23;
long total;
total=value1+value2;
Console.WriteLine(total);
只能从较小的整数类型隐式地转换为较大的整类型。
也可以在整数和浮点数之间转换。
2显式转换
下面是不能进行隐式转换的例子:
int转换为short
int转换为uint
unt转换为int
float转换为int
任何数字类型转为char
int?转为int
显式转换使用C语言风格,即(cast)这种。
使用这种,不会报错,也可能得不到期待的结果。
所有的显式类型强制转换都可能不安全,在应用程序中应包含代码来处理可能失败的类型转换。
如果是数字与字符串之间的转换,可使用在Object类中的ToString()方法,如
int i=10;
string s=i.ToString();
字符转数字
string s="100";
int i=int.Parse(s);
不能转的话抛异常
7.3.2装箱和拆箱
string s=10.ToString();
装箱用于描述一个值类型转换为引用类型,上为隐式进行,下为显式进行
int myIntNumber=20;
object myObject=myIntNumber;
拆箱用于描述相反过程,其中以前装箱的值类型强制转换为值类型
int myIntNumber=20;
object myObject=myIntNumber;
int mySecondNumber=(int)myObject;
在拆箱时,必须非常小心,确保得到的值变理有足够空间存储拆箱的值中的所有字节。
(172,1517-172=1445,2014.12.12)
6.9结构比较
数组和元组都实现接口IStructuralEquatable和IStructuralComparable,这两个接口不仅可以比较引用,还可以比较内容
略
第七章:运算符和类型强制转换
7.1略
7.2运算符
7.2.1运算符的简化操作
1 条件运算符
?:三元运算符
2 checked和unchecked运算符
如果把一个代码块标记为checked,CLR就会执行溢出检查,如果发生溢出,就抛出OverflowException异常。
如果要禁止溢出检查,则可以把代码标记为unchecked
使用:如checked{……}
3 is运算符
is运算符可以检查对象是否与特定的类型兼容。“兼容”表示对象或者是该类型,或者派生自该类型。
4 as运算符
as运算符用于执行引用类型的显式转换,如果要转换的类型与指定的类型兼容,转换就会成功,如果不兼容,as运算符就会返回null值。
5 sizeof运算符
使用sizeof运算符可以确定栈中值类型需要的长度(单位是字节):
如果对于复杂类型(和非基本类型)使用sizeof运算符,就需要把代码放在unsafe块中:
unsafe{
Console.WriteLine(sizeof(Customer));
}
6 typeof运算符
typeof运算符返回一个表示特定类型的System.Type对象。以后会述。
7 可空类型和运算符
例:
int? a=null;
int? b=a+4;//b=null;
int? c=a*5;//c=null;
比较可空类型时,只要有一个操作数是null,比较的结果就是false,即不能因为一个条件是false,就认为该条件的对立面是true,这在使用非可空类型的程序中很常见
8 空合并运算符 ??
这个运算符放在两个操作数中间,第一个操作数必须是一个可空类型或引用类型,第二个操作数必须与第一个操作数的类型相同,或者可以隐式地转换为第一个操作数的类型。
如果第一个操作数不是null,整个表达式就等于第一个操作数的值
如果第一个操作数是null,整个表达式就等于第二个操作数的值
7.2.2运算符的优先级
略
7.3类型的安全
7.3.1类型转换
1隐式转换
byte value1=10;
byte value2=23;
long total;
total=value1+value2;
Console.WriteLine(total);
只能从较小的整数类型隐式地转换为较大的整类型。
也可以在整数和浮点数之间转换。
2显式转换
下面是不能进行隐式转换的例子:
int转换为short
int转换为uint
unt转换为int
float转换为int
任何数字类型转为char
int?转为int
显式转换使用C语言风格,即(cast)这种。
使用这种,不会报错,也可能得不到期待的结果。
所有的显式类型强制转换都可能不安全,在应用程序中应包含代码来处理可能失败的类型转换。
如果是数字与字符串之间的转换,可使用在Object类中的ToString()方法,如
int i=10;
string s=i.ToString();
字符转数字
string s="100";
int i=int.Parse(s);
不能转的话抛异常
7.3.2装箱和拆箱
string s=10.ToString();
装箱用于描述一个值类型转换为引用类型,上为隐式进行,下为显式进行
int myIntNumber=20;
object myObject=myIntNumber;
拆箱用于描述相反过程,其中以前装箱的值类型强制转换为值类型
int myIntNumber=20;
object myObject=myIntNumber;
int mySecondNumber=(int)myObject;
在拆箱时,必须非常小心,确保得到的值变理有足够空间存储拆箱的值中的所有字节。
(172,1517-172=1445,2014.12.12)