我应该使用哪种方案来更改类方法/属性中的私有字段:
public class Example
{
private int intVar = 0;
private string stringVar = string.Empty;
public int IntVar
{
get { return this.intvar; }
set { this.intvar = value; }
}
public string StringVar
{
get { return this.stringVar ; }
set { this.stringVar = value; }
}
private void SomeMethod()
{
//change fields in this way:
this.intVar = 50;
this.stringVar = "changed";
//or that way(through properties):
this.IntVar = 50;
this.StringVar = "changed";
}
}
也许在这个例子中它没有任何区别,但如果有人向属性添加额外的代码,并通过属性更改字段会改变其他一些事情呢?
你能说哪种方式更好,或者它真的没什么区别?
我知道自C#3.0以来我可以编写自动实现的属性,但这是C#2.0。
答案 0 :(得分:1)
我说使用房产通常会更好。如果getter和setter很简单,那么它们可能会在运行时通过抖动进行内联。正如您所说,可能会对属性代码进行其他更改。
一个常见的变化是通过实施INotifyPropertyChanged添加更改通知。如果直接设置字段,则不会通知监听器。
我更喜欢我的类使用他们自己的公共接口而不是内部。对我来说例外是我明确不想要任何副作用。但情况很少见。
答案 1 :(得分:1)
根据我的经验,始终使用属性,不要尝试直接访问var。 如果将来有人向属性访问器添加代码,那么它是否有责任检查其更改的副作用。
在这种情况下,您将为测试工作提供便利。变更实施者只需要检查公共名称而不是内部变量。
答案 2 :(得分:1)
如果你进行某种验证,例如当intVar超过100时将一个Example对象标记为无效,那么你应该使用属性。
public int IntVar
{
get { return this.intvar; }
set
{
if ( value > 100)
// handle this corner case
else
this.intvar = value;
}
}
假设您的私有方法进行了一些计算
private void SomeMethod()
{
int result = ...;
IntVar = result;
}
调用SomeMethod时最好在这里使用属性,因此该属性将处理验证,因为该字段无法执行此操作。
答案 3 :(得分:0)
它没有任何区别,是个人偏好 我更喜欢使用这些属性。