当前位置:编程学习 > C#/ASP.NET >>

不可不知的C#基础–从 struct 和 class的异同 说开去

 

我知道很多人都讨论过这个问题, 多我一个不多, 少我一个不少.

最近有人又问到这个问题, 所以想再说说. 万丈高楼平地起, 地基很重要. 懂了的人不要嫌罗嗦, 欢迎补充或者纠正.

从起源/定义说起

Struct 从C 的时代就已经有了(向丹尼斯.里奇致敬), 它是Structure 的缩写-- 就是结构的意思. 它是一种最初级的数据结构, 它包含一到多个相同类型或不同类型的值或者变量. 它就像是一个存储数据的"包".

 

Class(类) 是有了面向对象概念之后才有的, 它"是创建对象的蓝图,描述了所创建的对象共同的属性和方法".

 

从它们被创立的用途可以看出Class 比Struct 负担了更大的使命.

类从出生的那天就被赋予了一个伟大的使命: 模拟真实世界的行为, 拥有继承和多态两种利器.

Struct 到了C#这个领域中有了一个进化, 它甚至可以实现接口(当然,这个也是C时代没有的东西), 在本文中会有一个简单的介绍.

 

值类型VS 引用类型

在.net 世界中, System.Object "支持.NET Framework 类层次结构中的所有类,并为派生类提供低级别服务。 这是.NET Framework 中所有类的最终基类;它是类型层次结构的根。" 从Object再衍生出所有类、结构、枚举和委托。

看看下面这个图对net中两大类型的描述, -- 当然还有一种"指针类型",在这里我们不予讨论.

 

chappell5fig01

 

Struct 是属于值类型这个阵容, 而所有class 都是引用类型.

这意味着什么?

 

当我们使用等号"赋值"时, 对于Struct而言就是将同样的值复制给另一个变量; 而对于Class而言就只是将它们的名字指向同一个对象.

 

看下面的实例:

class FooClass

{

    public int FooValue;

}

struct FooStruct

{

    public int FooValue;

}

 

 

class Program

{

 

    static void Main(string[] args)

    {

        FooClass classObj = new FooClass();

 

        classObj.FooValue = 0;

 

        FooClass classObj2 = classObj;

 

        classObj2.FooValue = 1;

 

        FooStruct structObj = new FooStruct();

 

        structObj.FooValue = 0;

 

        FooStruct structObj2 = structObj;

       

        structObj2.FooValue = 1;

 

    }

 

}

再最后设个断点, 运行后取值:

ScreenShot047

 

structObj2 在初始时, 会创建一个全新的副本, 然后获取structObj 的所有数值;

classObj2 在初始时, 只是指向了classObj. 这就是值类型和引用类型的一个区别. 当修改classObj 或者classObj2 时, 修改的是同一部分内存.

Struct实现接口

前面提到了Struct可以实现接口, 下面我们引用一个实例:

interface IPromotion

{

 

    void promote();

 

}

 

struct Employee : IPromotion

{

 

    public string Name;

 

    public int JobGrade;

 

    public void promote()

    {

 

        JobGrade++;

 

    }

 

    public Employee(string name, int jobGrade)

    {

 

        this.Name = name;

 

        this.JobGrade = jobGrade;

 

    }

 

    public override string ToString()

    {

 

        return string.Format("{0} ({1})", Name, JobGrade);

 

    }

 

}

 

class Program

{

 

    static void Main(string[] args)

    {

 

        Employee employee = new Employee("Cool Guy", 65);

 

        IPromotion p = employee;

 

        Console.WriteLine(employee);

 

        p.promote();

 

        Console.WriteLine(employee);

 

    }

 

}

一旦增加了这个功能, 我们就可以在应用Struct之前, 给予其一些接口的定义. 使一类的struct 在形式上保持一致.

 

不同的用途

使用中在struct 和class 两者间该选谁?

我们在编程中要实现某种数据结构时, 绝大部分情况下我们会选择class -- 因为它的强大和特定的使命. 但是当我们要传递或存储一些小数据结构时,可以考虑struct.

Net framework 下有很多已经定义好了的struct例如:

System.Drawing.Rectangle

System.Drawing.Color

System.Drawing.Point

使用时要记住struct的特性.

 

本文来自于喜乐的ASP.NET(Alex Song) 转贴请注明出处

补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,