struct Date
{
byte year;
byte month;
byte day;
public Date(byte yy, byte mm, byte dd)
{
this.year=yy;
this.month = mm;
this.day = dd;
}
public Date(byte yy ,byte mm)
:this(yy,mm,1)
{
}
public Date(byte yy)
{
this.year=yy;
this.month=1;
this.day =1;
}
}
class Brithday
{
byte year;
byte month;
byte day;
public Brithday (byte yy,byte mm,bytedd)
{
this.year=yy;
this.month=mm;
this.day=dd;
}
public Brithday(byte yy, byte mm)
:this(yy,mm,1)
{
}
public Brithday(byte yy)
{
this.year=yy;
}
}
对于C#中的值类型和引用类型,查阅了相关资料后,来谈一下自己的理解:实际上,我们可以将值类型和引用类型同堆栈的关系比作仓库与仓库中堆放的物品,我们对物品的箱子进行编号,再将编号记录在一个本子上面,那么这个本子就是栈,仓库就是堆.对于本子上的数据进行操作,并不影响物品的情况,这种类型就是值类型,类似于VB中的按值传递;而如果对仓库里面的物品进行操作的话,那么物品就会发生相应的变化,这种类型的就是引用类型,类似于VB中的按址传递;
如:对例1中定义的结构作如下操作:
// 使用结构
static void UseStruct()
{
Date labourDay = new Date(5, 1);
Date yaoMingBirth = labourDay;
labourDay.ReadDate();
yaoMingBirth.ReadDate();
yaoMingBirth.Change(1980, 11, 8);
labourDay.ReadDate();
yaoMingBirth.ReadDate();
}
显示结果:
5-1
5-1
5-1
1980-11-8
修改其中一个变量的值,不会影响和它同一个拷贝的另外一个变量。
如:对例1中定义的类进行如下操作:
// 使用类
static void UseClass()
{
Birthday myBirth = newBirthday(1987, 6, 12);
Birthday liliBirth = myBirth;
myBirth.ReadDate();
liliBirth.ReadDate();
myBirth.Change(1990, 3, 16);
myBirth.ReadDate();
liliBirth.ReadDate();
}
显示结果:
1987-6-12
1987-6-12
1990-3-16
1990-3-16
修改一个引用的值,另一个相同的引用的值就会发生改变。
也就是说:结构是值类型数据.存储在栈(stack)中。结构进行数据复制的时候,是将原来数据进行备份。创建结构时,结构赋值到的变量保存该结构的实际数据。将结构赋给新变量时,将复制该结构.因此,新变量和原始变量包含同一数据的两个不同的副本。 对一个副本的更改不影响另一个副本。而引用类型恰好相反.
联系VB我们可以想到,对于C#中的值类型和引用类型,我们可以将它们看成VB中的按值传递和按参数传递.C#中的引用类型相似于VB中的按地址传递,而值类型则类似于C#中的按值传递.