首页 > 代码库 > C#学习笔记 ----运算符和强制类型转换

C#学习笔记 ----运算符和强制类型转换

运算符

算术运算符  +- */%

逻辑运算符  & | ^ ~ && || !

字符串连接运算符  +

增量和减量运算符  ++ --

移位运算符  << >>

比较运算符  == != <> <= >=

赋值运算符  = += -= *= /= %= &= |= ^= <<= >>=

成员访问运算符  .

索引运算符  []

类型转换运算符  ()

条件运算符(三元运算符)  ?:

委托连接和删除运算符  + -

对象创建运算符  new

类型信息运算符  sizeof is typeof as

溢出异常控制运算符  checked unchecked

间接寻址运算符  []

名称空间别名限定符  ::

空合并运算符  ??

 

简化赋值运算符

x++,++x  x=x+1x--,--x x=x-1x+=y x=x+yx-=y x=x-yx*=y x=x*yx/=y x=x/yx%=y x=x%yx>>=y x=x>>yx<<=y x=x<<yx&=y x=x&yx|=y x=x|y
int x=5;if(++x == 6)//true ----x is incremented to 6 before the evaluation{    Console.WriteLine("This will execute");}if(x++ == 7)//false ----x is incremented to 7 after the evaluation{    Console.WriteLine("This won‘t");}

 

代码块标记为checked,CLR就会执行溢出检查,如果发生溢出,就抛出OverflowException异常

byte b = 255;checked{    b++;}Console.WriteLine(b.ToString());

禁止溢出检查,标记为unchecked

 

is运算符 可以检查对象是否与特定的类型兼容

int i = 10;if (i is object){    Console.WriteLine("i" is an object");}

 

as运算符用于执行引用类型的显示类型转换

如果要转换的类型与制定的类型兼容,转换就会成功进行;如果类型不兼容,as运算符就会返回null值。

object o1 = "Some String";object o2 = 5;string s1 = o1 as string;//s1 = "Some String"string s2 = o2 as string;//s2 = null;

 

sizeof运算符 可以确定栈中值类型需要的长度(单位是字节)

Console.WriteLine(sizeof(int));

 

typeof运算符 返回一个表示特定类型的System.Type对象

 

空合并运算符?? 提供了一种快捷方式,可以在处理可空类型和引用类型时表示null可能的值

 

在负责的表达式中,应避免利用运算符优先级来生成正确的结果。使用圆括号指定运算符的执行顺序,可以使代码整洁,避免出现潜在冲突。

 

隐式转换

只要保证值不会发生变化,类型转换就可以自动(隐式)进行

 

显示转换

类型强制转换

long val = 30000;int i = (int)val; //A valid cast.The maximum int is 2147483647

所有预定义值类型都支持Parse()方法

 

装箱和拆箱可以把值类型转换为引用类型,并把引用类型转换为值类型

 

引用类型的相等性:ReferenceEquals() 和俩个版本的Equals()、比较运算符(==)

 

比较值类型相等性时,采用与引用类型相同的规则:ReferenceEquals()用于比较引用,Equals()用于比较值,比较运算符可以看作一个中间项

 

运算符重载

运算符重载的声明方式与方法相同,但operator关键字告诉编辑器,它实际上是一个自定义的运算符重载,后面是相关运算符的实际符号。

C#要求所有的运算符重载都声明为public 和static

struct Vector{public double x,y,z;public Vector(double x,doubley,double z){    this.x = x;    this.y = y;    this.z = z;}public Vector(Vector rhs){    x = rhs.x;    y = rhs.y;    z = rhs.z;}public override string ToString(){    return "("+x+","+y+","+z+")";}public static Vector operator +(Vector lhs,Vector rhs){    Vector result = new Vector(lhs);    result.x += rhs.x;    result.y += rhs.y;    result.z += rhs.z;    return result;}//测试Vector结构static void Main(){    Vector vect1,vect2,vect3;    vect1 = new Vector(3.0,3.0,1.0);    vect2 = new Vector(2.0,-4.0,-4.0);    vect3 = vect1 +vect2;    Console.WriteLine("vect1 = " + vect1.ToString());    Console.WriteLine("vect2 = " + vect2.ToString());    Console.WriteLine("vect3 = " + vect3.ToString());}

 

C#语言要求成对重载比较运算符。即,如果重载了“==”,就必须重载“!=”

 

用户定义的强制类型转换

C#允许进行俩种不同数据类型的强制转换:隐式强制转换和显式强制转换

类型强制转换必须同时声明为public 和static

 

struct Currency{    public uint Dollars;    public ushort Cents;        public Currency(uint dollars,ushort cents)    {        this.Dollars = dollars;        this.Cents = cents;    }    public override string ToString()    {        return string.Format("${0}.{1,-2:00}",Dollars,Cents);    }        //隐式    public static implicit operator float(Currency value)    {        return value.Dollars + (value.Cents/100.0f);    }    //显式    public static explicit operator Currency(float value)    {        checked        {            uint dollars = (uint)value;            ushort cents = (ushort)((value - dollars)*100);            return new Currency(dollars,cents);        }    }}

 

定义不同结构或类的实例之间的类型强制转换是完全合法的,但有俩个限制:

.如果某个类派生自另一个类,就不能定义这俩个类之间的类型强制转换(这些类型的类型转换已经存在)

.类型强制转换必须在源数据类型或目标数据类型的内部定义

 

装箱和拆箱数据类型强制转换

 

多重类型强制转换

C#学习笔记 ----运算符和强制类型转换