Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Начальное значение поля структуры


Автор: semicolon 30.8.2012, 14:31
Здравствуйте! Вот такой код:
Код

Console.WriteLine( new DateTime().Day );

выводит на экран «1».  Но, как известно, начальные значения неконстантных полей структуры определять нельзя. И нестатического конструктора по умолчанию у структур нет. Что нужно дописать, чтобы начальное значение свойства Value моей структуры MyStruct тоже было единицей?
Код

Console.WriteLine( new MyStruct().Value );
......
public struct MyStruct
{
    public int Value { get; set; }
}

Автор: Cheloveck 30.8.2012, 16:25
http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx

Автор: semicolon 30.8.2012, 16:44
Цитата(Cheloveck @  30.8.2012,  16:25 Найти цитируемый пост)
http://msdn.microsoft.com/en-us/library/sy...eattribute.aspx 

К сожалению, это не то.
Цитата
The DefaultValueAttribute does not set the property to the value, it is purely informational. The Visual Studio designer will display this value as non-bold and other values as bold (changed)

Автор: Cheloveck 30.8.2012, 18:59
Цитата(semicolon @  30.8.2012,  17:44 Найти цитируемый пост)
К сожалению, это не то.


Действительно, не то. Тогда так
Код

struct Test {
    int? xxx;

    public int Xxx { 
        get { return xxx.HasValue ? xxx.Value : 1; }
        set { xxx = value; }
    }
}

Автор: semicolon 30.8.2012, 20:07
Cheloveck, да это работает, спасибо smile Но если это поле будет использоваться в вычислениях, его каждый раз придётся обвешивать такой проверкой, что не очень хорошо. Всё-таки, интересно, как это реализуется в DateTime. Я смотрю исходник DateTime, сгенерированный рефлектором. Там обнуляемые поля не используются. Но принцип понять пока не могу. Код для меня довольно сложен. Свойство Day вычисляется из приватного поля dateData, которое инициализиуется конструктором с параметром. Но откуда вызывается этот конструктор - вот загадка. В моей структуре конструктор с параметром автоматически никогда не вызывается :( Может это какой-то внутренний хак фрейморка? smile

Автор: semicolon 30.8.2012, 23:18
Скачал оригинальный исходник DateTime. Оказывается, ничего особенного там нет. Просто свойство пересчитывается из приватного поля. То есть, для моей структуры можно написать так:
Код

public struct MyStruct
{
    private int _value;
    public int Value
    {
        get
        {
            return _value + 1;
        }

        set    
        {
            _value = value - 1;
        }
    }
}


Cheloveck, спасибо за возможный вариант кода smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)