使用C#的get set属性被认为是好习惯吗?

时间:2009-12-02 02:12:44

标签: c# .net

我的问题很简单,使用C#的get set属性被认为是好的,甚至比编写getter和setter方法更好?使用这些属性时,是否必须将类数据成员声明为公共?我问这个是因为我的教授说数据成员从不被宣布为公开,因为它被认为是不好的做法。

:此...

class GetSetExample
{
    public int someInt { get; set; }
}

vs 这......

class NonGetSetExample
{
    private int someInt;
}

修改

谢谢你们所有人!你的所有答案都帮助了我,我适当地向你投了你的答案。

8 个答案:

答案 0 :(得分:14)

此:

class GetSetExample
{
    public int someInt { get; set; }
}

与此完全相同:

class GetSetExample
{
    private int _someInt;
    public int someInt {
        get { return _someInt; }
        set { _someInt = value; }
    }
}

get; set;语法只是一种方便的简写,当getter和setter不做任何特殊操作时,你可以使用它。

因此,您没有公开公共成员,您正在定义私有成员并提供get / set方法来访问它。

答案 1 :(得分:7)

是的,由于多种原因,成员通常不应在良好的设计中公开宣布。想想稍后继承该类的OOP。有点难以覆盖一个字段。 :-)它还可以防止你直接访问内部。

简单化得到;组;设计是在C#2.0中引入的。它与支持它的私有成员声明所有内容基本相同(在Reflector等工具中反编译它)。

public int someInt{get;set;} 

直接等于

private int m_someInt;
public int someInt{
  get { return m_someInt; }
  set { m_someInt = value; }
} 

关于使用简化的getter / setter的重要一点是,当你想稍后用更多的内容填充实现时,你不会破坏ABI的兼容性。

不要担心getter / setter会通过间接方式降低代码速度。 JIT有一个叫做内联的东西,使用getter / setter和直接字段访问一样高效。

答案 2 :(得分:7)

是。数据成员应该是私有的,自动属性允许它并以正确的方式提供公共访问。

但你应该小心。理解上下文非常重要。在线程应用程序中,更新一个属性跟随另一个相关属性可能会对一致性有害。在这种情况下,以适当的方式更新两个私有数据成员的setter方法更有意义。

答案 3 :(得分:4)

在您的第一个示例中,C#自动生成私有支持字段,因此从技术上讲,数据成员不会被声明为仅公共getter / setter。

答案 4 :(得分:2)

因为使用公共数据成员,该数据成员可以更改或可以在类外读取 并且您无法控制读/写操作可访问性,但您可以控制属性 读/写流例如考虑这个语句:

 public MyVar{private get; public set;}

意味着MyVar的值只能在课堂内部进行更改,并且可以在课堂外阅读(私下阅读并公开阅读),而这对于公共数据成员来说是不可能的

答案 5 :(得分:1)

在“纯粹的”面向对象的方法中,根本不公开对象的状态是不行的,这适用于在.NET中实现的属性和Java / EJB的get_set_ properteis。我们的想法是,通过公开对象的状态,您将创建对象的内部数据表示的外部依赖关系。纯对象设计减少了与带参数的消息的所有交互。

回到现实世界:如果你试图在工作中实施如此严格的理论方法,你要么被嘲笑出办公室,要么被殴打成纸浆。属性非常受欢迎,因为它们是纯对象设计和完全暴露的私有数据之间的合理折衷。

答案 6 :(得分:0)

这很合理,你的教授(没有背景)是错的。但无论如何,使用“自动属性”很好,无论是公共还是私有,都可以这样做。

虽然根据我的经验,每当我使用它时,我几乎不可避免地需要在那里写一些逻辑,因此不能使用汽车道具。

答案 7 :(得分:0)

你的教授是对的。

  

考虑一下为什么应该避免“getter”的简单示例:程序中可能有1,000个调用getX()方法,并且每个调用都假定返回值是特定类型。例如,getX()的返回值可以放在局部变量中,并且变量类型必须与返回值类型匹配。如果您需要以 X 的类型发生变化的方式更改对象的实现方式,那么您就会陷入困境。如果 X 曾经是int,但现在必须是long,那么您现在将获得1,000个编译错误。如果通过将返回值强制转换为int来错误地修复问题,则代码将干净地编译但不起作用。 (返回值可能会被截断。)您必须修改围绕这1,000个调用中的每一个的代码以补偿更改。至少,我不想做那么多工作。

Holub On Patterns