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();
那么问题来了,输出什么内容呢???