常量:数据值恒定不变的符号
字段:可读也可写的数据值
属性:用简单的字段风格设置或查询对象的逻辑状态
无论什么编程语言,编译器都能将源代码解析成元数据和IL语言,所有生成元数据的格式都是一样的,这就是为什么CLR成为“公共语言进行时”的原因,因为元数据是所有语言都生成和是使用的公共信息。所以正是有来元数据,我们才能无缝的在写一种语言的同时接壤另一种语言。
· class 类型演示
{
//嵌套类
private class SomeMestedType
{
}
//常量,可读,静态字段
private const Int32 c_SomeConstant = 1;
private readonly String m_SomeReadOnlyField = "2";
private static Int32 s_SomeReadWriteFied = 3;
//构造函数(实例构造器)
public 类型演示(Int32 x)
{
}
//实例属性
public Int32 SomeProp
{
get { return 0; }
set { }
}
//实例有参属性(索引器)
public Int32 this[String s]
{
get { return 0; }
set { }
}
//事件
public event EventHandler SomeEvent;
}·
友元程序集
当需要使用另一个程序集,而该程序集都是Internal的时候,使其标记为友元。
生成程序集的时候,引入引用空间System.Runtime.CompilerServices的InternalsVisibleTo,这样就能标记声明它是友元
- 创建两个Project
- 在B中添加A的引用
- 将B中的类的类型设置为Internal
- 在B中添加
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("TestA")]
成员的可访问性
- private(只能由本类访问)
- ptotected(在子类)
- internal(在当前project)
- protected internal(同时拥有前两个的权限)
public(任何程序集都可以访问)
**在C#中,编译器总是默认Private限制(并不全部,例如接口就是Public)
**在子类重写父类方法时候,访问限制要保持统一
静态类
- 静态类只能定义静态字段,属性,方法,事件
- 静态类不能继承任何接口(继承接口就会有方法,方法就需要实例去调用,而静态类是没有实例的)
- 静态类毋庸置疑是System.Object直接派生的
- 通过反编译可以得出静态类是没有构造函数的(.ctor)
分布类,结构,接口
Partial是局部类型的意思。允许我们将一个类、结构或接口分成几个部分,分别实现在几个不同的.cs文件中。C#编译器在编译的时候仍会将各个部分的局部类型合并成一个完整的类,我们发现新建的Form类中会出现public partial class Form1 : Form
源代码控制
当代码量非常巨大的时候,代码经常会被Check out来进行修改,别的人就无法同时修改,使用Partial关键字就可以实现在不同的代码文件中代码拆分
一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起- 将类和结构分解成不同的单元
有时候一个类会有多个功能单元,然而分部类型可以每个类都只含有一个功能,这样大妈会显得简化。同样可以方便对功能的增改
组件、多态和版本控制
组件软件编程是OOP发展到极致的成果:.NET Framework中的版本号包含4个部分:主版本号(major version)、此版本号(minor version)、内部版本号(build number)、修订号(revision)。假定某公司发布了版本号为2.7.0.0的程序集。之后为了修复该版本的Bug,他们可以生成一个新的程序集,并只改动版本号的bulid/revision部分,这样,他们发布的版本就是2.7.1.34.这表明该版本只是一个维护版本。
**在设计类型时,最好的办法就是使最复杂的方法设为虚方法,使所有重载的简便方法设为非虚方法
**作者一些好的编码习惯
- 总是显示的给类添加seald关键字对类进行密封
- C#默认给类添加的是internal访问限制
- C#默认给字段设为private
- 在类的内部,总是将自己的方法,属性,事件设为private和非虚。当你要公开某种功能的时候可以讲其方法设为公开public