这是昨天下班前总结的一天的学习心得。
C#的一些术语
.net管理代码的执行——启动代码、给它赋予相应的权限、分配内存以及存储数据,释放内存和资源。
.net还使用一个非常复杂的类库——即.net基类,以便在windows上执行大量的任务。
.net运行时CLR:公共语言运行时。它管理实际代码。
受管制的代码:在.net环境中运行的任何代码都成为受管制的代码managed code;
.net外部的其他代码也运行在windows上,这些代码称为unmanaged code;
中间语言(IL):在.net运行时加载和运行代码时,这种语言确定代码的未知。IL可以非常快速地编译成为内部的机器代码,同时支持.net功能。
公共类型系统(CTS)
为了实现语言的互操作性,必须有一组各种语言都认可的基本数据类型,这样才能对所以语言进行标准处理。
.net基类:这是一个扩展的类库,它包含预先写好的代码。
装配件(Assembly):装配件是编译好的受管制的代码的单元。
装配件高速缓冲存储器:这是存储共享装配件的磁盘区域。
公共语言规范(CLS):确保代码可以在任何语言中访问的最小标准集合。
反射:因为装配件完全是自我描述的,因此理论上可以编程访问装配件元数据。程序可以利用这个某些基类
来检查自己的元数据。
JIT编译:表示执行编译过程的最后阶段,即从中间语言转换成机器代码。
应用域:CLR允许不同代码在同一个过程空间中运行的方式。
无用存储单元收集:CLR清理不再需要的内存方式,应用程序不必负责内存的释放。
执行阶段的工作
在运行程序时,.net CLR会加载第一个装配件——即包含主程序入口的那个装配件,它使用
散列来验证这个装配件是否被塞满,使用元数据检查视图中定义的类型。另外如果程序带有
.net许可,CLR就会检查系统的安全策略和运行程序的帐号看它是否授予了请求许可。
CLR还验证代码的“内存类型的安全性",这样可保证代码不读写不属于它的内存。
CLR最终运行代码,它为运行的代码创建一个过程,并标记应用域,在该域中放入程序的主线程。
然后CLR提前代码中需要运行的第一部分,把它从中间语言编译成汇编语言,再在合适的程序线程
中执行它,每次执行流到达一个以前没有执行过的新方法时,该方法就会编译为可执行代码。但
这个编译过程只执行一次。该方法编译完之后,其入口地址就被编译好的可执行代码所替换。
代码中只有实际要使用的部分才会被编译,这个过程称为JIT编译。
CLS公共语言规范: C#代码
不允许使用全局方法或变量; 没有影响
不允许使用某些数据类型; 如果要CLS兼容,不要使用公共或者受保护类型
成员名称必须能在区分大小写的语言中辨识;
不要使用名称只能用大小写来区分的公共的或受保
护的成员
异常必须派生于异常基类; 没有影响
不允许使用指针类型 不要使用不安全的代码或指针
不允许使用变量列表参数 没有影响
属性
[STATHread]
void Main(){}
[Obsolete]
public int method(){}
C#与.NET区别和联系:
C#专用于.net运行时。它用于生成面向.NET环境的代码。它本身不是.net的一部分。
C#本身不是.net的一部分,一些特性.net支持,C#不支持;一些C#支持,.net却不支持。
c++代码如何在C#中运行
如果要让C++代码在.net Framework中运行,就要在代码的开头添加:
#using <mscorlib.dll>
C#和Visual C++的比较:
1.C#禁用了指针和指针算法;
2.C#删除了预处理的宏。但保留了条件编译和#defined)
3.C#要求在引用变量之前,必须显示声明和初始化变量;
4.C#使用switch...case语句,switch语句中每个case从句都必须有个闭合的break命令;
5.C#删除了全局函数;
使用C#编译器 CSC编译不同的工程类型:
/t:exe
/t:winexe
/t:library 生成库
/t:module 生成模块,不带清单(manifest)
模块不能在运行时加载,但是可以和别的文件一起编译成新的文件,/addmodule
如果在编译一个程序时,要应用已经编译好的库文件,那么应该加入/r:xxx.dll
C#中结构:
是值类型的而不是引用类型的。
引用类型:类、接口、委托、数组。不能进行简单的复制。
值类型可以用”=”实现复制;
结构不能使用继承;
封箱和拆箱操作:
封箱和拆箱可以把值类型转换成为引用类型、引用类型转换成值类型。
封箱:运行时会为堆上的对象创建一个临时的引用类型”box“
拆箱:把引用转为值类型。
必须使用显式操作。
常看到的/uxxxx表示什么:
标识符可以保护Unicode字符。用语法/uXXXX来制定。其中XXXX是Unicode编码。
变量修饰符
internal
new
private
protected
public
readonly
static
internal、private、protected、public用来设置变量的访问级别。
public 变量可以作为它所属类型的一个字段,在任何地方都可以访问;
internal 变量只能在当前程序中被访问;
protected 变量只能在它所属的类型中被访问、或该类型的派生类型中被访问;
private 变量只能在它所属的来信中被方法
protected internal
checked unchecked :
用来检查堆栈溢出。
如果在代码中设置了checked,那么检查设置范围内的溢出问题;
如果编译选项中设置了/checked,那么可以检查程序中所有代码的溢出,标记了Unchecked的
除外。
在C#中,整数类型不能隐式地转换为bool类型。
方法修饰符:
new 隐藏父类中同名的方法
public 可以在任何地方被访问,包括类的外部
protected 可以在它所属的类的内部被访问,或者派生于该类的类型中被访问
internal 在同一个程序中可以被访问
private 仅在该类的内部可以被访问
static 不能在类的特定实例上执行
virtual 方法可以被派生类重写
abstract 定义了方法名,但是没有提供执行方式
override 重写继承的方法或者抽象的方法
sealed
extern 方法在外部用另一种语言被执行
ref 引用参数:
如果要使函数的参数为引用参数,那么在函数的定义中变量的类型前面加入ref关键字;
而且在调用的时候,在实参前面也要加ref关键字。
名称空间是一种逻辑组合。
Main()入口函数:
C#中Main()方法必须是类或结构的静态方法,返回类型为int、void
控制台I/O
输出:
使用WriteLine()可以传送多个参数,第一个参数是花括号中包含标记的字符串,在这个花括
号中,要把后续的参数插入到文本中。
每个标记都包含一个基于0的索引,表示列表中参数的序号.
{0}表示列表中第一个参数。
可以为值指定宽度。{n,w},n为参数索引、w是宽度值。
///
常见到VS2005自动生产的代码中有///的地方,现在知道是什么了。
///
C#中还可以从特定的注释自动创建XML格式的说明文档。这些注释都是单行注释的,以三个斜
杠开头(///)。
隐藏的value
在定义类的属性的时候,代码通常是:
class capricorn{
private name;
public string name
{
get
{
return name;
}
set
{
name = value;
}
}
}
定义类中属性的时候,在定义SET存取器时没有显示设置参数,它有一个隐式的参数,用名称
value来表示。
C#中继承:每个派生类都只继承一个基类。
方法重写:
方法声明为virtual,那么该方法可以在派生类中被重写override。
对于基类和派生类方法的调用:
1.如果方法不是virtual,那么编译器就根据声明的引用类型来判断调用的方法;
2.如果方法是virtual,编译器会生成代码,在运行时检查引用实际上指向哪个实例,然后
确定这个实例属于哪个类,并调用该实例的方法。
方法隐藏
new关键字用来隐藏基类的方法。即同名同参的函数。
方法被隐藏后是根据实例声明的数据类型来判断调用相应数据类型中定义的方法;
如果在子类中要显示调用基类方法,使用base关键字