当我正在学习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;
}
答案 0 :(得分:4)
这更多地取决于您的类型的目的而不是尺寸。
如果您想传递数据并希望每个调用都有一个副本,那么您应该使用结构。但是,如果您需要将数据存储在中心位置,并且代码的许多其他部分应该处理相同的数据,那么您需要一个类。类通过引用传递,不会复制任何数据。
如果您按照结构复制数据,则最终可能会出现不一致的状态。
答案 1 :(得分:2)
您要做的第一件事是正确定义您的数据结构。这是你所拥有的问题,它将时间存储为字符串。这不是一个很好的类型选择,它既昂贵,因为你需要将它们从字符串表示转换为时间,并且让你的程序在世界上不同的语言环境中工作,有不同的方式来表达时间是很痛苦的。你肯定想要一种能够毫不含糊地快速表达时间的类型。 TimeSpan是存储一天中某个时间的正确类型。它与DateTime.TimeOfDay属性直接兼容,并存储为二进制值,64位(8字节)。
下一个指导是结构需要很轻才能在运行时有效。经验法则是它不应该有超过4个字段而不能超过16个字节。如果超过这些限制,则值类型会失去其速度优势。在x86处理器上有四个字段是好的,它有4个备用cpu寄存器,而不是存储值。 16个字节设置了在通过值而不是引用传递值时复制值的成本上限。
你的字段数量很好,但超过了大小限制,4 TimeSpans需要32个字节。所以这应该是一个班级。
答案 2 :(得分:0)
由于类是引用类型并存储在堆上,而结构是值类型并存储在堆栈中。
根据我所读到的内容,以下代码是结构还是类。
这将是一个糟糕的struct
,because it's mutable(即使设置者是internal
)。通常,至少有95%的时间要使用class
。如果您的分析显示使用struct
的速度很慢,那么您应该创建一个自定义class
。这种情况很少发生。