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 阅读(134)
评论(0) 编辑 收藏 引用