繁体   English   中英

C# 结构体默认值

[英]C# struct default values

我有一个方法接受一个包含许多具有基本数据类型的字段的结构。

我想传递大部分默认值,但有一些调整,但我知道结构声明中的基本字段不能包含默认值声明,例如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,
});

或者,是否有理由说明为什么单独指定的结构默认值最终是做事的方式?

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.
    });

另一种方法是使用一个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM