繁体   English   中英

c#getters setters风格

[英]c# getters setters style

我正在研究一些代码,其中有很多这样的代码:

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; }
}

它只是其他人的个人选择还是有一些使用第一种方式的充分理由?

(我手动输入上面的代码很抱歉,如果有任何错误,但你应该希望看到我想说的话)

干杯A.

就我所见,没有理由像这样的代码。 如果你没有对新值做任何事情(比如存储前的处理/检查),而你正在编写C#3.0,你实际上可以简单地将它简写为:

public int MyProperty { get; set; }

编译器为您创建后备存储,您只需引用:

this.MyProperty

......在你的班级里面。 您还可以创建仅限get的属性,例如:

public int MyProperty { get; private set; }

我认为所有这些都非常整洁!

为什么不直接使用Getters和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;
    }

更新:

实际上,这个人似乎喜欢拥有更多代码,但结构完全没用。 使用Getters和Setters坚持.NET标准(参见MSDN

不,没有理由这样做,看起来有人用代码行付钱。

所以,是的,你是对的,这只是其他人的个人选择,而且这不是一个很好的选择。

我认为它必须是一个旧的Java开发人员才能做到这一点。

.Net的方式是

private int _foo;

public int Foo
{
     get
     {
         return _foo;
     }
     set
     {
          _foo = value;
          dostuff();
     }
 }

一般的经验法则是,当存在获取/设置值所需的逻辑的相关部分时(例如,在get期间的设置或数据库访问期间的验证),使用属性进行简单的get / set操作和get / set方法。

因此,如果实际代码非常简单,只需使用属性并在其getter / setter中完成工作。

如果实际代码更复杂,请按照第三个示例中的方法替换属性(至少是setter)。

一个可能的原因是属性可以具有只有在外部设置属性时才应执行的登录,并且来自类内部的调用不执行整个逻辑而只执行私有方法中的逻辑。 当然,提前制作这些方法是没有意义的,因为以后引入这些方法不会改变课程的合同。 编写此代码的人可能是C#的新手,并且不了解属性的作用。

这非常离奇,没有正当理由这样做。 请重构该代码。 也不需要SetX方法,因为setter可以包含在属性中。 例如:

public int X {get; set;}

我可能失去了一些东西,但是这看起来有点疯狂的给我!

您可以通过使用自动属性或具有支持字段的属性来实现相同的目的。 这里有两个很好的描述: http//weblogs.asp.net/dwahlin/archive/2007/12/04/c-3-0-features-automatic-properties.aspx

是的,只有当SetValueprivateprotected并且不仅仅是设置一个值时,这也没关系。

我正在做一个我们做很多事情的项目。 这是因为我们所做的不仅仅是设置一个值(值检查,状态检查等)。拥有一个公共setter和一个公共SetValue根本没有意义,并且会让你的消费者混淆使用什么setter。

这是我们使用这种设计的另一种情况:

public abstract class A{
   protected virtual void SetValue(object value);
   public object SomeObject{
      set{SetValue(value);}
   }
}

在这种情况下,我们希望类A将设置/检查该值委托给从中继承的任何类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM