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和一个public
SetValue
根本没有意义,会让你的消费者对使用什么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实际上第一句话就是解决这个问题,可能不是很明显,但实际上是解决了这个问题。不使用新值进行任何操作。从功能的角度来看,没有理由在该模式下写入。但是一个想法出现在我的脑海里!!!!迷惑!!!!。当一个公共方法更难隐藏时,一个私有方法将被一个模糊器破坏。