第八章 方法

1. 概述

  本章重点讲述类型中的各种方法,包括实例构造器、类型构造器、操作符/类型转换重载、扩展方法、分部方法。

2. 名词解释

  ① 构造器:是允许将类型的实例初始化为良好状态的一种特殊方法。

3. 主要内容

  3.1 实例构造器和类(引用类型)

    ① 创建一个引用类型的实例时,首先为实例的数据字段分配内存,然后初始化对象的附加字段(类型对象指针和同步块索引),最后调用类型的实例构造器 来设置对象的初始状态。

    ② 实例构造器永远不能被继承。

    ③ 如果类的修饰符为static(sealed或abstract),编译器不会在类的定义中生成一个默认构造器。

  3.2 实例构造器和结构(值类型)

    ① 值类型的实例构造器只有在显示调用时才会执行。

  3.3 类型构造器

    ① 默认没有定义类型构造器,只能定义一个。

    ② 必须是static,默认是私有的。保证只能被CLR调用。

    ③ 不要在值类型中定义类型构造器。

    ④ 类型构造器中的代码只能访问类型的静态字段。

    ⑤ 显式类型构造器可能包含具有副作用的代码,所以需要精确拿捏运行的时间。

  3.4 操作符重载方法

    ① CLR规范要求操作符重载方法必须是 public 和 static 方法。

  3.5 转换操作符方法

    ① C#中,implicit关键字告诉编译器为了生成代码来调用方法,不需要在源码中进行显式转换。

      而explicit告诉编译器只有在发现了显式转型时,才调用方法。

      operator关键字告诉编译器该方法是一个转换操作符。

      operator之后是对象要转换成的类型,后面的括号中,是要从什么类型转换。

      *建议将System.Decimal作为一个典型来研究操作符重载和转换操作符方法。

public static implicit operator Rational (Single num)
{
        return new Rational(num);
}

public static explicit operator Int32 (Rational r)
{
        return r.ToInt32();
}
Rational r2 = 2.5F;
Int32 x = (Int32) r1;

  3.6 扩展方法

    C#的扩展方法,允许你定义一个静态方法,并用实例方法的语法来调用它。(在第一个参数前加this关键字)

    3.6.1 规则和原则

      ① C#只支持扩展方法,不支持扩展属性、扩展事件、扩展操作符等。

      ② 扩展方法必须在非泛型的静态类中声明。

      ③ 要求静态类本身具有文件作用域。

      ④要求引用所属的命名空间。

    3.6.2 用扩展方法扩展各种类型

      可以为委托或者枚举类型添加扩展方法。

    3.6.3 ExtensionAttribute类

      C#中,一旦用this关键字标记了某个静态方法的第一个参数,编译器就会在内部向该方法应用一个定制attribute。

  3.7 分部方法

    ① 只能在分部类或结构中声明。

    ② 只能返回void,不能有输出参数。

    ③ 声明和实现必须具有完全一致的签名。

    ④ 如果没有对应的实现部分,便不能在代码中创建一个委托来引用这个分部方法。

    ⑤ 总是被视为private方法。

4. 总结

  

原文地址:https://www.cnblogs.com/stone_lv/p/4306017.html