CLR笔记(二)

 

6.型和成

1.Class的可性有publicinternalpublic所有程序集都可internal仅对其所在的程序集可。默public的。

  2.友元程序集,

  使用friend assembly可以实现单测试,而不使用反射技

  的是按照命令行编译

  我测试用的是vs2005solution,如下:

  3.的可访问

  成private的,接口型的成都是public的。

  子重写父的成员时,原始成与重写成要有相同的可访问——C#束;CLR束是,重写成的可访问性不能更低。

  CLRC#是不一的,如表:

CLR术语 C#术语
Private private
Family protected
Family and Assembly
不支持
Assembly internal
Family
 or Assembly protected internal
Public public


  4.态类

  static只能用于class,不能用于struct,因CLR要求须实例化,而且不能控制例化程。

  C#态类束:

  静态类直接从System.Object派生

  静态类不能实现任何接口

  静态类只能定:字段,方法,属性,事件

  静态类不能用作:字段,方法,参数,局部量。

  在MSIL中,不会态类生成ctor,会将其标记为abstractsealed

  5.部分

   CLR不支持partial,只是C#法。所以某个型的源使用同一种编

  6.件,多和版本控制

  .NET版本号2.7.1.34,包含4个部分:主版本号,次版本号,内部版本号,修版本号。

   修版本,向后兼容,改内部/版本号;

   布新版本,不向后兼容,改/次版本号。

  多中,子重写父的虚方法,会引起版本控制问题,即父类发生改,其版本低于子版本,会致子为变化。

  C# 5个用于 / 的 影响件版本控制 的 关键字:

   abstract:用于/

   virtualoverride:用于成

   sealed:用于/。用于成员时用于重写了虚方法的方法。

   new,用于//常量/字段

  C#用虚方法:

   CLR许类中定多个"同名方法"仅仅是返回型不同,IL许这样做;C#不允,忽略返回型,相的用"转换操作符"实现IL中的"同名方法"

   用方法相MSIL

   一个是call,用来用静方法,例方法和虚方法。必要指定用方法的(于静方法)或者(例方法/虚方法),如果在该类/象中找不到方法,会检查其基来匹配方法。

   另一个是callvirt,用来例方法和虚方法,不能用于用静方法。必要指定用方法的象,如果null,会抛出NullReferenceException异常,意味着用前都会有外的null检查,从而比call慢一些。

   如下代所示:

    public sealed class Program
    {
        public Int32 GetFive()
        {
            return 5;
        }

        public static void Main()
        {
            Program p = null;
            Int32 x = p.GetFive();  //C#,使用callvirt,会抛出NullReferenceException异常
        }
    }

   C#编译器中,使用callvirt用所有例方法(包括虚方法),使用call用所有静方法。于其他的编译器,一点不能保,所以在虚方法和非虚方法之而不重新编译,会生无法预测问题

   C#使用call而不用callvirt用虚方法的特例:ToString下:

    internal class SomeClass
    {
        public override string ToString()
        {
            return base.ToString();
        }
    }

   这时候,生成callIL。因如果使用callvirt,意味着这时一个虚方法,从而递归执方法,直到AppDomain的堆溢出。

   在值类型定的方法,使用call是因,首先,值类型是密封的,从而不存在虚方法;另外,值类型永不会null,所以永不会抛出NullReferenceException异常;再者,如果使用callvirt,就要使用装箱机制,性能会有极大影响。

   在设计class程中,要尽量少定虚方法。取代法:可以定方法,其中最复杂的方法虚化,而将所有有用的重非虚化,示例如下:

    public class Set
    {
        private Int32 m_length = 0;

        //个有用的重是非虚
        public Int32 Find(Object value)
        {
            return Find(value, 0, m_length);
        }

        //个有用的重是非虚
        public Int32 Find(Object value, Int32 startIndex)
        {
            return Find(value, 0, m_length - startIndex);
        }

        //功能最丰富的方法是虚,可以被重写
        public Int32 Find(Object value, Int32 startIndex, Int32 endIndex)
        {
            .//具体
实现
        }
    }

   sealed闭类尽量使用。将sealed非密的容易,反之困;性能也快,因sealed一定是非虚的,从而编译器不用考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值