简体   繁体   中英

Explain the DateTime.Now design in .Net

I have a question regarding the design of the Date object in the .Net framework, more specifically the Now property.

I know that Now is a property that is a Date type. (This makes sense since I see the methods .AddHours(), AddYears(), etc) If Now being a class(or struct) how does it return a value directly.

For example: How would I create a class or struct in C#/VB.net that would allow me to do the same without calling a property of Now?

(VB.Net) Dim WeatherObject as new WeatherReporter()

If WeeatherReport had a property called TodaysWeather that was a class how could I then get a value like this

Dim PlainTextReport as string=WeeatherReport.TodaysWeather

To me it seems like you would have to call a another property off of TodaysWeather. But with the Datetime.Now example you don't. Anyways, I know its an odd question. I was just trying to better understand how some of these objects are set up under the hood

Thanks for any light on the matter.

Here is an example of code referring to the above question.

Public Class WeatherReporter
    Shared ReadOnly Property TodaysWeather As DayWeather
        Get
            TodaysWeather = New DayWeather
            Return TodaysWeather.Current
        End Get
    End Property
End Class

Public Class DayWeather
    Public Property Current As String = "Sunny"
End Class

Now similar to the DateTime.Now object

How could one you the weather example like this

Dim TheForecast as string=WeatherReporter.TodaysWeather 

It seems like it would require the following

Dim TheForecast as string=WeatherReporter.TodaysWeather.Current

I know its a confusing question, lol. thanks for your patience

Reflecting the source code it's evident that it's simply a property wrapper around a function.

public static DateTime Now
{
    get
    {
        return UtcNow.ToLocalTime();
    }
}

You don't need to instantiate a DateTime object since the property is marked as static .

.NET properties are more than merely values - they encapsulate getter and setter methods around underlying values. That being the case, they can initialize objects before returning them. So, for example, DateTime.Now may be implemented like this (without attempting to find its actual implementation via Reflector or Reference Sources...):

public static DateTime Now
{
    get
    {
        var d = new DateTime() { .Kind = DateTimeKind.Local };
        // Logic to determine the current system time and set d to that value
        return d;
    }
}

(ref: MSDN )

DateTime.Now looks something like this in VB.net...

public structure DateTime

    ...other code...

    ''// `shared` makes this a class property, not an instance property.
    ''// This is what lets you say `DateTime.Now`
    public shared readonly property Now as DateTime
        get
            ... do some magic to return the current date/time ...
        end get
    end property

    ... other code ...

end class

or in C#:

public struct DateTime
{
    ... other code ...

    // `static` works like VB's `shared` here
    public static DateTime Now
    {
        get { /* do your magic to return the current date/time */ }
    }

    ... other code ...
}

It's implemented as a static getter method. I believe what your looking for would look something like this in your WeatherReporter class:

Public Shared ReadOnly Property TodaysWeather As WeatherReporter
    Get
        Return New WeatherReporter(DateTime.Now)
    End Get
End Property

That assumes that your WeatherReporter class has a constructor that accepts a DateTime .

DateTime.Now is a static/Shared property. You don't have to instantiate a new object (using New DateTime() ) to call it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM