结构类型

  第 8 章 提到过,结构和类非常相似,但结构是值类型,而类是引用类型。这意味着什么?最简明的方式是用一个示例来说明。

  试一试:类和结构:Ch09Ex03\Program.cs

  (1)在 C:\BegVCSharp\Chapter09 目录中创建一个新控制台应用程序项目 Ch09Ex03

  (2)修改代码,如下所示:

  1. namespace Ch09Ex03
  2. {
  3. class MyClass
  4. {
  5. public int val;
  6. }
  7. struct myStruct
  8. {
  9. public int val;
  10. }
  11. class Program
  12. {
  13. static void Main(string[] args)
  14. {
  15. MyClass objectA = new MyClass();
  16. MyClass objectB = objectA;
  17. objectA.val = 10;
  18. objectB.val = 20;
  19. myStruct structA = new myStruct();
  20. myStruct structB = structA;
  21. structA.val = 30;
  22. sturctB.val = 40;
  23. Console.WriteLine("objectA.val = {0}", objectA.val);
  24. Console.WriteLine("objectB.val = {0}", objectB.val);
  25. Console.WriteLine("structA.val = {0}", structA.val);
  26. Console.WriteLine("structB.val = {0}", structB.val);
  27. Console.ReadKey();
  28. }
  29. }
  30. }
  示例的说明

  这个应用程序包含两个类型定义。一个是结构 myStruct 的定义,它有一个公共 int 字段 val,另一个是类 MyClass 的定义,它包含一个相同的字段(第 10 章介绍类的成员,如字段,现在只要知道它们的语法是相同的即可)。接着对这两种类型的实例执行相同的操作:

  (1)声明类型的变量。

  (2)在这个变量中创建该类型的新实例。

  (3)声明类型的第二个变量。

  (4)将第一个变量赋给第二个变量。

  (5)在第一个变量的实例中,给 val 字段赋予一个值。

  (6)在第二个变量的实例中,给 val 字段赋予一个值。

  (7)显示两个变量的 val 字段值。

  尽管对两种类型的变量执行了相同的操作,但结果是不同的。在显示 val 字段的值时,两个 object 类型具有相同的值,而结构类型有不同的值。为什么会这样?

  对象是引用类型。在把对象赋给变量时,实际上是把带有一个指针的变量赋给了该指针所指向的对象。在实际代码中,指针是内存中的一个地址。这种情况下,地址是内存中该对象所在的位置。在用下面的代码行把第一个对象引用赋给类型为 MyClass 的第二个变量时,实际上是复制了这个地址。

  1. MyClass objectB = objectA;

  这样两个变量就包含同一个对象的指针。

  结构是值类型。其变量并不是包含结构的指针,而是包含结构本身。在用下面的代码把第一个结构赋给类型为 myStruct 的第二个变量时,实际上是把第一个结构的所有信息复制到第二个结构中。

  1. myStruct structB = structA;

  这个过程与本书前面介绍的简单变量类型(如 int)是一样的。最终的结果是两个结构类型变量包含不同的结构。使用指针的全部技术隐藏在托管 C#代码中,这使得代码更简单。实用 C#中的不安全代码可以执行低级操作,如指针操作,但这是一个比较高级的论题,这里不予以讨论。