为什么DateTime
是结构而不是可继承的类?
(我希望能够覆盖ToString()方法,但我不能。)
答案 0 :(得分:17)
可能是因为它被视为一个小而简单且不可变的数据结构,很像整数或小数。在这些条件下使其成为结构使得使用DateTime非常有效。如果它已成为一个类,那么这种效率优势就会丢失,因为每次创建一个新的DateTime时都需要内存分配。
此外,你能想出多少种DateTime的变体形式? (忽略你想到的替代ToString实现。)它不是一个邀请多态的类型。
请注意,对于DateTimes使用不同的格式化策略,正如我认为您想要的那样,您最好采用不同的格式化方式,而不仅仅是使用ToString。如果查看MSDN中的ICustomFormatter接口,您将看到如何插入String.Format管道以覆盖格式,而无需对现有类型进行子集化。
答案 1 :(得分:13)
您可以使用扩展方法: 声明扩展名:
public static class DateTimeExtensions
{
public static string ToStringFormatted(this DateTime date)
{
return date.ToString("{d}");
}
}
使用扩展程序:
using DateTimeExtensions;
...
var d = new DateTime();
System.Diagnostics.Debug.WriteLine(d.ToStringFormatted());
通过这种方式,您可以简单地实现自己在DateTime上使用的方法。这样,它可以轻松地在您的解决方案中随处使用。您唯一需要做的就是使用命名空间。
答案 2 :(得分:12)
因为它是单点。它没有多条数据。在引擎盖下,它由一个长的代表。
答案 3 :(得分:5)
如果您想了解有关系统类和结构的更多信息,请下载免费的.NET反射器(http://www.red-gate.com/products/reflector/)。
无论如何,如果要覆盖DateTime的格式,请提供自己的IFormatProvider。使用.NET Reflector了解DateTimeFormatInfo的实现方式,然后实现自己的。
答案 4 :(得分:5)
仅仅因为它是一个结构(或者即使它是一个密封的类),这并不意味着它是道路的终点。您可以使用composition解决此问题,而不是继承。这是“客观化”DateTime类的一个例子:
public class MyDateTime
{
DateTime? value;
public MyDateTime()
{
this.Value = DateTime.Now;
}
public MyDateTime(DateTime? dateTime)
{
this.Value = dateTime;
}
public override String ToString()
{
if (this.Value != null)
{
return this.Value.Value.Month.ToString() + " my favorite time of the year";
}
return null;
}
public System.DateTime? Value
{
get { return this.value; }
set { this.value = value; }
}
}
答案 5 :(得分:4)
我相信它是一个结构,因为结构是值类型,类是引用类型。 DateTime中的实际数据是一个长整数。如果它是一个类,每次创建一个新对象时,将在堆上分配8个字节,并在堆栈上为指针分配另外8个字节。因此,通过将DateTime作为结构,它可以有效地将内存需求减少一半。
您可以在this question中找到更多信息。
答案 6 :(得分:3)
DateTime的尺寸很小。因此,为此在堆上分配内存效率不高。
在赋值时复制它是合乎逻辑的,而不是创建对同一对象的引用,特别是因为它是不可变的。对它的操作也是如此(Add
,Substract
等。)
必须可以转换为相应的COM结构。
如果您想要自定义格式,您可以像显示here一样实现它。
答案 7 :(得分:2)