【发布时间】:2011-02-02 10:26:54
【问题描述】:
例如,在返回值方面使用哪个更好
public int EmployeeAge
{
get{return intEmployeeAge};
}
还有
public int EmployeeAge()
{
return intEmployeeAge;
}
哪个更好,为什么?当我们有上述 secnario 时,最好的编程实践是什么?
【问题讨论】:
标签: c# properties methods
例如,在返回值方面使用哪个更好
public int EmployeeAge
{
get{return intEmployeeAge};
}
还有
public int EmployeeAge()
{
return intEmployeeAge;
}
哪个更好,为什么?当我们有上述 secnario 时,最好的编程实践是什么?
【问题讨论】:
标签: c# properties methods
我认为这与您正在编程的文化有很大关系。在我看来,C# / .NET 文化在这种情况下更喜欢使用属性。
我的建议:尽量与您使用的主要库保持一致。
但是:小心使用属性(或用于相同目的的函数,如您上面的示例),因为它们通常是糟糕设计的标志。你想告诉你的对象做事,而不是询问他们提供信息。不过,不要对此抱有宗教色彩,请注意这是一种代码气味。
【讨论】:
如果您只需要返回一个值,请使用属性。
如果您需要在返回值之前做某事,请使用函数。
【讨论】:
属性是表达对象特性的一种有用方式,允许以数据绑定、反射和序列化等 API 可以使用的通用方式获取/设置。所以对于对象的简单值,属性很方便。属性不能接受参数,不应该有明显的副作用*,并且应该快速且可重复地返回。此外,没有“扩展属性”(镜像扩展方法)或通用属性之类的东西。
(不过,*=延迟加载等并不少见)
方法(C# 没有函数)更适合表达改变状态的事物,或者期望花费一些时间且不一定可重现的事物。他们不倾向于在绑定/序列化等方面工作。
请注意,属性实际上只是编写方法的一种特殊方式。 功能差别不大。这一切都是为了表达意图。但是,不想 公开的一件事是 fields(实际的 intEmployeeAge 实例变量)。
所以我会:
public int EmployeeAge { get{return intEmployeeAge}; }
或者只是(如果在Employee 对象上):
public int Age { get{return intEmployeeAge}; }
当然……那么问题就变成了“在什么单位?”我假设那是几年?
【讨论】:
get / set are 方法。幕后,其实就是get_Age和get_EmployeeAge
【讨论】:
哪个更好,为什么?当我们有什么是最好的编程实践 像上面那样的条件?
我用 C# 编写,但我更喜欢使用 Get/Set 函数,对我来说,这是更好的方式来表达我可以从对象获得什么以及如何更改它的状态(并且这些方法在 Intelisense 中按字母分组,即也不错)。但是,如果团队更喜欢其他约定,这不是问题,但是当我处理自己的项目时,阅读 API 会更容易。
e.g
Obejct1 o = new Object1();
o.P1;
o.P2;
o.P3;
从查看 API 来看,您无法说出您在公共 API 中所做的更改或只读属性的更改,除非您使用的 IDE 会显示一个小图标,显示您实际上可以做什么。
Object1 o = new Object1();
o.GetP1();
o.SetP2();
o.SetP3();
可以从 API 中轻松找到类型的客户端如何更改数据。
【讨论】:
属性是一种以简单方式探索类的内部数据元素的方法。我们可以使用类型安全的 get 和 set 方法来实现属性。使用调用约定隐式调用属性。属性适用于编译和运行时。
Method 是包含一系列语句的代码块。Method 被显式调用。 方法在运行时起作用。
【讨论】:
我参加这个聚会有点晚了,但我只想提一下属性和无参数“get”方法之间的另一个令人惊讶的区别。正如@MarcGravell 所说,延迟加载是使用属性时的常见模式,但请注意Heisenberg Watch Window 陷阱!
【讨论】: