C# struct значения по умолчанию - PullRequest
1 голос
/ 20 марта 2020

У меня есть метод, который принимает структуру, которая содержит много полей с базовыми типами данных c.

Я хочу передать в основном значения по умолчанию, но с парой настроек, но я понимаю, что основные поля c в Объявление структуры не может содержать объявления значений по умолчанию, например, struct S{ int a = 42 }.

. В настоящее время это выглядит так:

OptionsStruct options = OptionStructDefaults;
options.itemA = 2;
options.itemQ = 2; // ... itemB, itemR, itemAZ12, etc.

SetOptions(options);

Однако кажется странным, что OptionsStructDefaults информация отделена от OptionsStruct декларация ...

Такое ощущение, что был бы способ сделать что-то подобное?

SetOptions( new OptionsStruct(){
    itemA = 2,
    itemQ = 2,
    // ...all other fields have default values.
}) 

Или:

SetOptions( new OptionsStruct(useDefaults:true){
    itemA = 2,
    itemQ = 2,
});

В качестве альтернативы Есть ли причина, по которой отдельно определенные структурные значения по умолчанию в конечном итоге способ сделать вещи?

1 Ответ

2 голосов
/ 20 марта 2020

Ограничение на struct s заключается в том, что у вас не может быть конструктора по умолчанию . Таким образом, вы не можете установить значения по умолчанию для полей и свойств (потому что они скомпилированы в конструктор по умолчанию).

Но вы можете иметь конструктор не по умолчанию, то есть конструктор, который принимает параметры .

Таким образом, вы можете иметь struct вот так:

public struct OptionsStruct
{
    public int ItemA { get; set; }
    public int ItemQ { get; set; }

    public OptionsStruct(bool useDefaults)
    {
        if (useDefaults)
        {
            ItemA = 2;
            ItemQ = 2;
        }
        else
        {
            ItemA = 0;
            ItemQ = 0;
        }
    }
}

И использовать его, как вы написали:

    SetOptions(new OptionsStruct(useDefaults:true)
    {
        ItemA = 3,
        // ...all other fields have default values.
    });

Другой способ go должен иметь метод static, который устанавливает значения по умолчанию:

public struct OptionsStruct
{
    public int ItemA { get; set; }
    public int ItemQ { get; set; }

    public static OptionsStruct GetDefault()
    {
        return new OptionsStruct()
        {
            ItemA = 2;
            ItemQ = 2;
        };
    }
}

И использовать его следующим образом:

    var options = OptionsStruct.GetDefault();
    options.ItemA = 3;
    SetOptions(options);

Если число ваших свойств равно не слишком много, вы также можете использовать конструктор с необязательными параметрами:

public struct OptionsStruct
{
    public int ItemA { get; set; }
    public int ItemQ { get; set; }

    public OptionsStruct(int itemA = 2, int itemQ = 2)
    {
        ItemA = itemA;
        ItemQ = itemQ;
    }
}

Но он будет вызываться, только если вы укажете хотя бы один параметр:

    var options1 = new OptionsStruct(); // The "default" constructor is called, so everythng will be 0.
    Console.WriteLine(options1.ItemA); // 0
    Console.WriteLine(options1.ItemQ); // 0

    var options2 = new OptionsStruct(3); // Everything works as expected.
    Console.WriteLine(options1.ItemA); // 3
    Console.WriteLine(options1.ItemQ); // 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...