C# 与 .Net 3.5 高级程序设计(第四版) 读书笔记(二)

时间:2021-06-13 09:05:04
  1. 每一个可执行应用程序必须包含一个定义了Main()方法的类,这个方法用来表示应用程序的入口点。定义Main()方法的类叫做应用程序对象。根据惯例,返回值返回0表示程序正常结束,而其他值表示错误发生。(要知道,值0是自动返回的,即使Main()返回的是个Void)。
  2. 要注意所有的C#关键字都是小写的。
  3. 使用System.Environmet类型的静态方法GetCommandLineArgs()访问命令行参数。这个类允许我们通过不同的静态成员获得大量有关运行.NET 应用程序的操作系统细节。例如:GetLogicalDrives(),获取本机驱动器以及其他一些有用的细节信息。
  4. 命令行用户交互CUI(Command User Interface)简称CUI。
  5. 图形用户界面(Graphical User Interface,简称 GUI。
  6. .NET 数值格式字符(C 货币,D 10进制,E指数表示,F 定点小数,G 定点或者指数格式,N 基本的数据格式带逗号,X 16进制)。字母均可用使用小写。语法如:“{0:X}”
  7. 结构是分配在栈上的值类型,引用类型是分配在托管堆上的。值类型可以在内存中快速分配,并且具有固定的可预测的生存周期。引用类型是在垃圾回收堆上进行分配。
  8. C# 关键字 只是相应系统类型的简化符号。例如 int 只是 System.Int32 的简化版。
  9. String.Compare() 比较两个字符串,String.Contains()用于判定当前字符串是否包含一个指定的子字符串。
  10. C# 引入的以@为前缀的字符串字面量记发,术语称作 “逐字字符串”。
  11. 当我们对引用类型进行相等性测试(C# == 和!= 运算符)时,如果引用类型指向内存中的相同对象,则返回True。我们也可以使用 Equals()方法进行相等性测试。
  12. 字符串是不可变的。改变字符串的方法 其实返回了一个按修改格式的新字符串。
  13. StringBulider 类型 直接修改对象内部的字符数据,而不是获取修改后格式的副本。默认情况下,它只能保存16个字符一下的字符串,但是我们可以在构造函数中修改这个值。如果追加的字符数超过规定的限制,Stringbuilder 对象会将它复制到新的实例中,并根据规定限制来扩大缓冲区。
  14. TimeSpan 结构 使我们可以很方便地使用各种成员定义和转换时间单位。
  15. 宽化用于定义隐式“向上转换”并且不会导致数据丢失,窄化 是指 显式强制类型转换。C#提供的checked 和 unchecked 关键字将确保数据丢失肯定被检测到。我们也可以设置项目级别的溢出检测。如果启用了项目检测,可以使用 unchecked 禁止个别情况抛出异常。.Net 默认行为 是忽略运算溢出。
  16. Params 修饰符,修饰参数 只能有一个而且必须是最后一个参数。
  17. IEnumerator 接口 对于foreach 结构而言 是必需的。对应的方法为 GetEnumbertor()。
  18. 静态的Enum.GetUnderlyingType() 方法,它返回用于保存枚举的类型值的数据类型。
  19. Enum.GetValues(),返回一个Array的实例。每一项都对应枚举的一个成员。
  20. 如果我们在使用struct之前不为每一个公共字段数据赋值,就会收到一个编译错误。
  21. 默认情况下,当值类型包含其他引用类型时,赋值将生成一个引用的副本。这样就有两个独立的结构,每一都包含指向内存中同一个对象的引用。(也就是浅复制)
  22. 按值传递引用类型时,由于传递给方法中的于调用者指向同一个对象,所以可以改变对象的状态数据,但是不能把引用重新赋值给一个新的对象。C# 中默认的参数传输方法。
  23. 按引用传递引用类型时,方法可以改变传入的引用在内存中的指向,被调用者可能改变对象的状态数据的值和引用的对象。
  24. 可空类型只能是类型,如果试图创建可空的引用类型(包括字符串),就会遇到编译时错误。局部可空变量必须赋一个初始值。我们也可以 如:Nullable<int> a = 10,创建可空对象。
  25. 使用??运算符,在获得的值实际上市Null时,给一个可空类型赋值。
  26. 类是由字段数据以及操作这个数据的成员所构成的自定义类型。
  27. 对象必须使用new 关键字来分配到内存中,如果我们不使用 new 关键字,并且在之后的代码中尝试使用类变量的话,会收到一个编译错误。
  28. 默认构造函数 除了把新对象分配到内存当中,它还确保所有的字段数据都设置为正确的默认值。
  29. This 关键字的用途就是 解决当传入参数的名字和类型数据字段的名字相同时产生的作用域歧义。This在开发工具中启动智能感知。This 的另一种用法是 为构造函数链的技术来设计类。

              例如:

class Moto

{

  private string firstName;

  private string lastName;

  public  Moto() { }

  public Moto(string str) : this(str, "") { }

  public Moto(string str1, string str2)

  {

   //初始化

  }

}

 30.  静态方法的实现中使用this 关键字会产生编译错误。静态成员只能操作静态数据成员或者调用类的静态方法。如果尝试在静态成员中使用非静态类数据或者调用非静态方法,就会收到编译时错误。非静态方法可以用静态数据或者非静态数据。

 31.  静态数据分配一次并且在相同类型的所有对象之间共享。

 32.  静态构造函数 非常适用于初始化在编译时未知的静态数据的值(例如:我们需要从外部读取值或者生成随机数等) 一个类只可以定义一个静态构造函数。无论创建了多少个类型的对象,静态的构造只执行一次。运行库在创建类实例 或者调用者首次访问静态成员之前,运行库会调用静态构造函数。静态构造函数的执行先于任何实例级别的构造函数。