2

可能重复:
公共字段与自动属性

我想这会在某个地方得到回答,但我在通常的地方找不到它。我想知道,这样做有什么好处

private int _foo;
public int foo {get {return _foo;} set{_foo = value;}}

或者

public int foo {get; set;}

刚刚结束

public int foo;

如果需要更复杂的操作,我可以看到好处,但是像这样的简单案例有什么好处?

4

6 回答 6

4

实际上,所有的指导方针都是关于创建可重用的库。在那里,当您创建一个property(使用 get/set)时,您还可以在不更改代码的外部定义(因此不需要重新编译其他库)。但是,如果您总是重新编译整个解决方案并且没有其他人使用该库,那么这没有任何价值。

使用属性的另一个好处是您可以限制谁可以获取或设置该值。例如,每个人都可以获取该值,但只有派生类可以设置它(protected)。

这就是说,仍然建议始终使用属性public(而不是private字段)。

我只在需要最佳性能时才公开字段(例如连续访问值百万次)。

所以总结一下

属性(获取/设置)对字段的好处:

  • 能够稍后添加代码,而无需重新编译引用它的程序集。
  • 能够提供私有/受保护/内部集和公共获取(或任何其他组合)。
  • 公共字段不符合 CLS

属性的缺点:

  • 访问速度较慢(读取和写入)。
  • 不能作为ref参数传递给方法。
于 2012-11-09T09:14:59.067 回答
3

这个问题在这里被问了很多次。这些案例没有明确的利益证据(财产内部没有逻辑)。会说更多,使用字段,您可以获得一些最小(纳米)的速度优势,但与 99.99% 的情况无关。

MS 定义的指南建议使用properties, 来提高代码的可扩展性和可维护性。因此,遵循该指南可以让不熟悉代码的人更轻松地阅读它。

于 2012-11-09T08:53:06.913 回答
2

请参阅此 Jon Skeet 教程何时使用属性而不是函数来讨论此问题。还有十亿个与此主题相关的问题和资源,Google/SE 搜索将公开这些问题和资源。

我希望这有帮助。

于 2012-11-09T08:55:20.863 回答
1

据我说,使用“get-set”是提供一个属性。基本上,您在为变量提供 get-set 属性的同时实现了封装的概念。

于 2012-11-09T09:09:46.043 回答
1

想象一下,您在一个类中有公共变量来存储数据。但是,如果您需要进行数据验证,则无法使用类中的公共变量来执行此操作。因为你无法控制它们。局外人、其他程序员、任何访问您的项目的人都可以在一个类中编辑这些公共变量。

主要是,为了控制对您类中数据的访问,我们使用属性。它们仍然是变量,但在您班级的权限范围内。这些变量可以来自任何数据类型(例如 String、Int、Bool、Objects 等)

可以使用三个主要选项来实现属性,具体取决于您希望使用属性实现的目标/方式。

Get - access to the property and retrieve its value
Let - access to the property and update its value
Set - access to the property and used with objects 

了解 Get/Set 方法的真正用途至关重要。我同意 Tigaran 的评论。

如果有人要对我投反对票,我想知道原因!

于 2012-11-09T09:25:10.793 回答
0

我想你已经回答了你自己的问题。

对于像这样的简单情况,没有真正的优势。使用速记属性创建自动获取/设置方法:

public int Foo { get; set; }

对于需要转换的更复杂的示例,您可以使用显式的 get 和 set 方法灵活地更改内容。

于 2012-11-09T08:54:27.387 回答