1

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

private const string _keyc = "blahblahblah";

private static string _key
{
     get { return "blahblahblah"; }
}

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

然而,ILSpy 完全按照我编写的方式获取了源代码。

所以在这里,我想知道,在这里使用汽车属性真的有意义吗?使用自动属性还有其他优点吗?特别是在这种简单的情况下,是否建议使用 auto 属性?谢谢!

4

1 回答 1

3

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

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

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

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,但不提供实现。

于 2013-01-17T19:21:56.030 回答