1

当我学习 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;
}
4

3 回答 3

4

这更多地取决于您的类型的目的而不是大小。

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

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

于 2013-06-15T12:46:19.440 回答
2

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

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

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

于 2013-06-15T17:22:09.877 回答
0

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

错误的。

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

那会很糟糕struct因为它是可变的(即使设置器是internal)。一般来说,至少 95% 的时间你都想使用class. struct当您的分析显示使用 aclass很慢并且这种情况很少发生时,您应该创建一个自定义。

于 2013-06-15T15:31:36.007 回答