CSDN博客

img qq_net

《C#类设计手册》读书随笔

发表于2004/9/14 13:02:00  2419人阅读

分类: 开发工具

应该说是对了解一些基本概念十分好的书,虽然编写了这么长时间的C#程序,但翻了两天,也感觉有些东西可以吸取的。(权当这里作为读书笔记的摘要 ^_^)

几个缩写术语:
CTS  Common Type System 通用类型系统
CLS  Common Language Specification 公共语言规范
CLR Common Language Runtime 公共语言运行时
MSIL Microsoft 中间语言
GAC Global Assembly Cache 全局程序集缓存

Stack 栈 值类型使用
托管堆 类似C的堆,但不考虑释放,因此叫“托管”,Managed
               空间比栈大得多,但访问速度慢

.NET环境下,任何类型无论是值还是引用类型,都是对象 System.Object
.NET有3种值类型:基本类型,用户定义的值类型,struct和枚举类型

C#将string和object也列为基本类型,尽管它们都是引用类型
枚举(位标记)  System.Enum 实现了IFormattable
引用类型:类类型,委托(指向方法的类型,安全指针),数组,字符串

在C#中没有全局变量和全局函数

 委托的3个必须步骤:
1.  声明委托;
2. 创建委托对象,把它绑定到特定方法上;
3. 使用委托对象,调用这个方法

《C#字符串和正则表达式参考手册》对字符串处理说的比较深入,有时间值得一看。

装箱和取消装箱
装箱的对象包含值对象中的数据副本,如果装箱的对象修改了,不会影响原来的值对象。

常量,编译时确定的,在DLL中改变了需要重新编译调用了该DLL的对应程序集。

静态只读变量,运行期间确定其值
数据库连接信息等应放在配置文件中,面向部署

Equals()  .NET定义了两种形式的等价:引用等价,值等价
默认情况下,System.Object.Equals() 测试引用等价,但可以Override使其测试值等价。

System.Diagnostics中的StackFrame和StackTrace访问栈框架和栈跟踪。

方法类型:实例方法和静态方法。

ref 按引用传递,方法声明和调用同时使用ref关键字。

输出参数,与ref相似 out也是按引用传递

params 关键字 参数数组必须是方法声明中的最后一个参数,大量的字符串操作应使用
System.Text.StringBuilder

Try ... Catch ... Finally

属性和运算符
JIT编译器可以使属性的访问比字段的访问更快
属性是快速访问对象状态的一种技术。

静态属性

索引器
容器类,父子关系中的父,一对多关系
使用ArrayList代替数组增强功能

“运算符” 特殊的方法

构造函数和对象生命周期
销毁对象
把对象引用设置为null,并注意不再有对对象的其他引用,就可以显示销毁对象。

应用程序中的大量析构函数会对性能有负面的影响,处理对象销毁,首选方式利用
IDisposable接口,实现Dispose方法,以Finalize析构函数方法来执行,但不会中断垃圾回收
过程。

私有构造函数
静态构造函数

IClonable Clone 深拷贝   MemberWiseColone 浅拷贝

串行化和并行化
将对象串行化保存下来,这种技术广泛应用于恢复应用程序的状态,定期获取屏幕快照,保存对象等。

.NET Framework提供了丰富的XML串行化模型
xsd.exe 推断XML模式,XML架构/数据类型支持实用工具



事件和委托
基于事件的编程是.NET Framework的基石
.NET Framework中的事件机制使用了委托(回调)
事件作为一种常用的方法来解除事件源对象(生成事件的对象)与事件接收器对象(接受事件通知的对象)之间的耦合。

委托 类似于应用程序中指向对象中方法的指针
3个步骤:
1 声明委托类型
2 创建委托对象,并将该对象绑定指定方法上
3 使用委托对象来调用方法

.NET Framework支持两种类型的委托
单播委托:允许一个对象上调用一个方法
多播委托:允许在不同对象上调用一系列方法,维护一个调用对象

使用多播委托的步骤:
1 定义一个委托类型
2 编写具有相同签名方法作为委托
3 创建委托对象,将它绑定到需要通过委托调用的第一个方法
4 创建另一个委托对象,绑定到下一个需要调用的方法
5 System.Delegate类的Combine方法,合并成一个集成的多播委托

异步委托  可以在后台线程中调用的方法
调用委托实例三种方式:
1 同步调用,等待方法执行完毕,最常见
2 异步调用,等待方法执行完毕, EndInvoke(),但在方法执行完毕之前调用
3 异步调用,注册一个回调方法,一旦执行完毕,给出通知

事件的实现  使用委托存储订阅的事件处理方法,典型的Observer设计模式的一种实现
每个事件,必须指定下面两项内容:事件名,事件的签名(参数列表)

System.EventHandler 一个内置的委托
事件不能有返回类型,只能从事件源对象到事件接收方对象的单向信息流

静态事件 较少见,相对于一般事件

定义自己注册的方法
大多数情况下不需要定义定制的注册方法,但这种技术可以使代码最简洁和快速。
Framework中,大多数控件都使用定制的注册方法。

基类和子类不能引用同一个委托
继承和多态性  所有的面向对象语言都支持,多态性由继承支持,把一种类型的对象视作另一种类型的实例的多态性

基类定义为virtual,派生类就可以重写基类的操作
标记为非虚的方法不能重写
操作声明为virtual,可以重写该实现
操作声明为abstract,必须重写该实现

类 继承自System.Object
结构 继承自System.ValueType,继承自System.Object转换成它实现的接口类型,对于引用类型代替类型要小心,不能调用接口不支持的任何对象。


代码组织和元数据

共享程序集 全局程序集缓存  Global Assembly Cache (GAC)

程序集 可重用的最小单元

元数据 为公共语言运行时提供了在运行期间加载类型和调用方法所需的所有信息
metadata 是元编程的基础,在很多系统中也是根本的东西,了解这个东西可以比较深入的了解某个架构

查看元数据最简单方法使用ildasm.exe /adv或/advancel选项

.NET模块是一个可移植、可执行(PE)格式文件

只有数据的模块  SDK包含一个工具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部署。
私有程序集部署应用程序也不复杂,将需要的程序集合放在同一个文件夹或者用应用程序配置文件通知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,因此如果一个表单即使没有载入,如果调用Show方法也会直接将表单载入。

3. 当你需要在表单显示或者隐藏时运行某些代码,放在Activated和Deactivate比GotFocus和LostFocus事件中好。

4. 收到close的请求,表单先运行Closing事件中代码,再Closed代码,因此数据有效校验放在Closing中为好。

5. Hide方法,即使没有表单没有Load到内存中,当调用Hide时候也会将表单Load到内存中,但不显示。

0 0

相关博文

我的热门文章

img
取 消
img