我的问题很简单,使用C#的get set属性被认为是好的,甚至比编写getter和setter方法更好?使用这些属性时,是否必须将类数据成员声明为公共?我问这个是因为我的教授说数据成员从不被宣布为公开,因为它被认为是不好的做法。
:此...
class GetSetExample
{
public int someInt { get; set; }
}
vs 这......
class NonGetSetExample
{
private int someInt;
}
修改
谢谢你们所有人!你的所有答案都帮助了我,我适当地向你投了你的答案。
答案 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个调用中的每一个的代码以补偿更改。至少,我不想做那么多工作。