回答
可能是因为它被看作是一个小的,简单的和不可变的数据结构,很像整数或小数。在这些条件下使它成为结构使得使用DateTime非常高效。如果已经创建了一个类,那么效率优势就会丢失,因为每次创建新的DateTime时都需要分配内存。
此外,你可以想出多少种不同形式的DateTime? (忽略你想到的allternate ToString实现。)它不完全是一个请求多态的类型。
请注意,对于为您的DateTime使用不同的格式策略,我认为您需要,您最好查看不同的格式化方法,而不仅仅是使用ToString。如果你看看MSDN中的ICustomFormatter界面,你会看到你如何插入字符串。格式化流水线以覆盖格式,而不需要对现有类型进行子集化。
因为它是一个单点。它没有多个数据。在引擎盖下它代表一长。
如果您想了解更多关于系统类和结构的信息,请下载免费的.NET反射器(http://www.red-gate.com/products/reflector/)。
无论如何,如果您想重写DateTime的格式,请提供您自己的IFormatProvider。使用.NET Reflector找出DateTimeFormatInfo的实现方式,然后实现自己的。
您可以使用此扩展方法: 申报延伸:
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());
这样你就可以简单的实现自己的方法,多数民众赞成在日期时间使用。这种方式可以很容易地在您的解决方案中随处使用。唯一需要做的就是使用命名空间。
是的,但请不要将它命名为“ToString2”! :) – 2009-10-31 13:22:01
当然,它只是一个例子...;) – 2009-10-31 13:24:36
只是因为它是一个结构(或者即使它是一个密封类),这并不意味着它是路的尽头。您可以使用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; }
}
}
的DateTime具有体积小。因此,为此分配堆内存效率不高。
在赋值时进行复制,而不是创建对同一对象的引用是合乎逻辑的,尤其是因为它是不可变的。对其进行操作也是如此(
Add
,Substract
等)它必须转换成相应的COM结构。
如果你想自定义格式,你可以实现它,就像它显示的here。
我相信它是一个结构,因为结构是值类型,类是引用类型。 DateTime中的实际数据是一个长整数。如果它是一个类,每次创建一个新对象时,8个字节将被分配到堆上,另外8个字节将被分配到堆栈中作为指针。所以通过使DateTime成为一个结构体,它有效地将内存需求减半。
你可以在this question找到更多的信息。
也许加上性能问题 – Timeless 2017-11-15 09:24:42
- 1. .NET MVC体系结构是什么?
- 2. 为什么未初始化的DateTime结构告诉我它是星期一
- 3. IQueryable的结构是什么?
- 4. AppxSignature.p7x的结构是什么?
- 5. 什么是Eclipse的结构?
- 6. 什么是.NET架构和什么是.NET框架?
- 7. 为什么Void是一个结构?
- 8. 什么是结构初始化为C++
- 9. 为什么使用结构,而不是
- 10. 什么是支持.NET 2.0的结构图的最新版本
- 11. 什么是C中的“packed”结构?
- 12. 结构()中的“class”参数是什么?
- 13. 什么是结构中的NSString?
- 14. 结构中的函数。为什么?
- 15. 什么是contacts.edb结构?
- 16. jQuery:这是什么结构?
- 17. 这是什么linux结构
- 18. 是什么结构和类
- 19. 结构中长度为零的数组的目的是什么?
- 20. TimeZone.GetUtcOffset()需要DateTime,但是DateTime的时区被忽略,为什么?
- 21. 什么是“DateTime?”而不仅仅是C#中的DateTime?
- 22. 为什么在.NET中没有IDateTimeProvider并且DateTime具有Now getter?
- 23. 八度中,字面结构是什么?
- 24. C++:为什么我的向量结构作为一个结构?
- 25. 什么是CRM2011中DateTime的MinValue?
- 26. 什么是SQLite中的datetime-type列?
- 27. .NET中的DateTime
- 28. 什么是.NET中的WCF?
- 29. 什么是.NET中的“AxSHDocVw”?
- 30. 有什么方法可以冻结Cruise Control .NET中的构建?
为什么downvotes模式?我回答了他原来的问题。 – 2009-10-31 13:33:35
我没有投票,但从你的回答来看,结构总是包含一个“数据片段”,这是DateTime是结构的唯一原因。你没有提到结构和类之间的性能差异,我认为这应该包括在问题的答案中。 – Kamarey 2009-10-31 16:07:36