2009-10-31 111 views

回答

14

可能是因为它被看作是一个小的,简单的和不可变的数据结构,很像整数或小数。在这些条件下使它成为结构使得使用DateTime非常高效。如果已经创建了一个类,那么效率优势就会丢失,因为每次创建新的DateTime时都需要分配内存。

此外,你可以想出多少种不同形式的DateTime? (忽略你想到的allternate ToString实现。)它不完全是一个请求多态的类型。

请注意,对于为您的DateTime使用不同的格式策略,我认为您需要,您最好查看不同的格式化方法,而不仅仅是使用ToString。如果你看看MSDN中的ICustomFormatter界面,你会看到你如何插入字符串。格式化流水线以覆盖格式,而不需要对现有类型进行子集化。

10

因为它是一个单点。它没有多个数据。在引擎盖下它代表一长。

+0

为什么downvotes模式?我回答了他原来的问题。 – 2009-10-31 13:33:35

+0

我没有投票,但从你的回答来看,结构总是包含一个“数据片段”,这是DateTime是结构的唯一原因。你没有提到结构和类之间的性能差异,我认为这应该包括在问题的答案中。 – Kamarey 2009-10-31 16:07:36

5

如果您想了解更多关于系统类和结构的信息,请下载免费的.NET反射器(http://www.red-gate.com/products/reflector/)。

无论如何,如果您想重写DateTime的格式,请提供您自己的IFormatProvider。使用.NET Reflector找出DateTimeFormatInfo的实现方式,然后实现自己的。

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()); 

这样你就可以简单的实现自己的方法,多数民众赞成在日期时间使用。这种方式可以很容易地在您的解决方案中随处使用。唯一需要做的就是使用命名空间。

编号:Extension Methods (c#)

+9

是的,但请不要将它命名为“ToString2”! :) – 2009-10-31 13:22:01

+1

当然,它只是一个例子...;) – 2009-10-31 13:24:36

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; } 
    } 
} 
2
  • 的DateTime具有体积小。因此,为此分配堆内存效率不高。

  • 在赋值时进行复制,而不是创建对同一对象的引用是合乎逻辑的,尤其是因为它是不可变的。对其进行操作也是如此(Add,Substract等)

  • 它必须转换成相应的COM结构。

如果你想自定义格式,你可以实现它,就像它显示的here

3

我相信它是一个结构,因为结构是值类型,类是引用类型。 DateTime中的实际数据是一个长整数。如果它是一个类,每次创建一个新对象时,8个字节将被分配到堆上,另外8个字节将被分配到堆栈中作为指针。所以通过使DateTime成为一个结构体,它有效地将内存需求减半。

你可以在this question找到更多的信息。

+0

也许加上性能问题 – Timeless 2017-11-15 09:24:42

2

你并不需要在此改变ToString()方法只检查here你不会真的需要别人:)

更详细的岗位here