zoukankan      html  css  js  c++  java
  • C#知识点回顾

        C#中 if/else 语句只能用于布尔表达式,不能用于诸如-1和0这样的值。P88
        与C和C++不同,在C#中的数值类型不具有布尔意义。

    控制枚举的底层存储
        默认情况下,保存枚举值的存储类型是System.Int32,可以以相似的方式定义为核心系统类型
        //EmpType 对应实际的byte
        enum EmpType : byte
        {
            Manager,       // = 0
            Grunt,         // = 1
            Contractor,    // = 2
            VicePresident = 999 // 报错,999所占空间大于一个字节
        }

        获取枚举存储类型 Enum.GetUnderlyingType。 P111
        获取枚举类型信息 Array enumData = Enum.GetValues(e.GetType());


    值类型和引用类型,值类型隐式派生自System.ValueType. P115
        如果按引用传递引用类型,被调用者可能改变对象的状态数据的值和所引用的对象;
        如果按值传递引用类型,被调用者可能改变对象的状态数据的值,但不能改变所引用的对象。P121
        按值传递,传给函数的是实参的一个副本
    可空类型 P122
        在C#中,?后缀记法实际上是创建一个泛型System.Nullable<T>结构类型实例的简写。

    可选参数
        分配给可选参数的值必须在编译时确定,而不能在运行时确定(否则将得到编译时错误).P129
        为了避免歧义,可选参数必须放在方法签名的背后。将可选参数放到非可选参数前面将导致编译时错误。P130


    11.4.1 定义扩展方法
        当定义扩展方法时,你遇到的第1个限制就是必须把方法定义在静态类中,因此每一个扩展方法也必须声明为静态的。第2个限制就是所有的扩展方法都需要使用this关键字对第一个参数(并且仅对第一个参数)进行修饰。用this限定的参数表示被扩展的项。 P336
    11.6.5
        在不安全上下文中,可能需要声明一个直接从调用栈分配内存(不受制于..NET垃圾收集器)的本地变量。P350

        一般来说,在获取LINQ查询的结果集时,应该总是使用隐式类型。但要记住的是,在绝大多数情况下,真正的返回值是实现了泛型IEnumerable<T>接口的类型。P362
    12.5.2 将LINQ查询应用于非泛型集合 P368
        回想一下,LINQ的查询操作符是设计用于任何实现了IEnumerable<T>接口的类型的,无论是直接地还是通过扩展方法间接实现的。鉴于System.Array已经具备了这些必需的基础结构,System. Collections中传统的非泛型容器类却没有这些结构,这也许会让你感到惊讶。谢天谢地,我们还可以用泛型Enumerable.OfType<T>()方法来对包含在这些非泛型集合里的数据进行迭代操作。

       
    12.6.3 投影新数据类型 P372   
        要记住在使用了投影的LINQ查询中,你无法知道实际的数据类型,因为它是在编译时决定的。在这种情况下,就必须使用var关键字。同样,你不能在创建方法时返回隐式类型。

        注意,你需要使用字面的system.Array对象,而不能使用C#数组声明语法,因为你不知道编译器生成的匿书类的实际类型。同样.我们没有指定泛型方法ToArray<T>()的类型参数,因为直到编译时我们才能知道实际的数据类型,而这已经太晚了。P373

    13.2 对象生命周期的基础
    13.8 构建可终结对象
    13.9 395
    重用c#的using关键字
    13.10
        现在,我们已看到了两种方式来构造能够清理内部非托管资派的类。一方面,我们可以使用终结器。这个技术我们尽可以放心使用,因为知道对象可以不需要用户参与进行垃圾回收.清除它自身。另一方面.我们可以实现IDisposable,给对象用户提供一种一旦对象用完就能清除的方法。然而,如果调用者忘记调用Dispose(),非托管资源可能会永远留在内存中。 P397


    14.2 .NET程序集的作用
        .NET应用程序可以由多个程序集拼装而成。简单来说.程序集就是一个以公共语言运行库(CLR)为宿主的、版本化的、自描述的二进制文件。尽管现实中.NET程序集和以往Windows二进制文件的文件扩展名(*.exe或者*.d1I )完全相同,但是两者的内部构成则几乎完全不同。P412
       
        代码库(也称类库)是一个*.dll形式的文件,它包含了一些外部应用程序能够调用的类型。当创建可执行程序集时,我们将需要使用许多系统提供的和自己手工编写的代码库。
    但是,请记住一点:代码库的文件扩展名不一定是*.dll。一个可执行程序集完全可以使用定义在外部可执行文件中的类型。因此.一个被引用的*.exe也可以被认为是代码库。P412

    强名称由一组相关数据组成。我们可以使用以下程序集级别的特性来定义其中的大部分数据。
        程序集的友好名称(程序集名称减去文件扩展名)。
        程序集的版本号(使用[AssemblyVersion]特性赋值)。
        公钥值(使用[AssemblyKeyFile]特性赋值)。
        用于本地化的可选的区域性标识(使用[AssemblyCulture]特性赋值)。
        嵌入的数字签名,使用基于程序集内容的散列值和私钥值生成。  P432

    2.7.4 多重标记和值
        在c#中,可以使用任意数量的替代标记和任意数量的值。
        值可以以任何顺序使用。
        值可以在格式字符串中替换任意次。
        例如,下面的语句使用了3个标记但只有两个值。值1被用在了值0之前,而且值1被使用了两次。
    Console.WriteLine("Three integers are {1}, {0} and {1}.", 3,6);
    这段代码在屏幕上显示如下:
    Three integers are 6, 3 and 6.

    2.7.5 格式化数字字符串

    image

    变量是一个名称,表示程序执行时存储在内存中的数据。C#提供了4种变量
    本地变量:在方法的作用城保存临时数据,不是类型的成员
    字段:保存和类型或类型实例相关的数据,是类型的成员
    参数:用于从一个方法到另一个方法传递数据的临时变盆.不是类型的成员
    数组元素:(通常是)同类数据项构成的有序集合的一个成员,可以为本地变旦,也可以为类型的成员

        变量在使用之前必须声明。变量声明定义了变量,并完成两件事:给变量命名,并为它关联一种类型;让编译器为它分配一块内存。
        无初始化语句的本地变量有一个未定义的值,在未赋值之前不能使用。试图使用未定义的本变最会导致编译器产生一条错误信息。

    与c和c++不同,c#在类型的外部不能声明全局变量(也就是变量或字段))。所有的字段都属于类型,而且必须在类型声明内部声明。P39

    4.5 创建变量和类的实例
         声明类类型的变量所分配的内存是用来保存引用的,而不是用来保存类对象实际数据的。要为实际数据分配内存,需要使用new运算符。
        news算符为任意指定类型的实例分配并初始化内存。它依据类型的不同从栈或堆里分配。

    书籍:精通C#第6版,图解c# 第四版

  • 相关阅读:
    ios正在使用NSDateComponents、NSDate、NSCalendar它的结论是在当前时间是在一段时间在一天。
    linux 核心学习书籍
    Hbase在的应用经验的统计
    09-使用for循环输出空心菱形(循环)
    [置顶] Android下实现自动关机的方法总结
    S3C3440看门狗驱动程序
    MySQL里求给定的时间是所在月份的第几个礼拜
    CheckBox in ListView
    根据复选框后面的描述文字进行选择的技巧
    C#中一些易混知识的比较
  • 原文地址:https://www.cnblogs.com/flysong/p/9131106.html
Copyright © 2011-2022 走看看