STRUCT

  • struct和class差不多,但是有一些不同:
    • struct是值类型,class是引用类型
    • struct不支持继承(除了隐式的继承了Object,具体点就是System.ValueType)
    • class能有的成员,struct也可以有,但是以下几个不行:
      • 无参构造函数(本身有,但是不可以重写)
      • 字段初始化器
      • 终结器(析构函数)
      • virtual或protected(不支持继承所以没有了意义)

STRUCT的构建

struct有一个无参的构造函数,但是不能对其进行重写。它会对字段进行按位归零操作。
当你定义struct构造函数的时候,必须显示的为每个字段赋值。
不可以有字段初始化器(声明字段并初始化)

STRUCT例子

  1. namespace @namespace
  2. {
  3. public struct Point
  4. {
  5. int x, y;
  6. public Point(int x, int y)
  7. { this.x = x; this.y = y; }
  8. }
  9. class @class
  10. {
  11. public static void Main()
  12. {
  13. Point p1 = new Point(); //p1.x and p1.y will be0
  14. Point p2 = new Point(1, 1); //p1.x and p1.y will be1
  15. }
  16. }
  17. }

有三个错误的例子

  1. public struct Point
  2. {
  3. int x = 1; //不可以赋值
  4. int y;
  5. public Point(){}; //不能有无参构造(隐式存在的)
  6. public Point(int x){this.x = x} //必须都初始化(和参数的个数没有关系)
  7. }

访问修饰符

  1. public,完全可访问。enuminterface的成员默认都是整个级别
  2. internal ,当前assembly或朋友assembly(友元程序集)可访问,非嵌套类的默认访问级别
  3. private,本类和访问。classstruct的成员默认访问级别。
  4. protected,本类或其它子类可以访问。
  5. protected internal,联合了protectedinternal的访问级别。

朋友程序集ASSEMBLY(友元程序集)

  1. 通过添加System.Runtime.CompilerServices.InternalsVisibleTo这个Assembly的属性,并指定友元程序集的名字,就可以把internal的成员暴露给友元程序集
  2. [assembly:InternalsVisibleTo("Firend")]
  3. 如果友元程序集有Strong name,那么就必须指定其完整的160字节的public ker
  4. [assembly:InternalVisibleTo("StrongFried,publicKey=002xxxx….")]

类型限制成员的访问级别会

  1. class C{public void Foo(){}}

以外层的访问修饰符为准,class默认是internal,即使Foo是public的,也不会公开访问

访问修饰符的限制

当重写父类的函数时,重写后的函数和重写的函数访问级别必须一致
即使不一致也没有关系,反正通不过不了编译 :)
不过有一个例外:当在其他Assembly重写protected internal的方法时,重写后的方法必须是protected。