先说一下结构体和类的区别:
1,结构体定义的是变量,保存在栈当中。类的对象(实例)保存在堆当中,引用保存在栈当中。结构体是值类型,类是引用类型。
2,不能在结构体中定义默认的构造方法(无参);类中可以定义。
3,结构体中自定义构造方法后,编译器会提供默认的构造方法,但是类就不会提供了。
4,在结构体中的非默认构造方法中必须对结构体所有的字段进行初始化,否则会报错
5,在类中声明字段的同时,可以初始化字段的值,但在结构体中不可以。
C#结构体,里面的成员默认为privite,而C和C++默认都是public的。
C#结构体,有一个默认的无参空构造函数,在声明了有参构造函数后,可以继续使用无参构造函数
struct Date
{
public int year, month, day;
public Date(int y, int m, int d)
{
year = y;
month = m;
day = d;
}
};
Date d1;
d1 = new Date();
Console.WriteLine(d1.year);
d1 = new Date(2000,10,12);
Console.WriteLine(d1.year);
可以不用new来生成,因为struct定义的是变量不是对象,但是class类必须用new,不然不能使用。
Date d1;
d1.day = 3;
d1.month = 5;
d1.year = 1900;
Console.WriteLine(d1.year);
因为struct定义的是变量,不是对象,所以改变d1的值不会引起d2的改变,用d1给d2赋值时,必须确保d1的所有成员已经赋了初值,不然会报错。
Date d1;
d1.year = 1900;
d1.month = 1;
d1.day = 1;
Date d2 =d1;
Console.WriteLine(d1.year);
Console.WriteLine(d2.year);
d1.year = 2000;
d1.month = 12;
d1.day = 12;
Console.WriteLine(d1.year);
Console.WriteLine(d2.year);
如果是显示调用构造函数进行初始化,这样所有的成员已经被初始化完毕(默认空构造也是),可以直接给d2赋值。大家可以自己尝试着写一下。
同样,赋值后改变d1,不会对d2造成影响。
Date d1 = new Date();
Console.WriteLine(d1.year);
Date d2 = d1;
Console.WriteLine(d2.year);
d1.year = 2100;
Console.WriteLine(d1.year);
Console.WriteLine(d2.year);
如果要对成员进行初始化,必须对所有的成员进行初始化
struct Date
{
public int year, month, day;
public Date(int y, int m, int d)
{
year = y;
month = m;
day = d;
}
public Date(int y, int m)//会报错,因为day没有被初始化,此时可以赋一个默认初值0, day=0;
{
year = y;
month = m;
}
};