posts - 43,comments - 3,trackbacks - 0

1.在继承方面,C++中的名字覆盖规则(子类覆盖父类的名字)在C#2.0中并不成立。在C#中提供了 new/ virtual/ override等关键字

    class B
    {
        public virtual void f()
        {
            Console.WriteLine("B::f()");
        }
    }

    class D : B
    {
        public void f(int i)
        {
            Console.WriteLine("D:f(int i)");
        }
    }

    class E : D
    {
        public override void f()
        {
            Console.WriteLine("E:f()");
        }
    }

D d = new E();
d.f() 仍然是可见的,且调用 E::F();

2.C#中的嵌套类是外部类的友元,外部的private 成员对它也是可见的, C#中没有java的inner class的概念,等价于java中的 static class。而C#中的static class 为静态工具类,只含有static 方法,见9.。

class A
{
int _i;

class B
{
B(A a)
{
a._i = 10;//访问
}

}//end B

}//end A

3.C#在构造期间 调用virtual 函数会被 转发到类继承体系中的最远端, 区别于C++。

4.利用sealed, 或者new 可以终止掉成员函数virtual 关系的延续。

    partial class Program
    {
        static void Main(params string[] args)
        {
            B b;
            D d;

            E e;

            e = new E();

            b = d = e;

            b.f(); // B::f
            d.f(); // E::f
            e.f(); // E::f
        }

    }

    class B
    {
        public virtual void f()
        {
            Console.WriteLine("B::f()");
        }
    }

    class D : B
    {
       
        public new  virtual void f()
        {
            Console.WriteLine("D:f()");
        }
    }

    class E : D
    {
        public override void f()
        {
            Console.WriteLine("E:f()");
        }
    }


5.C#构造函数的ctor initializer list中可以出现的只有 this(...), base(...)

6.C#属性不可以作为 out,ref 参数传递;out ,ref两者在函数重载中的效果等价:  void f(out int i), 与 void f(ref int i) 不能构成重载, 但与void f(int i)去构成重载

7.C#关键字partial 用于 类的定义放到 多个.cs文件中:a.用于自动代码生成;b.用于将某个类的多个嵌套类分开,使达到一个文件一个类的原则。

8.C#函数的变参 使用 params , 而不是 (...)。

9.C#中的static 类相当于 只含有static 方法的工具类, 且为sealed, 不能含有非静态数据成员

10. C#中const成员默认为 static的,readonly成员可以有static或者非static的, 但只能在ctor中修改其值。

11.属性中的 set / get 其中一个且仅一个是可以重新指定 访问权限的,但权限必须低于属性本身指定的。
public int I
{
private set
{
.....
}

get
{
return 0;
}
}


**协变 与 逆协变?

  class B
    {
    }

    class D : B
    {
    }

    class A
    {
        public virtual void f(B b)
        {

        }
    }

    class A1 : A
    {
        public override void f(D b) //error, 错误的override
        {
            base.f(b);
        }
    }

posted on 2008-12-31 23:10 RUI 阅读(125) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理