c#getters setters风格
我正在编写一些代码,其中有很多类似这样的代码:c#getters setters风格,c#,properties,private,setter,getter,C#,Properties,Private,Setter,Getter,我正在编写一些代码,其中有很多类似这样的代码: 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 Ge
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; }
}
这仅仅是其他人的个人选择,还是有充分的理由使用第一种方式
(我手动输入了上面的代码,如果有任何错误,非常抱歉,但希望您能看到我想说的内容)
干杯
为什么不直接使用getter和setter来实现逻辑呢?我不理解是否需要其他方法,除非您有影响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;
}
更新:
事实上,这个人似乎喜欢有更多的代码行,但结构是完全无用的。坚持使用getter和setter的.NET标准(请参阅)不,没有理由这样做,看起来有人是通过代码行付费的
所以,是的,你是对的,这只是其他人的个人选择,这不是一个很好的选择。就我所知,没有理由编写这样的代码。如果您没有对新值进行任何操作(如存储前的处理/检查),并且您正在编写C#3.0,那么您实际上可以将其简写为:
public int MyProperty { get; set; }
编译器将为您创建备份存储,您只需引用:
this.MyProperty
…在你的课堂上。您还可以创建“仅获取”属性,如:
public int MyProperty { get; private set; }
我认为所有这些都很整洁 这太奇怪了,没有正当的理由这么做。请重构代码。也不需要
SetX
方法,因为setter可以包含在属性中。e、 g:
public int X {get; set;}
我可能错过了一些东西,但这看起来有点疯狂
您可以通过使用自动属性或带有支持字段的属性来实现相同的功能。这两个方面都有一个很好的描述:我认为这一定是一个老的Java开发人员做的 Net的方式是
private int _foo;
public int Foo
{
get
{
return _foo;
}
set
{
_foo = value;
dostuff();
}
}
一般的经验法则是,当获取/设置值需要相关的逻辑部分时(例如,设置期间的验证或获取期间的数据库访问),使用简单的获取/设置操作和获取/设置方法的属性 因此,如果实际的代码真的像您的示例中那样简单,那么只需使用属性并在它们的getter/setter中完成工作
如果实际代码更复杂,则替换属性(至少是setter)通过第三个示例中的方法执行。一个可能的原因是,属性可以具有登录名,只有在外部设置属性时才应执行该登录名,并且来自类内部的调用不会执行整个逻辑,而只执行私有方法中的逻辑。当然,提前创建这些方法是没有意义的,因为稍后引入它们不会改变类的契约。编写此代码的人很可能是C#的新手,不了解属性的作用。是的,只有当
SetValue
是private
或protected
并且不仅仅是设置值时,这才可以
我正在做一个项目,在那里我们做了很多这些事情。这是因为我们所做的不仅仅是设置一个值(值检查、状态检查等)
拥有一个公共setter和一个publicSetValue
根本没有意义,会让你的消费者对使用什么setter感到困惑
下面是我们使用这种设计的另一个场景:
public abstract class A{
protected virtual void SetValue(object value);
public object SomeObject{
set{SetValue(value);}
}
}
在这种情况下,我们希望class
A
将该值的设置/检查委托给继承它的任何类 虽然这很好,但我看不出这是如何回答这个问题的。问题是,使用私有方法是否有原因,简单的回答是:没有,没有。当我开始编写C#3代码时(从那时起是4),我所有的代码都变得更整洁、更具表达力。他们引入了一些非常好的语言功能,让您可以保持事物的整洁和可读性——这只是其中的一个例子。@PatrikHägne-同意!编辑@PatrikHägne实际上第一句话就是解决这个问题,可能不是很明显,但实际上是解决了这个问题。不使用新值进行任何操作。从功能的角度来看,没有理由在该模式下写入。但是一个想法出现在我的脑海里!!!!迷惑!!!!。当一个公共方法更难隐藏时,一个私有方法将被一个模糊器破坏。