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# 第四版

  • 相关阅读:
    The Python Standard Library
    Python 中的round函数
    Python文件类型
    Python中import的用法
    Python Symbols 各种符号
    python 一行写多个语句
    免费SSL证书(https网站)申请,便宜SSL https证书申请
    元宇宙游戏Axie龙头axs分析
    OLE DB provider "SQLNCLI10" for linked server "x.x.x.x" returned message "No transaction is active.".
    The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "xxx.xxx.xxx.xxx" was unable to begin a distributed transaction.
  • 原文地址:https://www.cnblogs.com/flysong/p/9131106.html
Copyright © 2011-2022 走看看