STRUCT
- struct和class差不多,但是有一些不同:
- struct是值类型,class是引用类型
- struct不支持继承(除了隐式的继承了Object,具体点就是System.ValueType)
- class能有的成员,struct也可以有,但是以下几个不行:
- 无参构造函数(本身有,但是不可以重写)
- 字段初始化器
- 终结器(析构函数)
- virtual或protected(不支持继承所以没有了意义)
STRUCT的构建
struct有一个无参的构造函数,但是不能对其进行重写。它会对字段进行按位归零操作。
当你定义struct构造函数的时候,必须显示的为每个字段赋值。
不可以有字段初始化器(声明字段并初始化)
STRUCT例子
namespace @namespace
{
public struct Point
{
int x, y;
public Point(int x, int y)
{ this.x = x; this.y = y; }
}
class @class
{
public static void Main()
{
Point p1 = new Point(); //p1.x and p1.y will be0
Point p2 = new Point(1, 1); //p1.x and p1.y will be1
}
}
}
有三个错误的例子
public struct Point
{
int x = 1; //不可以赋值
int y;
public Point(){}; //不能有无参构造(隐式存在的)
public Point(int x){this.x = x} //必须都初始化(和参数的个数没有关系)
}
访问修饰符
public,完全可访问。enum和interface的成员默认都是整个级别
internal ,当前assembly或朋友assembly(友元程序集)可访问,非嵌套类的默认访问级别
private,本类和访问。class和struct的成员默认访问级别。
protected,本类或其它子类可以访问。
protected internal,联合了protected和internal的访问级别。
朋友程序集ASSEMBLY(友元程序集)
通过添加System.Runtime.CompilerServices.InternalsVisibleTo这个Assembly的属性,并指定友元程序集的名字,就可以把internal的成员暴露给友元程序集
[assembly:InternalsVisibleTo("Firend")]
如果友元程序集有Strong name,那么就必须指定其完整的160字节的public ker。
[assembly:InternalVisibleTo("StrongFried,publicKey=002xxxx….")]
类型限制成员的访问级别会
class C{public void Foo(){}}
以外层的访问修饰符为准,class默认是internal,即使Foo是public的,也不会公开访问
访问修饰符的限制
当重写父类的函数时,重写后的函数和重写的函数访问级别必须一致
即使不一致也没有关系,反正通不过不了编译 :)
不过有一个例外:当在其他Assembly重写protected internal的方法时,重写后的方法必须是protected。