结构和课程建议

时间:2013-06-15 12:39:35

标签: c#

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

3 个答案:

答案 0 :(得分:4)

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

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

如果您按照结构复制数据,则最终可能会出现不一致的状态。

答案 1 :(得分:2)

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

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

你的字段数量很好,但超过了大小限制,4 TimeSpans需要32个字节。所以这应该是一个班级。

答案 2 :(得分:0)

  

由于类是引用类型并存储在堆上,而结构是值类型并存储在堆栈中。

Wrong.

  

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

这将是一个糟糕的structbecause it's mutable(即使设置者是internal)。通常,至少有95%的时间要使用class。如果您的分析显示使用struct的速度很慢,那么您应该创建一个自定义class。这种情况很少发生。