【问题标题】:Structs and classes advice结构和类建议
【发布时间】:2013-06-12 00:03:36
【问题描述】:

在学习 c# 时,我希望能得到一些关于结构和类的专业建议。因为类是引用类型并存储在堆中,而结构是值类型并存储在堆栈中。

我的理解是,出于性能原因,结构通常用于较小的数据类型。

根据我所阅读的内容,以下代码是结构还是类。

public struct DisplayWeatherAstronomy
{
    public string SunRise               { get; internal set; }
    public string SunSet                { get; internal set; }
    public string MoonRise              { get; internal set; }
    public string MoonSet               { get; internal set; }
}

/***额外代码***/

关闭两个回复,我添加了一些额外的代码。

public IEnumerable<DisplayWeatherAstronomy> WeatherAstronomy(string id)
{
    var doc = WeatherXml.XmlData(id);
    var displayAstronomy = (from wd in doc.Descendants("astronomy")
                            select new DisplayWeatherAstronomy
                            {
                                SunRise = (string)wd.Element("sunrise") ?? string.Empty,
                                SunSet = (string)wd.Element("sunset") ?? string.Empty
                            });
    return displayAstronomy;
}

【问题讨论】:

标签: c#


【解决方案1】:

这更多地取决于字体的用途而不是大小。

如果你想传递数据并希望每次调用都有一个副本,你应该使用一个结构。但是,如果您需要将数据存储在中心位置,并且代码的许多其他部分应该处理相同的数据,那么您需要一个类。类是通过引用传递的,不会复制任何数据。

如果像结构一样复制数据,最终可能会出现不一致的状态。

【讨论】:

  • 实际上,传递class 通常比传递struct 更快,因为引用几乎总是小于整个struct。更快的是访问 struct 中的数据,因为少了一个间接(并且没有null 检查)。
  • 您好 Thalm,感谢您的回复,我将重新阅读该章,因为我想我可能误解了它。
  • @svick 你是对的,它不是关于速度,而是关于正确使用类型。
  • @GeorgePhillipson 我也投票支持我的正确答案,因为 hans 提到的是特定于您的代码的内容,并且没有考虑值类型与引用类型的不同用例。正如这里详细解释的那样:blogs.msdn.com/b/ericlippert/archive/2009/04/27/…
  • 嗨 Thalm 感谢您的回复,两个都是很好的答案,但我只能将其中一个标记为正确,这就是为什么我还点击了向上箭头来回复您,如果我可以将两者都标记为正确的,我会的。
【解决方案2】:

您要做的第一件事是正确定义数据结构。这是您拥有的问题,它将时间存储为字符串。这不是一个很好的类型选择,它既昂贵又昂贵,因为您需要将它们从字符串表示形式转换为时间,而且让您的程序在世界上以不同方式表达一天中的时间的不同语言环境中工作很痛苦.你肯定想要一种能够明确而快速地表达时间的类型。 TimeSpan 是存储一天中时间的正确类型。它与 DateTime.TimeOfDay 属性直接兼容,并存储为 64 位(8 字节)的二进制值。

下一个指导是结构需要轻量级才能在运行时高效。经验法则是它不应超过 4 个字段且不大于 16 个字节。如果超出这些限制,则值类型将失去其速度优势。四个字段在 x86 处理器上很好,它有 4 个备用 cpu 寄存器,可以存储值。当通过值而不是引用传递值时,16 字节设置了复制值的成本上限。

字段数很好,但超出了大小限制,4 个 TimeSpan 占用 32 个字节。所以这应该是一个类。

【讨论】:

  • 嗨 Hans 感谢您的回复,我选择字符串的原因是因为数据是来自远程站点的字符串格式。因此,如果我理解正确,不超过 4 个字段且少于 16 个字节。 (我正在阅读的书中没有提到),对于结构来说没问题,任何更大的都是一个类。
  • 您迟早要转换这些字符串。越早越好。至少不是因为只有与 Web 服务对话的代码才能很好地了解字符串是如何编码的。
  • 您好,汉斯是的,希望 9 月能上大学,攻读计算机领域的 HND(成人学生),书本只能教给您这么多。我认为我在此类网站上了解的阅读信息和发布问题比阅读书籍更多。
【解决方案3】:

因为类是引用类型并存储在堆中,而结构是值类型并存储在堆栈中。

Wrong.

根据我所阅读的内容,以下代码是结构还是类。

那将是一个糟糕的structbecause it's mutable(即使设置器是internal)。一般来说,至少有 95% 的时间你想使用class。当您的分析显示使用 class 很慢并且这种情况很少发生时,您应该创建一个自定义 struct

【讨论】:

  • 嗨 svick,感谢您的回复,我可能会误读一章。
猜你喜欢
  • 1970-01-01
  • 2011-11-06
  • 2019-03-17
  • 2011-10-29
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多