为什么DateTime
的结构,而不是一个可继承类?
(我想能够重写ToString()方法,但我不能。)
为什么DateTime
的结构,而不是一个可继承类?
(我想能够重写ToString()方法,但我不能。)
可能是因为它被认为是一个小的,简单的和不可改变的数据结构,很象一个整数或小数。 使得它在这些条件下,结构使使用日期时间非常有效。 如果已经做了一个类,这个效率效益会被丢失,因为这将需要每次创建一个新的datetime时间内存分配。
再说了,你有多少变种一个DateTime的形式可以拿出? (忽略你心目中的allternate的ToString实现。)这不正是邀请多态性的类型。
请注意,对于使用不同格式的策略为您DateTime是否,因为我想你想,你最好看看不同的方式比只使用的ToString格式化。 如果你看一下ICustomFormatter在MSDN界面,你会看到你如何插入的String.Format管道覆盖,而无需子集的现有类型的格式。
您可以使用此扩展方法:声明扩展:
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());
这样你就可以简单的实现上的日期时间使用你自己的方法,多数民众赞成。 这样,它可以很容易地无处不在,你的解决方案中使用。 只有你所要做的事情就是使用命名空间。
参考: 扩展方法(C#)
因为它是一个单点。 它不具有多个数据段。 引擎盖下它是由一个长表示。
如果您想了解更多关于系统类和结构,下载免费的.NET反射器( http://www.red-gate.com/products/reflector/ )。
无论如何,如果你想覆盖的DateTime是如何被格式化,提供自己的IFormatProvider。 使用.NET反射来找出的DateTimeFormatInfo是如何实现的,然后实现自己的。
只是因为它是一个结构(或者即使它是一个密封类),这并不意味着它是路的尽头。 你能解决这个问题组成 ,而不是继承。 这里的“客观化” 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的实际数据是一个长整数。 如果它是一类,每次你创建一个新的对象,8个字节将在堆中分配和另外8个字节将在堆栈指针上进行分配。 因此,通过使一个DateTime一个结构,它有效地减少了一半的内存需求。
你可以找到更多信息这个问题 。
日期时间具有体积小。 所以它是没有效率堆在此分配内存。
这是符合逻辑的对转让的它的复制,没有创造同一个对象的引用,特别是因为它是不可变的。 这同样适用于它的操作( Add
, Substract
等)
它必须转换为相应的COM结构。
如果您想自定义格式可以实现像显示它在这里 。
你并不需要在此改变ToString()
方法只检查模式在这里你不会真的需要别人:)
更详细的岗位在这里