常量 :数据值恒定不变的符号。(逻辑实质是静态static成员,所以与类型关联,不与实例关联)程序员
字段 :read/write的数据值。编程
操做符重载 :实质是方法,其中定义了当操做符做用于该类型的对象时,应该如何操做该对象。(不是全部编程语言都支持该函数方法,因此非CLS一部分)安全
转换操做符 :实质是方法,其中定义了如何隐式或显式将类型的对象从一种类型转型为另外一种类型的方法。(不是全部编程语言都支持该函数方法,因此非CLS一部分)编程语言
属性 :属性容许用简单的、字段风格的语法设置(set)或查询(get)类型或对象的逻辑状态,同时保证状态不被破坏。(C++中没有,特别注意)ide
(编译器会为上述每种成员都生成 元数据 和 IL代码 全部编程语言生成的元数据格式彻底一致,这样 CLR 才能成为 公共语言运行时 。)
(元数据 :是全部语言都生成和使用的公共信息,正由于有它,用一种语言写的代码才能无缝访问用另外一种语言写的代码, Microsoft.NET Framework 开发平台的关键,实现了编程语言类型和对象的无缝集成。)函数
using System; public sealed class SomeType { //嵌套类 private class SomeNestedType{} //常量、只读和静态可读/可写字段 private const Int32 c_SomeConstant = 1; private readonly String m_SomeReadOnlyField = "2"; private static Int32 s_SomeReadWriteField = 3; //类型构造器 public SomeType(Int32 x){} public SomeType(){} //实例方法和静态方法 private String InstanceMethod() { return null;} public static void Main(){} //实例属性 public Int32 SomeProp { get{ return 0;} set{} } //实例有参属性(索引器) public Int32 this[String a] { get{ return 0;} set{} } //实例事件 public event EventHandler SomeEvent; }
using System; using System.Runtime.CompilerServices; //当前程序集中的internal类型可由如下两个程序集中的任何代码访问(无论什么版本或语言文化) [assembly:InternalsVisibleTo("Wintellect, PublicKey = 12345678...90abcdef")] [assembly:InternalsVisibleTo("Microsoft, PublicKey = b77a5c56...1934e089")] internal sealed class SomeInternalType {...} internal sealed class AnotherInternalType {...}
using System; internal sealed class Foo { private static Object SomeMethod() { //这个"这个Winteleect"程序集能访问另外一个程序集的internal类型,就好像那是public访问限制的。 SomeInternalType sit = new SomeInternalType(); return sit; } }
private :成员只能由定义类型或任何嵌套类型中的方法访问。(类中成员不加访问限制,默认都是private,如非必要都将字段设为private来确保安全性)性能
protected :成员只能由定义类型、任何嵌套类型或者无论在什么程序集中的派生类型中的方法访问。(如非必要不要设置,可能会形成类之间的过分耦合和预期以外的结果。)ui
internal :成员只能由定义程序集中的方法访问。this
protected internal :成员可由任何嵌套类型、任何派生类型(无论在什么程序集中)或者定义程序集中的任何方法访问。spa
public :成员可由任何程序集中的任何方法访问。(当须要公开类型中的某些方法和字段时使用,尽可能不要使用,不然会形成类型不安全,会被外部操做破坏。)
(从基类派生时,只能放宽访问的限制:如private ——>public,而不能相反收紧限制,由于派生类型必需要可以转化为基类型使用(多态性))
静态类只能由基类派生。(这意味着静态类不适用于继承体系,由于继承只适用于对象,而不能建立静态类的实例。)
静态类不能实现任何接口。(由于只有使用类的实例时,才可调用类的接口方法,而静态类不能建立实例。)
静态类只能定义静态成员。 (调用静态构造器对该静态类初始化。)
静态类不能做为字段、方法参数或局部变量使用。(由于它们都表明引用了实例的变量。)
组件(.NET Framework中称为程序集)有已经发布的意思。
组件永远维持本身的标识,.NET中使用动态连接
组件清楚指明它所依赖的组件(引用源数据表)
组件应编档它的类和成员
组件必须制定它须要的安全权限
组件要发布在任何“维护版本”中都不会改变的接口
virtual :虚函数声明,不可用于类型,只能用于方法成员,表示该成员可由派生类型重写(不强制重写,区别于abstract,成员方法不能只声明,要有主体实现。)
(虚函数调用性能很低,同时由于它会放弃不少控制,丧失独立性,应该是不得已的选择。)
override :只能用于方法成员,表示派生类型正在重写基类型的成员。
sealed :密封
数据字段应该优先设为private,尽可能少用protected、internal、public。由于状态一旦公开,就很容易产生问题,形成对象的行为没法预测,留下未知或是严重的安全隐患。
类的内部设计中,应尽可能将方法、属性和事件定义为private和非虚的。只有在须要公开类型的某些功能时,才会将对应成员设为public,以便公开给外界使用,protected和internal是次级选择,virtual永远是最后才考虑的,虚方法会放弃不少控制,丧失独立性。
若是类型要做为基类型使用,增长或是修改它的成员必须很是当心。
namespace CompanyA { public class Phone { public void Dial() { Console.WriteLine("Phone.Dial"); EstablishConnection(); //在这里进行拨号操做 } protected virtual void EstablishConnection() { Console.WriteLine("Phone.EstablishConnection"); //在这里执行创建链接的操做 } } } namespace CompanyB { public class BetterPhone : CompanyA.Phone { //保留关键字new,指明该方法与基类型中的Dial方法没有关系。 public new void Dial() { Console.WriteLine("BetterPhone.Dial"); EstablishConnection(); base.Dial(); } //为这个方法添加关键字new,指明该方法与基类型的EstablishConnection方法没有关系。 protected new virtual void EstablishConnection() { Console.WriteLine("BetterPhone.EstablishConnection"); //在这里执行创建链接的操做。 } } }
BetterPhone.Dial BetterPhone.EstablishConnection Phone.Dial Phone.EstablishConnection