《C#入门经典》再次阅读时的读书笔记(一)

来源:互联网 发布:微信封面 知乎 编辑:程序博客网 时间:2024/05/22 12:37

第1章 C#简介

1.Net Framework是Microsoft为开发应用程序而创建的一个富有革命性的新平台,它可以创建Windows应用程序,Web应用程序,Web服务和其他各种类型的应用程序.

2.编译.Net Framework库的代码时,先将其编译为MSIL(Microsoft Intermediate Language),再由Just-In-Time(JIT)编译器编译为本地机器代码.MSIL中间语言代码仅在需要时才编译.

3.程序集包括可执行应用程序文件(.exe)和其他应用程序使用的库(.dll).
  程序集还包含元信息(即程序集中包含的数据的信息,也称元数据)和可选的资源(MSIL 使用的其他数据,如声音文件和图片).元信息允许程序集是自描述的,因此不需要其他信息就可以使用程序集.

4.在CLR控制之下运行的应用程序是托管的,CLR(Common Language Runtime)管理着应用程序,其方式是管理内存,处理安全性,以及允许进行跨语言调试.

5..Net的垃圾自动回收机制会频繁检查计算机内存,从中删除不再需要的内容.

第三章 变量和表达式

1.使用#region和#endregion定义可以扩展和收缩的代码区域的开头和结尾.

2..Net Framework命名空间的两种命名规定:PascalCase约定每个单词的第一个字母大写,其他的小写,camelCase约定第一个单词以小写字母开头.Microsoft建议对于简单变量使用camelCase规则,而比较高级的命名则使用PacalCase.

3.逐字地指定字符串即在该字符串前面加一个@字符.
  字符串是引用类型,所以字符串可以赋null值,表明字符串变量不引用字符串.

4.命名空间是.Net中提供应用程序代码容器的方式,这样就可以惟一地标识代码及其内容.

第4章 流程控制

1.使用&&和||运算符来代替&和|,性能会有一定的提高,因为&&运算符只要第一个操作数为False就不考虑第二个操作数的取值了,同样如果第一个操作数为True,||运算符无需考虑第二个操作数的取值.

第5章 变量的更多内容

1.类型转换
  隐式转换:从类型A到类型B的转换可以在所有的情况下进行,执行转换的规则非常简单,可以让编译器进行.任得类型A,只要其取值范围包含在类型B的取值范围内,就可以隐式转换为类型B.
  显式转换:从类型A到类型B转换只能在某些情况下进行,转换的规则比较复杂,应进行某种类型的处理.

2.枚举定义
  enum typename
  {
     value1,
     value2,
     value3
     ...
     valuen
  }

3.结构体定义
  struct <typename>
  {
    <memberDeclaration>
  }

4.一维数组: <basetype>[] <name>;
  int[] myIntArray = {1, 2, 3, 4, 5};
  int[] myIntArray = new int[5]={1, 2, 3, 4, 5};
  二维数组: <basetype>[,] <name>;
  double[,] hillHeight = {{1, 2, 3, 4}, {2, 3, 4, 5}, {3, 4, 5, 5}};
  double[,] hillHeight = new double[3,4];

5.数组的数组:数组的元素是数组
 jaggedIntArray = new int [2][];
 jaggedIntArray[0] = new int[3];
 jaggedIntArray[1] = new int[4];
 或 jaggedIntArray = new int[3][]{new int[] {1, 2 ,3}, new int[] {1}, new int[] {1,2}};
 或 int[][] jaggedIntArray = {new int[] {1, 2, 3}, new int[] {1}, new int[] {1, 2}};

6.<string>.ToCharArray(): string类型转换为char[]数组
  <string>.ToLower(), <string>.ToUpper(): 转换为小写或大写字母
  <string>.TrimStart, <string>.TrimEnd(): 删除字符串前面或后面的空格
  <string>.PadLeft(), <string>.PadRight(): 在字符串前面或后面加指定个数的空格或字符(char)
  <string>.Split(): string类型转换为string[]数组,以char[]数组为分隔符

