静态属性的默认值

48

我喜欢C#,但为什么会出现以下情况:

public static bool Initialized { private set; get; }

或者这样:

public static bool Initialized = false;

但是不能在同一行中混合两者吗?

我只需要将变量的访问级别设置为private set,并且我需要在启动时将其设置为false。我不想创建一个无聊的private _Initialized变量,然后通过公共的Initialized变量的getter返回它。我喜欢我的代码美观。(注:我的变量是静态的,无法在构造函数中初始化)。

谢谢


3
如果构造函数也是静态的,那么它可以在构造函数中进行初始化! - snicker
7
默认情况下,它不是本来就是假的吗,哈哈?无论如何,我感谢您提出这个普遍性问题。 - Preet Sangha
与局部变量默认未定义不同,字段(类级变量)以及属性的支撑变量总是被初始化为它们的默认值,对于布尔型来说默认值是 false - Olivier Jacot-Descombes
4个回答

60

你可以使用一个静态构造函数

static MyClass()
{
    Initialized = false;
}

然而,正如其他人所提到的,bool类型的默认值将为false。


11
静态构造函数是聚会的灵魂。 - snicker

29

自从C# 6版本以来:

public static bool Initialized { private set; get; } = false;

6
您只需要执行以下操作:
public static bool Initialized { private set; get; }

由于 bool 值默认情况下始终为 false,因此无需初始化它。

如果您需要将其默认为 true,或者需要更复杂的逻辑,则需要在静态构造函数中执行此操作或使用后备字段。

至于“我喜欢我的代码美观” - 就个人而言,对于非默认初始化,我认为这同样“美观”:

private static bool initialized = true;
public static bool Initialized { get { return initialized; } }

这使得非默认初始化更加明显,这并不是一件坏事。

1
我认为它不是“很美”,从Intellisense的角度来看,你现在有两个可访问的变量,名称相同但大小写不同,其中一个完全是只读的。另外...(这纯粹是从魔鬼的辩护人的角度来看)如果C#规范发生变化,bool的默认值变为true怎么办?虽然不太可能,但最好明确而不是假设。 - snicker
@snicker:bool 的默认值是 C# 规范的一部分 - 这不会改变。至于智能感知,除非你在类的方法内部,否则你只会看到“Initializer”只读属性,此时通过大小写很容易区分哪个是哪个... - Reed Copsey
我知道,我在开玩笑说规范的事情。当我经常使用小写字母并使用制表符自动完成时,我仍然不想在列表中看到“initialized”和“Initialized”。我无法确定我会得到哪一个(它将是使用Intellisense选择的最后一个)。 - snicker

4
你所提到的两个代码块是两个不同的东西。
第一个代码块是自动实现属性定义。这是完整属性定义的语法糖,看起来像这样:
private static bool _initialized;
public static bool Initialized
{
    private set
    {
        _initialized = value;
    }
    get
    {
        return _initialized;
    }
}

您的第二个代码块是一个静态成员定义。如果您查看我上面给出的扩展,您会注意到它包括一个私有的静态成员定义。如果您想提供初始值,可以在这里完成:
private static bool _initialized = false;
public static bool Initialized
{
    private set
    {
        _initialized = value;
    }
    get
    {
        return _initialized;
    }
}

你正在使用的内联属性定义仅旨在使代码在最常见的情况下更短。如果您想要执行其他任何操作,可以使用完整形式的属性代码。
或者,您可以选择完全不同的路线并使用静态构造函数。(请参见Corey's answer

3
“Syntactic sugar”是让“优美的代码”变得更加简洁易懂的东西。我相信原帖作者明白这一点,但他特别要求一种同样“优美”的解决方案……我认为使用静态构造函数是最好的途径。 - snicker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接