3

在开发我的应用程序时,我有时会想到我需要一个当前的属性,比如说私有,但也许稍后当我们需要处理新场景时,我们可能需要将它设为公开。但是,即使这会发生,我总是希望二传手保持私密。我想写这样的代码:

private int A
{
  get{return _a;}
  private set {_a = value;}
}

编译器抱怨 setter 上的访问修饰符应该比属性更严格。好吧,我需要删除 set 上的访问修饰符,但如果以后我需要将该属性公开,我也会公开它的 setter。

你不认为这是一个警告而不是错误更好吗?

4

5 回答 5

4

如果您要更改代码来说,public您也可以同时更改代码来说private set

至于这是一个警告,我认为这是有道理的——我认为只有指定private两次(尽管显然毫无意义),任何事情都不会失败。也就是说,我很少遇到这个编译器错误,当我遇到这个错误时,我花了 5 秒钟来修复它并继续前进。

具有讽刺意味的是,我们俩现在在这个问题和答案上花费的时间比我们可能遇到的这个错误和它的影响要长:-)

于 2012-07-03T11:24:47.013 回答
2

你不认为这是一个警告而不是错误更好吗?

不,我认为您最好使用私有变量 ( private int _a;),并且仅在需要时将其提升为具有适当修饰符的属性。

当然,如果没有 setter,就不能像这样使用验证:

private int _a;
public int A
{
    get { return _a; }
    private set { 

        if (value < 0 || value > 10)
        {
            throw new ArgumentOutOfRangeException("A");
        }

        _a = value; 
    }
}

但另一方面,首先将财产标记为公开并没有什么坏处,不是吗?

于 2012-07-03T11:29:19.510 回答
1

更改这两个修饰符是完全有效的,所以我不会太在意 privat setter:

public int A
{
  get{return _a;}
  private set {_a = value;}
}

这只是我的猜测,警告来自编译器将属性重新写入 IL 代码的方式。属性将被编写为每个具有与属性本身相同的修饰符的 getter 和 setter 方法。

如果您现在尝试定义私有属性的私有 setter,这将转化为:

private private get_A()
{
   return _a;
}

而这个加倍的私有修饰符显然不会编译。

于 2012-07-03T11:35:25.213 回答
0

您示例中的代码没有意义。如果您的财产是私有的,那么 setter 也是私有的。您只需要在 setter 上指定访问修饰符,如果 setter 必须有另一个访问修饰符然后是 getter。

于 2012-07-03T11:27:46.207 回答
0

我认为您想要执行以下操作...

private int _a;
public int A
{
    get { return _a; }
    private set { _a = value; }
}

这使得 get 访问器是公开的,但 set 是私有的。

于 2012-07-03T11:32:57.823 回答