第6章 函数
1.函数定义
  参数数组:放在函数的最后一个参数定义,它可以使用个数不定的参数来调用函数,使用params关键字定义.   
  static <reutrntype> <functionname>(<paramType> <paramName>, ... ,
                                     params <type>[] <name>)
  {
    ...
    return <returnvalue>;
  }

2.ref与out关键字
  两者都可以按引用传递返回变量的值.把未赋值的变量用作ref参数是非法的,但可以把未赋值的变量用作out参数.此外,函数在使用out参数时,该参数必须看作是还未赋值,即调用代码可以把已赋值的变量用作out参数,存储在该变量中值会在函数执行时会丢失.在函数调用时必须使用ref或out关键字.

3.在控制台应用程序中,定义全局变量必须使用static或const关键字,static允许修改变量的值,const不允许修改变量的值.如果局部变量与全局变量同名,全局变量就会被屏蔽.

4.声明一个变量并不会分配内存,只有给变量赋值后才会分配内存,如果变量定义后未赋初值而在循环内部赋值
,则该变量的作用域只在循环内部使用.一般情况最好在声明和初始代所有变量后,再在代码块中使用它们.

5.Main()函数的四种形式
  static void Main()
  static void Main(string[] args)
  static int Main()
  static int Main(string[] args)
  args用于从命令行接受参数

6.在结构体中定义的函数称为结构函数,结构函数可以访问结构体中所有的变量,结构函数不需要static关键字修饰.

7.函数重载:允许创建同名的多个函数,但这些函数使用不同的参数类型.

8.委托:委托的声明指定了一个函数签名,其中包含一个返回类型和参数列表.可以使用委托类型的变量来调用函数.此外还可以把委托变量作为参数传递给函数,这样就可以使用委托调用它引用的任何函数,而且在运行之前无需知道调用的是哪个函数.
  delegate double ProcessDelegate(double param1, double param2);
  static void executeFunction(ProcessDelegate process);
  {
    process(2.2, 3.3);
  }

第7章 调试和错误处理

1.Debug目录下的.pdb文件为编译后的机器码程序.

2.输出调试信息
  Debug模式下输出:
  Debug.WriteLine();  Debug.Write(); Debug.WriteLineIf(): 条件为True时才输出.
  Release模式下输出:
  Trace.WriteLine(); Trace.Write(); Trace.WriteLineIf(): 条件为True时才输出.
  要使用以上函数,必须声明命名空间:using System.Diagnostics;
  输出调试信息的两种方法: 
  诊断输出:总是要从应用程序中输出调试结果时使用这种方法,尤其是要输出的字符串比较复杂,涉及几个变量或许多信息的情况下,使用该方法比较好.另外,要在发布模式下获得执行应用程序的调试结果,Trace命令是惟一的选择.
  跟踪点(断点):希望快速输出重要信息,以便解决语义错误,应使用跟踪点.

3.断点是源代码中自动进入中断模式的一个标记,它可以配置为:
  1)遇到断点时立即进入
  2)遇到断点时,如果布尔表达式的值为True,则进入中断模式
  3)遇到某断点一定的次数后进入中断模式
  4)遇到断点时,如果自从上次遇到断点以来变量的值发生了变化,就进入中断模式.
  5)把文本输出到调试窗口中,或者执行一个宏.

4.进入中断模式的另外两种方式:一是在产生一个未处理的异常时选择进入该模式;二是生成一个判定语句时中断.判定函数有两个版本:Debug.Assert()和Trace.Assert().遇到判定语句时选择Abort中断应用程序的执行,选择Retry进入中断模式.
  Assert()函数带三个参数,第一个参数为false时触发判定语句,第二,三个参数分别把信息写到弹出的对话框和输出窗口中.

5.try
  {
     ...
  }
  catch (<exception e>)
  {
     ...
  }
  finally
  {
    ...
  }
  可以只有try块和finally块,而没有catch块,或者有一个try块和好几个catch块.如果有一个或多个catch块,则finally块是必须的.异常发生时,选择一个匹配的异常(catch块)执行,如果没有找到匹配的异常则选择默认的catch块执行,finally块是总是要执行的.在catch块中再次抛出异常使用throw,此时先执行当前异常块中finally块再返回上级代码处理.