【问题标题】:default value for a static property静态属性的默认值
【发布时间】:2011-02-05 11:36:02
【问题描述】:

我喜欢c#,但为什么我可以这样做:

public static bool Initialized { private set; get; }

或者这个:

public static bool Initialized = false;

但不能同时在一行中?

我只需要将访问级别设置为我的变量(私有集),并且我需要在启动时将其设置为 false。我不想制作那个无聊的私有 _Initialized 变量,它将由公共 Initialized var 的 getter 返回。我喜欢我的代码很漂亮。 (注意:我的变量是静态的,不能在构造函数中初始化)。

谢谢

【问题讨论】:

  • 如果构造函数也是静态的,也可以在构造函数中初始化!
  • 默认情况下不会是 FALSE,哈哈?无论如何,我感谢您提出一般性问题。
  • 与默认未定义的局部变量不同,字段(类级别变量)以及属性的支持变量始终初始化为其默认值,即布尔值false。

标签: c# static properties default


【解决方案1】:

您可以使用static constructor

static MyClass()
{
    Initialized = false;
}

但是,正如其他人所提到的,bool 的默认值为 false。

【讨论】:

  • 静态构造函数是派对的生命。
【解决方案2】:

你可以这样做:

public static bool Initialized { private set; get; }

由于bool 的值默认始终为 false,因此无需对其进行初始化。

如果您需要默认情况下为真,或者需要更复杂的逻辑,则需要在静态构造函数中执行此操作或使用支持字段。

至于“我喜欢我的代码漂亮”——就个人而言,对于非默认初始化,我认为这只是“漂亮”:

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

这使得对非默认值的初始化非常明显,这不是一件坏事。

【讨论】:

  • 我不认为它是“一样漂亮”,从 Intellisense 的角度来看,您现在有两个变量可以使用相同的名称访问,只是大小写不同,其中一个是完全读取的-只要。另外..(这纯粹是从一个魔鬼拥护者的角度来看)如果 C# 规范发生变化并且 bool 的默认值变为 true 怎么办?不太可能,但明确比假设更好。
  • @snicker:bool 的默认值是 C# 规范的一部分——不会改变。就智能感知而言,除非您位于类中的方法内部,否则您只会看到“Initializer”只读属性,在这种情况下,很明显哪个是通过大小写...
  • 我知道,我只是在开玩笑。当我经常输入小写字母并使用制表符补全时,我仍然不想在列表中看到“已初始化”和“已初始化”。我不确定我会得到哪一个(它将是使用 Intellisense 选择的最后一个)
【解决方案3】:

你提到的两个代码块是两个不同的东西。

第一个块是auto implemented property defination。这是完整属性定义的语法糖,如下所示:

private static bool _initialized;
public static bool Initialized
{
    private set
    {
        _initialized = value;
    }
    get
    {
        return _initialized;
    }
}

您的第二个代码块是static member definition。如果您查看我上面给出的扩展,您会注意到它包含一个私有静态成员定义。如果你想提供一个初始值,你可以在这里做:

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

您使用的内联属性定义只是为了在最常见的情况下使代码更短一些。如果你想做其他事情,你可以使用完整的属性代码。

或者,您可以走完全不同的路线并使用静态构造函数。 (见Corey's answer)

【讨论】:

  • “语法糖”造就了“美丽的代码”。我确信 OP 知道 这是真正发生的事情,但特别要求提供具有可比“美”的解决方案......我认为静态构造函数是最好的路径.
【解决方案4】:

从 C# 6 开始:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-08
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2011-12-16
    • 2017-01-26
    • 1970-01-01
    相关资源
    最近更新 更多