C#入门经典之构造类型与类的区别

C#入门经典之结构类型与类的区别

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class MyClass
    {
        public int val;
    }
    struct myStruct
    {
        public int val;
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyClass objectA = new MyClass();
            MyClass objectB = objectA;
            objectA.val = 10;
            objectB.val = 20;
            myStruct structA = new myStruct();
            myStruct structB = structA;
            structA.val = 30;
            structB.val = 40;
            Console.WriteLine("objectA.val = {0}", objectA.val);
            Console.WriteLine("objectB.val = {0}", objectB.val);
            Console.WriteLine("structA.val = {0}", structA.val);
            Console.WriteLine("structB.val = {0}", structB.val);
            Console.ReadKey();
        }
    }
}

 运行结果如下:


C#入门经典之构造类型与类的区别
 示例的说明 

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

  声明类型的变量。

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

  声明类型的第二个变量。

  把第一个变量赋给第二个变量。

  在第一个变量的实例中,给val字段赋一个值。

  在第二个变量的实例中,给val字段赋一个值。

  显示两个变量的val字段值。

尽管对两种类型的变量执行了相同的操作,但结果是不同的。在显示val字段的值时,两个object类型有相同的值,而结构类型有不同的值。为什么会这样?对象是引用类型。在把对象赋给变量时,实际上是把带有一个指针的变量赋结了该指针所指向的对象。在实际代码中,指针是内存中的一个地址。在这种情况下,地址是内存中该对象所在的位置。在用下面的代码行把第一个对象引用赋给类型为MyClass的第二个变量时,实际上是复制了这个地址。

MyClass objectB = objectA; 

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

myStruct structB = structA; 

这个过程与本书前面介绍的简单变量类型如int 是一样的。最终的结果是两个结构类型变量包含不同的结构。使用指针的全部技术隐藏在托管C#代码中,它使得代码更简单