• C#高级编程 (第六版) 学习 第六章:运算符和类型强制转换


    第六章 运算符和类型强制转换

    1,运算符

    类别

    运算符

    算术运算符

    + - * / %

    逻辑运算符

    & | ^ ~ && || !

    字符串连接运算符

    +

    增量和减量运算符

    ++ --

    移位运算符

    << >>

    比较运算符

    == != <> <= >=

    赋值运算符

    = += -= *= /= %= &= |= ^= <<= >>=

    成员访问运算符

    .

    索引运算符

    []

    数据类型转换运算符

    ()

    条件运算符

    ?:

    委托连接和删除运算符

    + -

    对象创建运算符

    new

    类型信息运算符

    sizeof(只限于不安全代码)is typeof as

    间接寻址运算符

    * -> &(只用于不安全的代码)[]

    命名空间别名限定符

    ::

    空结合运算符

    ??

    sizeof在.Net Framework后不存在了。

    checked和unchecked运算符

    checked:标识溢出检查,添加编译选项/checked,对所有代码执行溢出检查

    unchecked:对标识checked的代码段取消溢出检查。

    checked

    {

        statements;

    }

    unchecked

    {

        statements;

    }

    is运算符

    检查对象是否与特定的类型兼容。"兼容"表示对象是该类型,或者派生于该类型。若兼容,为true,不兼容,false。

    as运算符

    用于执行引用类型的显式类型转换。如果转换的类型与指定的类型兼容,转换成功,不兼容,返回false。

    sizeof运算符

    unsafe

    {

        Console.WriteLine(sizeof(int).ToString());

    }

    typeof运算符

    返回一个特定类型的System.Type对象

    可空类型和运算符

    可以将值指定为null。

    int? a = null;

    在比较可空类型时,只要有一个操作数为null,结果就为false。

    空结合运算符??

    提供一种快捷方式,可以在处理可空类型和引用类型时表示null值。

    这个运算符放在两个操作数之间,第一个操作数必须是一个可空类型或者引用类型,第二个操作数必须与第一个操作数的类型相同,或者可以隐式转换为一个操作数的类型。

    空结合运算符的计算如下:如果第一个操作数不是null,则整个表达式就等于第一个操作数的值。如果第一个操作数的值为null,则表达式的值为第二个操作数的值。

    运算符的优先级(从高到低)

    运算符

    初级运算符

    () . [] x++ x-- new typeof sizeof checked unchecked

    一元运算符

    + - ! ~ ++x --x和数据类型转换

    乘/除运算符

    / * %

    加减运算

    + -

    移位运算符

    << >>

    关系运算符

    < > <= >= is as

    比较运算符

    == !=

    按位与

    &

    按位异或

    ^

    按位或

    |

    逻辑与

    &&

    逻辑或

    ||

    条件运算符

    ?:

    赋值运算符

    = += -= *= /= %= &= |= ^= <<= >>= >>>=

    2,对象相等的比较

    Object的静态成员ReferenceEquals,测试两个引用是否指向类的同一个实例

    虚拟的Equals:按值来比较

    静态的Equals:可以处理null的情况

    比较运算符==:对值比较值,对引用比较是否指向同一个对象。可重写,执行和Equals相同的逻辑。

    调用ReferenceEquals来比较值类型肯定返回false,因为为了调用这个方法,值类型总是需要装箱。

    3,运算符重载

    public class Vector

    {

    private double x = 0;

    private double y = 0;

    private double z = 0;

     

    public Vector(double x, double y, 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 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;

    }

    }

    C#要求把所有的运算符重载都声明为public和static。不能使用this,不能访问实例成员。

    编译器处理运算符重载和处理方法重载的方式是一样的,所以,对于运算符两侧类型不同的,需要定义两个不同的运算符重载函数。

    C#不允许重载=,但是在用户重载+-*/&/后,会自动重载相应的+=。。版本。

    比较运算符的重载

    比较运算符分为三对:

    ==和!=

    >和<

    >= 和 <=

    C#要求成对重载比较运算符,比较运算符必须返回bool型变量。

    可以重载的运算符

    类别

    运算符

    限制

    算术二元

    +*、-%

     

    算术一元

    + - ++ --

     

    按位二元运算符

    & | % ^ << >>

     

    按位一元运算符

    ! ~ true false

    true和false运算符必须成对重载

    比较运算符

    == != >= < <= >

    必须成对重载

    赋值运算符

    += - = *= /= >>= <<= %= &= |= ^=

    不能显式地重载,重载单个时,会隐式重载

    索引运算符

    []

    不能直接重载索引运算符。索引器成员可以

    数据类型转换运算符

    ()

    不能直接重载,用户定义的数据类型允许定义定制的数据类型转换

    4,用户定义的数据类型转换

    public static implicit operator float (Currency value)

    {

        statements;

    }

    上述代码声明了一个隐式类型转换。

    也可使用explicit声明一个显式类型转换

    类型之间的数据转换

    限制

    • 如果某个类直接或者间接继承了另一个类,就不能定义这两个类之间的数据类型转换,
    • 数据类型转换必须在源或目标数据类型中定义

    数据类型转换应该定义在类型内部,且源代码均可编辑,防止把第三方数据类型引入类中。

  • 相关阅读:
    RTT设备与驱动之串口
    RTT设备与驱动之PIN设备
    RTT之ENV
    MQTT学习之一
    思维导图软件
    英语单词学习方法
    RTT之POSIX
    10 个强大的JavaScript / jQuery 模板引擎推荐
    30个实用的jQuery选项卡/导航教程推荐
    jquery 自动完成 Autocomplete插件汇总
  • 原文地址:https://www.cnblogs.com/xyb930826/p/5289911.html
Copyright © 2020-2023  润新知