您的位置:首页 > 编程语言 > C#

C# struct(结构)与按值复制、按索引复制详解

2015-09-23 15:33 316 查看
struct是结构(structure)的简写,struct看上去与类非常相似,它们也有字段和属性。例如:
public struct Test_struct : IDisposable{
public int Strength;
public int Speed{ get; private set;}

public void HelloWorld(){
System.Console.WriteLine("Hello World!");
}
}
<strong><span style="font-family:SimHei;font-size:14px;color:#ff0000;">但是却不是对象!</span></strong>

struct可以实现接口,不过不能派生其他类。struct不能作为父类派生子类。struct不能继承其他类或struct,也不能被其他类或struct继承。最适合用来存储数据。

struct与对象最大的差别在于struct是按值复制而不是按引用复制。那么什么是按值复制,什么又是按引用复制呢?稍等!

OK,那么到底struct(结构)有什么用呢,我们凭什么用它呢?

在回答这些问题之前,需要我们首先了解什么是值类型,什么是对象类型?

·首先,例如int,bool或者string类型的就叫做值类型;而如List、Stream、Exception或者我们自己编写的类就叫做对象类型;那么,这儿有一个问题,如何去判断一个类型是值类型还是对象类型呢?(需要自己探索)

·其次,对于值类型和对象类型,申明方法都是一样:

int int1 = 3;
string string2 = "Hello world!";
List<int> list = new List<int>();
对于不清楚什么是类型、对象、变量的童鞋可以查看我的另外一篇博客:<a target=_blank href="http://blog.csdn.net/u013180863/article/details/47297075">C#中变量与对象、类型与类之间的区别</a>


OK,下面开始讲解按值复制与按对象复制:

了解过C#存储机制的童鞋应该知道(不了解也没关系),当我们申明一个变量时,在内存中就会开辟出一块地方,用于我们变量的存储,这块地方叫做堆。上面讲过对于值类型和对象类型,申明方法都是一样,但是开始赋值时,就会产生区别,值类型都是通过复制完成赋值,这个过程叫做按值复制,如下:

int i = 3;
int j = i;
对应图示如下图所示:



但是对于对象赋值,则是指定引用,而不是具体的值,如下:

List<int> list1 = new List<int>();
list1.add(1);
list1.add(2);
list1.add(3);
List<int> list2 = list1;
list2.add(4);
foreach(int i in list1)
System.out.Println(i);
具体图示如下:



最后输出:1 2 3 4

那么,这个过程就叫做按索引复制,可以看出,按索引复制会改变所指向的对象。

根据上述所述,我们应该知道了为什么需要一个struct,就是因为类是按索引复制,而struct是按值复制。在我们编写程序的过程中,经常需要存储很多不同内容的地方(属性和方法等),而且这个地方不能通过其他引用而改变它的内容。这个时候struct就是用武之地。

举个例子:

下面一个简单的struct记录了一只狗的情况,它看上去像个对象,但并不是。

public struct Dog{
public string Name;
public int Age;
public Dog(string name, int age){
this.Name = name;
this.Age = age;
}
public void Speak(){
Console.WriteLine("My name is {0} and I' am {1}", Name, Age);
}
}
完全复制这个Dog struct,不过将struct替换为class,然后把Dog换成Cat。建立Dog和Cat的一些副本。

下面是Main()方法的代码:

Cat marry = new Cat("Marry",2);
Cat bob = marry;
bob.Name = "Bob";
bob.Age =3;
spot.Speak();

Dog hoho = new Dog("HoHo", 4);
Dog bet = hoho;
bet.Name = "Bet"
bet.Age = 5;
hoho.Speak();

Console.ReadKey();


那么问题来了,输出什么内容呢???
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息