第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块再返回上级代码处理.