AddSeconds - problem

0

RegistryKey rejestr = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
int dataSys;
dataSys = Convert.ToInt32(rejestr.GetValue("InstallDate"));
DateTime dataI = new DateTime(1970, 01, 01);
dataI.AddSeconds(dataSys);
label.Text = Convert.ToString(dataI);

Czemu ten kod( a właściwie fragment),
nie wyświetla daty instalacji systemu? Podczas śledzenia widzę, że dana z rejestru został poprawnie wczytana do zmiennej, ale AddSeconds nie dodaje sekund. Ale gdy zamiast AddSeconds(dataSys) wpiszę AddSeconds(123), sekundu dodają się prawidłowo do daty i dostaję w wyniku piękny napis. Więc dlaczego metoda AddSeconds nie chce przyjąć danych ze zmiennej?

0
dataI = dataI.AddSeconds(dataSys);
0

Dzięki, działa.

0

A wszystko ponieważ obiekt DateTime jest "niezmienniczy". Każde metoda zwraca "nowy" obiekt, który powstał podczas modyfikacji "starego". Szczegółowy komentarz tłumaczy działanie metody:

        //
        // Summary:
        //     Adds the specified number of seconds to the value of this instance.
        //
        // Parameters:
        //   value:
        //     A number of whole and fractional seconds. The value parameter can be negative
        //     or positive.
        //
        // Returns:
        //     A System.DateTime whose value is the sum of the date and time represented
        //     by this instance and the number of seconds represented by value.
        //
        // Exceptions:
        //   System.ArgumentOutOfRangeException:
        //     The resulting System.DateTime is less than System.DateTime.MinValue or greater
        //     than System.DateTime.MaxValue.
0
mykhaylo napisał(a)

A wszystko ponieważ obiekt DateTime jest "niezmienniczy".

Bo DateTime to struktura a nie klasa. (A właściwie to tylko trochę lepszy long ;P)

0
somekind napisał(a)

Bo DateTime to struktura a nie klasa.

Jeśli mówimy że dana klasa/struktura jest niezmiennicza, to znaczy że nie możemy zmienić wartości początkowej obiektu. Gdy wywołamy konstruktor z daną wartością, to mamy pewność że nie zostanie ona zmieniona podczas całego cyklu życia danego obiektu. To czy jest to struktura czy klasa nie ma żadnego znaczenia. "Niezmienniczość" zapewnia logika implementacji. Przykład struktury, której wartość możemy zmieniać w trakcie życia obiektu:

public struct STime
{
    private int _value;
    public STime(int start)
    {
        _value = start;
    }
    public void AddSeconds(int value)
    {
        _value += value;
    }
    public override string ToString()
    {
        return _value.ToString();
    }
}

Przykład użycia:

STime sTime = new STime(10);
Console.WriteLine(sTime.ToString());
sTime.AddSeconds(10);
Console.WriteLine(sTime.ToString());

Wynik:

10
20  

Przykład klasy, której wartość nie możemy zmienić w trakcie życia obiektu:

public class CTime
{
    private int _value;
    public CTime(int start)
    {
        _value = start;
    }
    public CTime AddSeconds(int value)
    {
        return new CTime(_value + value);
    }
    public override string ToString()
    {
        return _value.ToString();
    }
}

Przykład użycia:

CTime cTime = new CTime(10);
Console.WriteLine(cTime.ToString());
cTime.AddSeconds(10);
Console.WriteLine(cTime.ToString());

Wynik:

10
10
0

a no wlasnie!
string jest tez obiektem niezmienniczym a jest klasa!
typeof(System.String).IsClass zwraca true

po en to sa immutable types

1 użytkowników online, w tym zalogowanych: 0, gości: 1