zoukankan      html  css  js  c++  java
  • <NET CLR via c# 第4版>笔记 第6章 类型和成员基础

    6.1 类型的各种成员

    6.2 类型的可见性

    • public 全部可见

    • internal 程序集内可见(如忽略,默认为internal)

    • 可通过设定友元程序集,允许其它程序集访问该程序集中的所有internal 类型.例如想允许强命名"Microsoft"程序集访问本程序集内的internal类型:

    using System.Runtime.CompilerServices;
    [assembly: InternalsVisibleTo("Microsoft,PublicKey=b77a5c56...1934e089")]
    

    6.3 成员的可访问性

    • private 成员只能由定义类型或任何嵌套类型中的方法访问

    • protected 成员只能由定义类型、任何嵌套类型或者不管在什么程序集中的派生类型中的方法访问

    • internal 成员只能由定义程序集中的方法访问

    • protected internal 成员可由任何嵌套类型、任何派生类型(不管在什么程序集)或者定义程序集中的任何方法访问

    • public 成员可由任何程序集的任何方法访问

    • C#中,如果没有显式声明成员的可访问性,编译器通常(但并不总是)默认选择private(限制最大的那个)。

    • 派生类重写基类型定义的成员时,C#编译器要求原始成员和重写成员具有相同的可访问性。

    6.4 静态类

    • 静态类必须直接从基类System.Object派生。

    • 静态类不能实现任何接口。

    • 静态类只能定义静态成员(字段、方法、属性和事件)

    • 静态类不能作为字段、方法参数或局部变量使用。

    6.5 分部类、结构和接口

    • partial关键字告诉C#编译器:类、结果或接口的定义源代码可能要分散到一个或多个源代码文件中(C#编译器实现,和CLR无关)。

    6.6 组件、多态和版本控制

    C#关键字类型方法/属性/事件
    abstract表示不能构造该类型的实例表示为了构造派生类型的实例,派生类型必须重写并实现这个成员
    virtual(不允许)表示这个成员可由派生类型重写
    override(不允许)表示派生类型正在重写基类型的成员
    sealed表示该类型不能用作基类型表示这个成员不能被派生类型重写,只能将该关键字应用于重写虚方法的方法
    new应用于嵌套类型、方法、属性、事件、常量或字段时,表示该成员与基类中相似的成员无任何关系

    6.6.1 CLR如何调用虚方法、属性和事件

    • call 该IL指令可调用静态方法、实例方法和虚方法。

    • callvirt 该IL指令可调用实例方法和虚方法,不能调用静态方法。

    • callvirt以多态方式调用虚实例方法,调用时,JIT编译器会验证变量的值是否为NULL,执行速度比call指令稍慢。

    • c#团队认为,JIT编译器应生成代码来验证发出调用的对象不为null.所以,C#用 callvirt 指令调用所有实例方法。

    • 如果使用C#外的其它语言,定义了非虚方法后,将来永远都不要把它更改为虚方法。这是因为某些编译器会用 call 而不是 callvirt 调用非虚方法。如果方法从非虚变成虚,而引用代码没有重新编译,会以非虚方式调用虚方法,造成应用程序无法预料。

    • 设计类型时应尽量减少虚方法数量,因为:

      • 调用虚方法的速度比调用非虚方法慢;
      • JIT编译器不能内嵌(inline)虚方法,这进一步影响性能;
      • 虚方法使组件版本控制变得更脆弱;
      • 定义基类型时,经常要提供一组重载的简便方法(convenience method)。如果希望这些方法是多态的,最好的办法就是使最复杂的方法成为虚方法,使所有重载的简便方法成为非虚方法。

    6.6.2 合理使用类型的可见性和成员的可访问性

    • 尽量使用关键字 sealed 将类显式标记为密封,性能优于非密封类。

    • 尽量将类指定为 internal (C#编译器默认使用的就是 internal)

    • 类的内部,将数据字段定义为 private (C#默认),除了public,尽量连protected和internal也不用。

    • 类的内部,避免使用protected或internal,因为这会使类型面临更大的安全风险。virtual永远最后才考虑。

    6.6.3 对类型进行版本控制时的虚方法的处理

    返回目录

  • 相关阅读:
    20100720 14:14 转:BW十日谈之标准数据源
    BW会计年度期间转换出错
    SQL Server 2005 Logon Triggers 详细介绍
    作业输出文档维护
    windows 系统监视器 以及建议阀值
    linkedserver 的使用
    DAC 连接数据库需要做些什么
    SQL Server 2008新特性 Merge 详细见联机手册
    【20110406】提高数据库可用性需要注意的问题
    索引迁移
  • 原文地址:https://www.cnblogs.com/harry-wang/p/6866055.html
Copyright © 2011-2022 走看看