常量、字段、和方法
1、常量 在C#中以下类型是基类型,可用于定义常量:Boolen、Char、Byte、SByte、Int16、Uint16 、Int32、UInt32、Int64、UInt64、Single、Double、Decimal和 String。 C#也可以定义非基元类型的常量变量,前提是把值设为null: using System; public sealed class SomeType { // SomeType is not a primitive type but C# does allow // a constant variable of this type to be set to ‘null‘. public const SomeType Empty = null; } 因为常量不会被改变,所以总是被视为类型定义的一部分,也就是说它被视为静态成员,而不是实例成员。 常量定义后从不变化的特性有以下需要注意的: 1、因为不会被改变,代码引用常量符号时,编译器在定义常量的程序集的元数据中查找该符号,提取常量的值,将值嵌入生产的IL代码中。 2、因为常量值内嵌到IL代码中,所以在运行时不需要分配内存。 3、又因为常量不需要分配内存,所以不能获取常量的地址,也不能以传递引用的方式传递常量。 这些限制意味着不能很好地支持跨程序集的版本控制。 ? 2、字段 字段是一种数据成员,其中容纳了一个值类型的实例或者对一个引用类型的引用。 CLR 支持类型字段和 实例字段。
下面是字段修饰符的详细说明: ? ?? 3、方法 3.1 实例构造器和类(引用类型) 构造器是将类型的实例初始化为良好状态的特殊方法。 创建引用类型的实例时:
引用类型的实例构造器又以下特点:
? 3.2 实例构造器和结构(值类型) CLR 总是允许创建值类型的实例,并且没有办法阻止值类型的实例化。 值类型构造器的特点:
// C# allows value types to have constructors that take parameters. public SomeValType(Int32 x) { // Looks strange but compiles fine and initializes all fields to 0/null. this = new SomeValType(); m_x = x; // Overwrite m_x‘s 0 with x // Notice that m_y was initialized to 0. }
? 3.3 类型构造器 CLR 支持类型构造器,也称为静态构造器(static constructors )、类型构造器(class constructors )、或者类型初始化器(type initializers )。类型构造器可应用于接口(C#编译器不允许)、引用类型、和值类型。 类型构造器特点:
internal sealed class SomeRefType { static SomeRefType() { // This executes the first time a SomeRefType is accessed. } } internal struct SomeValType { // C# does allow value types to define parameterless type constructors. static SomeValType() { // This executes the first time a SomeValType is accessed. } }
internal sealed class SomeType { private static Int32 s_x = 5; } 生成上述代码时,编译器自动为SomeType 生成一个类型构造器: internal sealed class SomeType { private static Int32 s_x; static SomeType() { s_x = 5; } }
? 4、扩展方法 学习扩展方法 的做好方式就是从例子中学习。扩展方法要定义在静态类中,并且在方法的第一个参数前 添加 this 关键字,第一个参数的类型和当前用于调用方法的那个表达式的类型匹配。
? ? 当编译器看到上面的代码时,就会先检查 StringBuilder 类或者它的任何基类是否提供了获取单个Char 参数、名为 IndexOf 的一个实例方法。如果是,就生成 IL 代码来调用它。如果灭有找到匹配的实例方法,就继续检查是否有任何静态类定义了名为 IndexOf 的静态方法,方法的第一个参数的类型和当前调用方法的那个表达式的类型匹配,而其该类型必须用 this 关键字标识。 扩展方法的原则: (这里只提几个重要的原则)
注意: 由于扩展方法实际是对一个静态方法的调用,所以CLR 不会生成代码对调用方法的表达式的值进行 null 值检查(不保证它非空)。扩展方法式 Microsoft 的 LINQ 技术的基础。 ExtensionAttribute 类 在C# 中一旦用this 关键字 标记了某个静态方法的第一个参数,编译器就会在内部向该方法应用一个定制特性。该特性会在最终生成的文件的数据中持久性的存储下来。 除此之外,任何静态类只要包含至少一个扩展方法,它的元数据中也会应用这个特性。类似地,任何程序集只要包含了至少一个符合上述特点的静态类,它的元数据中也会应用这个特性。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |