2014-02-11 30 views
2

System.TimeSpan类仅有一个非静态的私人领域,这是为什么TimeSpan不是Int64的typedef?

internal long _ticks; 

所以只保留蜱和执行所有操作(AddSubtractTotalSeconds ...)和重载运营商(>=>== )基于该私人领域,_ticks

我发现在.NET 1.0中没有异常方法,但TimeSpan已经存在,但不能重新设计它作为别名Int64和实现为扩展方法的其他成员?这种方式的内存足迹将不太正确?

(同样适用于Url班?)有什么想法?

+0

使TimeSpan成为Int64类型定义的好处是什么?只是内存足迹? – StriplingWarrior

+0

'DateTime'也一样吗?我认为没有任何价值。顺便说一句。扩展方法被添加到.NET 3.5 – MarcinJuraszek

+0

@StriplingWarrior是的,这不够吗? –

回答

3

那么,对于一件事there is no equivalent of TYPEDEF in C#,所以它会使Timespans难以置信地难以使用。

TimeSpan提供了一大堆有用的属性和方法,如.TotalHoursInt64上没有意义,所以简单地将它作为Int64的别名就没什么意义了。

另外,我并不完全确定班级足迹中存在显着的差异(如果有的话)。 TimeSpan是一个结构体,这意味着它可能会被实现为具有与其组成部分大致相同的占位面积(在本例中为Int64)。 (任何人都可以帮我找到备份这个印象的参考吗?)

除此之外,说TimeSpanlong完全一样,只是不直观和错误。它增加了出错的机会,在这种情况下,人们将long传递给应该是TimeSpan的参数,反之亦然。从概念上讲,它确实违背了面向对象编程的范畴。我敢肯定,如果我想了很长时间,我可以想到其他六个原因(比如阻止在TimeSpan类中涉及引入另一个领域的未来改进等),但这些很可能绰绰有余。

+0

但是有一些别名,对吧? like long <--> int64,string <-->编译器处理的字符串? –

+1

@ahmetalpbalkan:是的,但是这不会让你访问像'.TotalHours'这样的属性,因为Int64上没有这样的属性。 – StriplingWarrior

+0

@ahmetalpbalkan:每个编译器都有一小组同义词,但它们不是typedef别名,而且您不能定义自己的别名。我早期曾将此作为一项新功能提出,但很难为此提出充分的理由。 –

2

那么,C#没有typedef的,虽然你可以给一个类型别名,但这是不相关的。如果TimeSpan只是一个Int64,那么他们应该创建一个静态TimeSpanHelper类与all of the methods and properties that TimeSpan exposes

当你可以创建一个实际作为时间跨度的类型时,这似乎很愚蠢。一种可以覆盖操作员以允许流畅且直观的使用的类型。你知道,这种类型适合C#的类型系统。你提出的更类似于C,而不是C#。