• C#笔记-基础知识(三)


    1.浅比较, 深比较

    #浅比较只比较引用,深比较比较长度和内容

    2.移位运算符

    底层的硬件使用 “二进制补码” 的形式表示有符号二进制数。 正数使用正常的二进制形式。要取一个数的相反数,把这个数按位取反再加1.

    这个过程把一个正数转换成它的负数形式。反之亦然。所有负数最左边的比特位都是1 。

    3.用户定义的类型转换

    class LimitedInt
    {
        public static implicit operator int(LimitedInt li)
        {
            return li.TheValue;
        }
        public static implicit operator LimitedInt(int x)
        {
            LimitedInt li = new LimitedInt();
            li.TheValue = x;
            return li;
        }
        private int _theValue = 0;
        public int TheValue{...};
        
    }  

    显示要用 explicit 替换掉implicit

    4.运算符重载

    运算符重载不可以创建新运算符, 不能改变运算符的语法;不能重新定义运算符如何处理预定义类型;不能改变运算符的优先级或结合性

    重载运算符应该符合运算符的直观含义

    5.typeof 运算符

    Type t = typeof( someClass )

    FileldInfo[] fi = t.GetFields();

    MethodInfo[] mi = t.GetMethods(); 

    5.委托

    可以认为委托是持有一个或多个方法的对象。被执行时会执行他所有“持有” 的方法

    可以把它看一个类型安全的, 面向对象的c++函数指针

    委托和类一样, 是一种用户自定义的类型。而委托持有一个或多个方法。

    delegate void Mydel(int value); // 声明一个委托类型

    #声明一个委托, 看上去和方法声明相似,只是没有实现块。

    #使用该委托类型声明一个委托变量。 

    #创建一个委托的对象,赋值给委托变量。新的委托对象包括指向某个方法的引用,签名(包括ref,out)和返回类型一致。可以增加方法

    #可以像调用方法一样调用委托。包含的每一个方法都会被执行。可以是实例方法也可以是静态方法。

    #调用带返回值的委托。 最后一个方法返回的值就是委托的返回值, 其它方法返回值都会被忽略

    #调用带引用参数的委托时参数值可能会改变。在执行每个方法时的参数值不同

    6.委托使用匿名方法

    #声明委托yojgjf作为初始化的表达式。

    #为委托增加事件时在赋值语句的右边

    #除了数组参数,参数列表必须与委托匹配:参数数量,类型及位置, 修饰符

    #可以省略圆括号来简化参数列表,但必须满足2个条件:委托参数列表不包含out参数;不使用参数

    #如果委托声明有params参数,那么匿名方法的参数列表将忽略params 关键字。

    7.Lambda表达式

    #允许我们省略类型参数(隐式类型)。 如果只有一个隐式类型参数,我们可以省略圆括号;

    #允许表达式的主体是语句块或表达式

    #有ref , out 参数时必须注明类型(显式类型)

    #如果没有又大火女,必须使用一组空的圆括号

    8.装箱

    可以将任何值类型转换为object类型; System.ValueType类型


    》装箱转换

    装箱是返回的是值的引用类型副本,不是在原值上操作,原始值类型和引用类型副本。

    》拆箱unboxing 是把装箱后的对象转换回值类型的过程,显示转换


    》自定义类型的转换
    public static implicit operator int (Person p) //将person 隐式转换为int,
    {
    return p.Age;
    }
    public static explicit operator int (Person p) //必须强制类型转换


    》is 判定是否可以转换,只可以用于引用转换以及装箱,拆箱转换, 不能用于用户自定义转换。

    》as 运算符和强制转换运算符类似,只是不抛出异常, 失败返回null, 只能用于引用转换和装箱转换,
    不能用于用户自定义转换或到值类型的转换。

    9.溢出检测

    代码片段是否被检查称作溢出检测上下文。如果指定一个表达式或代码为checked, CLR会在转换产生溢出时抛出一个OverflowException异常,如果不是checked, 转换会继续而不管是否产生溢出。

    unchecked( ... ) 会忽略溢出


    11. 字符串前加 @ 字符串中是字面量,转义字符串不会被求值,例外的是相邻的双引号,他们被解释为单个双引号,
    string rst = "value 1 5, val2 10";
    string vst = @"value 1 5,“” val“” 2 10"; //不解释制表符


    12. 定义类的转换,重载运算符

    class LimitedInt
    {
    private int _value = 9;
    public static implicit operator int (LimitedInt li)
    {
    return li._value;
    }
    public static implicit operator LimitedInt(int x)
    {
    var li = new LimitedInt();
    li._value = x;
    return li;
    }
    public static LimitedInt operator + (LimitedInt x , double y)
    {
    LimitedInt li = new LimitedInt();
    li._value = x._value + (int)y;
    return li;
    }

    }

    13. typeof运算符
    using System.Reflection;

    class Program
    {
    static voic main()
    {
    Type t = typeof(LimitedInt);
    FieldInfop[] fi = t.GetFields();
    MethodInfo[] mi = t.GetMethods();
    var s = new LimitedInt();
    foreach(MethodInfo m in mi)
    Console.WriteLine("Method:{0}", m.Name);
    Console.writeLine("{0}", s.GetType().Name);

    }
    }


    14. using语句帮助减少意外的运行时错误带来的潜在问题,包装了资源的使用。它执行下列内容:
    *分配资源
    *statement放进try块
    *创建资源的Dispose 方法的调用, 并把它放进finally块

    class Program
    {
    using(TextWriter tw1 = File.Createtext("aaa.txt"),
    tw2 = File.CreateText("bbb.txt"))
    {
    tw1.WriteLine("for score and seven years ago, ... ");
    tw2.writeLine("early to bed; early to rise .. ");
    }
    using(TextReader tr1 = File.OpenText("aaa.txt"),
    tr2 = File.OpenText("bbb.txt"))
    {
    string InputString;
    while( null != (InputString = tr1.ReadLine()))
    console.WriteLine(InputSring);
    while( null != (InputStinrg = tr2.ReadLine()))
    COnsole.WriteLine(InputString);
    }
    }

    》结构是值类型, 结构本身派生自System.ValueType > object

    》enum [Flasgs]特性,不会改变计算结果, 但却提供了一些方便的特性,
    》》它能知编译器,该枚举成员不公可以用作单独的值, 还可以按位标志进行组合,
    》》它允许枚举的ToString的方法为位标志的值提代更多的格式化信息。

  • 相关阅读:
    简单的冒泡排序算法(java)
    寻找两个数组中的公共元素Java程序代码
    利用快速排序求两集合交集
    一种简单的吉布斯采样modify中应用
    递归生成小于某个数的所有集合
    卡拉曼算法简答程序
    模态对话框退出DoModal过程中需注意的陷阱
    是否可以使用空对象指针调用成员函数及访问成员变量
    windows c++如何使窗口动态改变位置
    windows的滚动条使用
  • 原文地址:https://www.cnblogs.com/blackcatx/p/5924730.html
Copyright © 2020-2023  润新知