使用getter和setter的优点是什么 - 只能获取和设置 - 而不是简单地使用公共字段来存储这些变量?
如果getter和setter做的不仅仅是简单的get/set,我可以非常快地解决这个问题,但我并不是100%清楚如何:
public String foo;
Run Code Online (Sandbox Code Playgroud)
更糟糕的是:
private String foo;
public void setFoo(String foo) { this.foo = foo; }
public String getFoo() { return foo; }
Run Code Online (Sandbox Code Playgroud)
而前者需要很少的样板代码.
有时我看到用readonly成员定义的类是这样的:
class Foo
{
private readonly string bar;
public Foo(string bar)
{
this.bar = bar;
}
public string Bar => bar;
}
Run Code Online (Sandbox Code Playgroud)
有时我看到用readonly成员定义的类是这样的:
class Foo
{
public Foo(string bar)
{
Bar = bar;
}
public string Bar { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
第二个例子看起来更具可读性/简洁性,但我想知道是否有任何合理的理由明确定义readonly
支持字段(根据第一个例子)?
有关这两个例子的深入分析,请在CLR中理想地涵盖真正发生的事情.
Visual Studio 2019
给出了以下关于 private 的建议_myNum
:改为使用auto-property
。起初我很想这样做,摆脱这个private
变量并拥有带有private set
. 但这并没有提供相同的功能:我想要一个公共属性来公开这条给定的信息,并且只在一个可以设置这条数据的地方 - 构造函数,因此是关键字readonly
。
换句话说,我是对的吗?这个建议并不总是正确的?
public class Foo
{
public int MyNum { get { return _myNum; } }
private readonly int _myNum;
public Foo(int num)
{
_myNum = num;
}
}
Run Code Online (Sandbox Code Playgroud)
应用自动完成建议,代码如下所示:
public int MyNum { get; }
public Foo(int num)
{
MyNum = num;
}
Run Code Online (Sandbox Code Playgroud) c# refactoring code-analysis visual-studio roslyn-code-analysis