Переопределение значений по умолчанию в структуре (c #) - PullRequest
15 голосов
/ 21 декабря 2010

Можно ли установить или переопределить состояние по умолчанию для структуры?

В качестве примера у меня есть

enum something{a,b,c,d,e};

и структура, которая связывает 2 значения для этого перечисления

struct SomethingData
{
    something type;
    int Value;
    double Multipler;

    SomethingData(something enumVal, int intVal, double DblVal) {...}
}

Но можно ли указать, что по умолчанию установлено

SomethingData(something.c,0,1);

Ответы [ 12 ]

0 голосов
/ 23 мая 2013

Есть обходной путь

public struct MyStruct
{
    public MyStruct(int h = 1, int l = 1)
    {
        high = h;
        low = l;
    }
    public int high;
    public int low;
}
0 голосов
/ 21 декабря 2010

Отчасти связано: я часто хотел использовать новый синтаксис инициализатора объекта с неизменяемым типом значения. Однако, учитывая природу типичной реализации типа неизменяемого значения, использовать этот синтаксис невозможно, поскольку свойства доступны только для чтения.

Я придумал этот подход; По моему мнению, это все еще удовлетворяет неизменности типа значения, но позволяет коду, который отвечает за создание экземпляра типа значения, лучше контролировать инициализацию внутренних данных.

struct ImmutableValueType
{
    private int _ID;
    private string _Name;

    public int ID
    {
        get { return _ID; }
    }

    public string Name
    {
        get { return _Name; }
    }

    // Infuser struct defined within the ImmutableValueType struct so that it has access to private fields
    public struct Infuser
    {
        private ImmutableValueType _Item;

        // write-only properties provide the complement to the read-only properties of the immutable value type
        public int ID
        {
            set { _Item._ID = value; }
        }

        public string Name
        {
            set { _Item._Name = value; }
        }

        public ImmutableValueType Produce()
        {
            return this._Item;
        }

        public void Reset(ImmutableValueType item)
        {
            this._Item = item;
        }

        public void Reset()
        {
            this._Item = new ImmutableValueType();
        }

        public static implicit operator ImmutableValueType(Infuser infuser)
        {
            return infuser.Produce();
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        // use of object initializer syntax made possible by the Infuser type
        var item = new ImmutableValueType.Infuser
        {
            ID = 123,
            Name = "ABC",
        }.Produce();

        Console.WriteLine("ID={0}, Name={1}", item.ID, item.Name);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...