理解OOP(wrt C#和DateTime类)

时间:2016-01-30 11:57:29

标签: c# oop datetime

请纠正我在逻辑上没有意义的错误。

C#中的'DateTime'类有一个名为'Now'的方法,它以对象格式返回当前日期和时间。

因此,要使用它,必须直接调用DateTime类并指定'Now'方法。像这样:

DateTime meLearning = DateTime.Now;

并且,正如我通过尝试一样学到的,我们不能通过这样的对象使用这个方法'Now':

DateTime testObj = new DateTime();
testObj = meLearning.Now;

现在猜猜问题是,为什么不呢? 当创建类的实例(即该类的对象)时,所有类方法(如“Now”)都可用于该对象。

深入思考,我知道'Now'方法不能对一个对象起作用。所以也许这是一个糟糕的例子。

但它引发了一个问题,即对象是否有某些方法可以访问,而有些方法无权访问。这些方法被称为什么?如何区分一个类提供的方法列表?

希望我的问题有道理。欢迎所有回复。

4 个答案:

答案 0 :(得分:2)

Now不是方法 - 它是static属性 - 您无法在实例上使用它,因为它s static`

您可以通过DateTime.NowmyTimeInstance.Now

查看差异

你可以在它的定义上看到它:

public static DateTime Now { get; }

看到它被定义为一个静态成员,只用一个getter返回一个DateTime实例(ofc。真正的实现将有getter并检索当前系统时间)

BTW:设计选择并不是很好,因为它正在制作使用此功能难以测试的代码

您可以在MSDN documentation

上找到有关静态类和静态成员的更多信息

答案 1 :(得分:2)

DateTime.Now是一个静态属性,只能在类型上调用,而不能在实例上调用。

来自谷歌:

  

静态关键字。在C#术语中,“静态”表示“与类型有关   本身,而不是类型的实例“。您访问静态   使用类型名称而不是引用或值的成员,例如   Guid.NewGuid()。

因此静态属性/方法以static关键字为前缀。 Visual Studio自动过滤您可以在类型和实例上调用的方法。

答案 2 :(得分:1)

方法.Now.UtcNow是DateTime类的static属性,因此您必须通过Class not instances调用它们。

您可以咨询original source code以查看其实际签名。

您还可以参考this article了解static属性是什么,以及如何在C#中使用它

答案 3 :(得分:0)

可以在类型上调用静态方法或属性,并且内存中只有一个静态方法和属性的副本用于所有对象。

可以在实例上调用非静态方法,每个对象可以在内存中拥有自己的方法和属性副本。

因为DateTime.Now是当前,并且这对所有对象都是正确的,所以不需要每个DateTime对象都有自己的当前日期,这就是为什么Now是静态的对于所有DateTimes都是相同的。