System.Diagnostics中的StackFrame和StackTrace访问栈框架和栈跟踪。
方法类型:实例方法和静态方法。
ref 按援用传递,方法声明和调用同时使用ref关键字。
输出参数,与ref相似 out也是按援用传递
params 关键字 参数数组必须是方法声明中的最后1个参数,大量的字符串操作应使用
System.Text.StringBuilder
Try ... Catch ... Finally
属性和运算符
JIT编译器可使属性的访问比字段的访问更快
属性是快速访问对象状态的1种技术。
静态属性
索引器
容器类,父子关系中的父,1对多关系
使用ArrayList代替数组增强功能
“运算符” 特殊的方法
构造函数和对象生命周期
烧毁对象
把对象援用设置为null,并注意不再有对对象的其他援用,就能够显示烧毁对象。
利用程序中的大量析构函数会对性能有负面的影响,处理对象烧毁,首选方式利用
IDisposable接口,实现Dispose方法,以Finalize析构函数方法来履行,但不会中断垃圾回收
进程。
私有构造函数
静态构造函数
IClonable Clone 深拷贝 MemberWiseColone 浅拷贝
串行化和并行化
将对象串行化保存下来,这类技术广泛利用于恢复利用程序的状态,定期获得屏幕快照,保存对象等。
.NET Framework提供了丰富的XML串行化模型
xsd.exe 推断XML模式,XML架构/数据类型支持实用工具
事件和拜托
基于事件的编程是.NET Framework的基石
.NET Framework中的事件机制使用了拜托(回调)
事件作为1种经常使用的方法来消除事件源对象(生成事件的对象)与事件接收器对象(接受事件通知的对象)之间的耦合。
拜托 类似于利用程序中指向对象中方法的指针
3个步骤:
1 声明拜托类型
2 创建拜托对象,并将该对象绑定指定方法上
3 使用拜托对象来调用方法
.NET Framework支持两种类型的拜托
单播拜托:允许1个对象上调用1个方法
多播拜托:允许在不同对象上调用1系列方法,保护1个调用对象
使用多播拜托的步骤:
1 定义1个拜托类型
2 编写具有相同签名方法作为拜托
3 创建拜托对象,将它绑定到需要通过拜托调用的第1个方法
4 创建另外一个拜托对象,绑定到下1个需要调用的方法
5 System.Delegate类的Combine方法,合并成1个集成的多播拜托
异步拜托 可以在后台线程中调用的方法
调用拜托实例3种方式:
1 同步调用,等待方法履行终了,最多见
2 异步调用,等待方法履行终了, EndInvoke(),但在方法履行终了之前调用
3 异步调用,注册1个回调方法,1旦履行终了,给出通知
事件的实现 使用拜托存储定阅的事件处理方法,典型的Observer设计模式的1种实现
每一个事件,必须指定下面两项内容:事件名,事件的签名(参数列表)
System.EventHandler 1个内置的拜托
事件不能有返回类型,只能从事件源对象到事件接收方对象的单向信息流
静态事件 较少见,相对1般事件
定义自己注册的方法
大多数情况下不需要定义定制的注册方法,但这类技术可使代码最简洁和快速。
Framework中,大多数控件都使用定制的注册方法。
基类和子类不能援用同1个拜托
继承和多态性 所有的面向对象语言都支持,多态性由继承支持,把1种类型的对象视作另外一种类型的实例的多态性
基类定义为virtual,派生类就能够重写基类的操作
标记为非虚的方法不能重写
操作声明为virtual,可以重写该实现
操作声明为abstract,必须重写该实现
类 继承自System.Object
结构 继承自System.ValueType,继承自System.Object转换成它实现的接口类型,对援用类型代替类型要谨慎,不能调用接口不支持的任何对象。
代码组织和元数据
同享程序集 全局程序集缓存 Global Assembly Cache (GAC)
程序集 可重用的最小单元
元数据 为公共语言运行时提供了在运行期间加载类型和调用方法所需的所有信息
metadata 是元编程的基础,在很多系统中也是根本的东西,了解这个东西可以比较深入的了解某个架构
查看元数据最简单方法使用ildasm.exe /adv或/advancel选项
.NET模块是1个可移植、可履行(PE)格式文件
只有数据的模块 SDK包括1个工具Assembly Linker(AL.exe)
利用该工具将这些非MISL模块链接到程序集中
将该文件编译成模块,必须使用C#.NET命令行编译器
不能使用Visual Studio .NET 由于它总是创建单、程序集
例如:csc /target:module csMod.cs csMod.netmodule
*.netmodule 是.NET的模块
增加模块到程序集清单中:
csc /addmodule: csMod.netmodule /addmodule:VBMod.netmodule MainMod.cs
程序部署
部署单程序集利用程序比较简单,直接用xcopy部署。
私有程序集部署利用程序也不复杂,将需要的程序集合放在同1个文件夹或用利用程序配置文件通知CLR在甚么位置查找程序集
部署同享程序集
添加到GAC 全局程序集缓存
但Microsoft不推荐利用程序与GAC相互依赖,应尽可能使用利用私有程序集部署方式
利用公有-私有密钥对可以为程序集创建强名称
编译期间编译器使用私钥,将相应的公钥写入程序集清单
sn (Strong Name) sn /k *.snk
MSDN中查找"Keys crytography"查找相应内容
publickey 较长的数字
public key token 公钥令牌
sn /t *.snk
将同享程序集安装到GAC中
gacutil -i *.dll 需要管理员权限
或在控制面板的管理工具中找 .NET FrameWork Configuration
1. Windows Forms几个平时没有留意的经常使用的属性:
AcceptButton:设置在表单击活状态下,按ENTER键对应反应的是那个按钮的函数。缺省值 None
CancelButton:设置在表单击活状态下,按ESC键对应反应的是那个按钮的函数。缺省值 None
2. Form在表单方法Show被调用时,事件和方法触发的顺序:
Load -> GotFocus -> Activated -> Closing -> Closed -> Deactivate -> LostFocus -> Dispose
Show方法隐含调用Load,因此如果1个表单即便没有载入,如果调用Show方法也会直接将表单载入。
3. 当你需要在表单显示或隐藏时运行某些代码,放在Activated和Deactivate比GotFocus和LostFocus事件中好。
4. 收到close的要求,表单先运行Closing事件中代码,再Closed代码,因此数据有效校验放在Closing中为好。
5. Hide方法,即便没有表单没有Load到内存中,当调用Hide时候也会将表单Load到内存中,但不显示。