何时使用自动属性

本文关键字:属性 何时使 | 更新日期: 2023-09-27 17:53:55

我的代码中有一个加密密钥,如:

private const string _keyc = "blahblahblah";
private static string _key
{
     get { return "blahblahblah"; }
}

编译后,在ILDasm上,我注意到我只能直接看到常量的值,而在第二种情况下则不能。但是,我仍然可以在hidebysig...get_key()

下的ldstr中看到键。

ILSpy还是按照我写的方式获得了源代码。

在这里,我想知道,在这里使用auto属性真的有意义吗?使用auto属性还有其他优点吗?特别是在这种简单的情况下,使用auto属性是否可取?谢谢!

何时使用自动属性

只能在以下情况下使用自动属性:

  • 属性为读写;也就是说,它同时定义了getset访问器。如果只定义一个访问器,则不能使用自动属性。(请注意,如果您希望自动属性在类外部代码中为只读,但在类内部为读写,则可以在自动属性上定义private set访问器。)
  • 您不需要在setter中做任何验证——也就是说,属性类型的所有值都是有效的。
  • 你不需要直接初始化backing字段,而是从构造函数中设置属性(或者只是在字段中保留默认值)。
  • 您永远不需要直接引用backing字段,例如作为refout参数。特别是,这将阻止您在现场使用System.Threading.Interlocked方法。
  • 字段名不重要。(序列化是一种可能被认为很重要的情况)

根据您的示例,您正在实现一个只读属性(没有setter)。在这种情况下,您不能使用自动属性,除非使用如下模式:

class Example
{
    public static string SomeProperty { get; private set; }
    static Example()
    {
        SomeProperty = "some value";
    }
}

但是,直接从getter返回常量值要简单得多,应该优先使用:

class Example
{
    public static string SomeProperty
    {
        get { return "some value"; }
    }
}

这段代码清晰而切中要害。自动属性应该使您的代码更具可读性。在这种情况下,它们实际上会混淆意图,所以我不会在这里使用它们。


注意,你的示例代码中的属性是根本不是一个自动属性;这只是一个标准性质。自动属性声明getter和setter,但不提供实现。