C# 类(Class)和结构(struct)的比较

相同点:

结构(struct)是能够包含数据成员和函数成员的数据结构。

不同点:

结构是值类型,不需要堆分配。
结构类型的变量直接存储该结构的数据,而类类型的变量则存储对动态分配的对象的引
用。
结构类型不支持用户指定的继承,并且所有结构类型都隐式地从类型 object 继承。

结构的优势:

结构对于具有值语义的小型数据结构尤为有用。复数、坐标系中的点或字典中的“键 -值”对都是结构
的典型示例。对小型数据结构而言,使用结构而不使用类会大大节省需要为应用程序分配的内存数量。

例如,下面的程序创建并初始化一个含有100 个点的数组。对于作为类实现的 Point,,实例化了 101个单独对象,其中,数组需要一个,其100 个元素每个都需要一个。

class Point{
    public int x, y;
    public Point(int x, int y) 
    {
        this.x = x; 
        this.y = y;
    }
}
class Test{
    static void Main() {
    Point points = new Point[100];
    for (inti = 0;j<100; i++)
    {
        points[i] = new Point(i, i):
    }
}

一种替代办法是将 Point 定义为结构。

struct Point{
    public int x, y;
    public Point(int x, int y) 
    {
        this.x = x;
        this.y= y;
    }
}

现在,只有一个对象被实例化(即用于数组的那个对象),而 Point 实例内联存储在数组中。

结构构造函数也是使用 new 运算符调用,但是这并不意味着会分配内存。结构构造函数并不动态分配对象并返回对它的引用,而是直接返回结构值本身(通常是堆栈上的一个临时位置),然后根据需要复制该结构值。

对于类,两个变量可能引用同一对象,因此对一个变量进行的操作可能影响另一个变量所引用的对象。

对干结构,每个变量都有自己的数据副本,对一个变量的操作不会影响另一个变量。例如,下面的代码段产生的输出取决于 Point 是类还是结构。

Point a = new Point(10, 10); Point b = a; a.x = 20:
Console.WriteLine(b.x);
如果Point 是 ,输出将是 20,因为 a和b引用同一对象
如果 Point 是 结构,输出将是 10,因为 a对b的赋值创建了该值的一个副本,因此接下来对 a.x 的赋值不会影响 b这一副本。

  结构的弱势:

前一示例突出了结构的两个限制。首先,复制整个结构通常不如复制对象引用的效率高,因此结构的赋
值和值参数传递可能比引用类型的开销更大。其次,除了 ref 和 out 参数,不可能创建对结构的引用, 这样限制了结构的应用范围。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值