我正在研究一些代码,其中有很多这样的代码:
private int x;
public void SetX(int new_x)
{
this.SetXValue(new_x);
}
private void SetXValue(int new_x)
{
this.x = new_x;
}
和类似的属性:
private int x;
public int X
{
get { return this.GetX(); }
}
private int GetX()
{
return this.x;
}
我没有得到的是为什么需要私有方法来完成实际工作,即为什么不只是有这样的方法:
public void SetX(int new_x)
{
this.x = new_x;
}
public int X
{
get { return this.x; }
}
只是其他人的个人选择还是有一些使用第一种方式的充分理由?
(我手动输入上面的代码很抱歉,如果有任何错误,但你应该希望看到我想说的话)
干杯 甲
答案 0 :(得分:7)
就我所见,没有理由像这样的代码。如果你没有对新值进行任何操作(比如在存储之前进行处理/检查)并且你正在编写C#3.0,那么你实际上可以将它简写为:
public int MyProperty { get; set; }
编译器为您创建后备存储,您只需引用:
this.MyProperty
......在你的班级里面。您还可以创建仅限get的属性,如:
public int MyProperty { get; private set; }
我认为所有这些都非常整洁!
答案 1 :(得分:1)
为什么不直接使用Getters和Setters来实现逻辑?我不理解需要其他方法,除非你有额外的参数影响setter的行为:
private int myVar;
public int MyProperty
{
get
{
return myVar;
}
set
{
myVar = value;
}
}
public void SetMyPropertySpecial(int a, string reason)
{
Console.WriteLine("MyProperty was changed because of " + reason);
this.myVar = a;
}
更新
事实上,这个人似乎喜欢拥有更多代码,但结构完全没用。使用Getters和Setters坚持.NET标准(参见MSDN)
答案 2 :(得分:1)
不,没有理由这样做,看起来有人用代码行支付了费用。
所以,是的,你是对的,这只是其他人的个人选择,而且不是一个很好的选择。
答案 3 :(得分:1)
我认为它必须是一位老Java开发人员才能做到这一点。
.Net方式
private int _foo;
public int Foo
{
get
{
return _foo;
}
set
{
_foo = value;
dostuff();
}
}
答案 4 :(得分:1)
一般的经验法则是,当存在获取/设置值所需的逻辑的相关部分时(例如,在获取期间设置或数据库访问期间的验证),使用属性进行简单的获取/设置操作和获取/设置方法。
因此,如果实际代码非常简单,只需使用属性并在其getter / setter中完成工作。
如果实际代码更复杂,请按照第三个示例中的方法替换属性(至少是setter)。
答案 5 :(得分:1)
一个可能的原因是属性可以具有只有在外部设置属性时才应执行的登录,并且来自类内部的调用不执行整个逻辑,而只执行私有方法中的逻辑。当然,提前制作这些方法是没有意义的,因为以后引入这些方法不会改变课程的合同。很可能无论谁编写这段代码都是C#的新手,并且不了解属性的作用。
答案 6 :(得分:0)
这很奇怪,没有正当理由这样做。请重构该代码。由于setter可以包含在属性中,因此也不需要SetX
方法。 e.g:
public int X {get; set;}
答案 7 :(得分:0)
我可能失去了一些东西,但是这看起来有点疯狂的给我!
您可以通过使用自动属性或带有支持字段的属性来实现相同目的。这里有两个很好的描述:http://weblogs.asp.net/dwahlin/archive/2007/12/04/c-3-0-features-automatic-properties.aspx
答案 8 :(得分:0)
是的,只有当SetValue
为private
或protected
并且不仅仅是设置值时,这样才会有效。
我正在开展一个项目,我们做了很多这样的事情。那是因为我们所做的不仅仅是设置一个值(值检查,状态检查等)
拥有公共制定者和公众SetValue
根本没有任何意义,并且会使您的消费者对使用的制定者感到困惑。
这是我们使用这种设计的另一个场景:
public abstract class A{
protected virtual void SetValue(object value);
public object SomeObject{
set{SetValue(value);}
}
}
在这种情况下,我们希望类A
将设置/检查该值委托给从中继承的任何类。