Ограничение на 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