在我看过的大部分代码中(在SO上,我都会在我自己的代码中使用codeproject.com),我已经看到为一个类包含的每个私有字段创建公共属性,即使它们是最多的基本类型get; set;
:
private int myInt;
public int MyInt
{
get { return myInt; }
set { myInt = value }
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:这与以下方面有何不同:
public int MyInt;
Run Code Online (Sandbox Code Playgroud)
如果我们应该使用属性而不是公共字段,为什么我们应该在这种特定情况下使用它们呢?(我不是在讨论更复杂的例子,其中getter和setter实际上做了一些特殊的事情,或者只有一个get或set(只读/写)而不是只返回/设置私有字段的值).它似乎没有添加任何额外的封装,只在IntelliSense中提供一个漂亮的图标,并放在类图中的特殊部分!
那里有很多建议你不应该公开地公开你的字段,而是使用普通的属性.我一遍又一遍地看到它.
我理解这些论点,但在大多数情况下我认为这不是一个好建议.
有没有人有一个真正重要的时间的例子?在写一个琐碎的财产时,将来可能会有一些重要的事情(或者当没有使用它时会让他们陷入真正的麻烦)?
编辑:DataBinding参数是正确的,但不是很有趣.DataBinding代码中的一个错误是它不接受公共字段.因此,我们必须编写属性来解决该bug,而不是因为属性是明智的类设计选择.
编辑:要清楚,我正在寻找现实世界的例子,而不是理论.真正重要的时刻.
编辑:在setter上设置断点的能力似乎很有价值.为调试器设计我的代码是不幸的:我宁愿调试器变得更聪明,但考虑到我们的调试器,我将采用这种能力.好东西.
我无法理解为什么C#3.0中存在自动实现的属性语言功能.
你说的时候有什么不同
public string FirstName;
Run Code Online (Sandbox Code Playgroud)
比
public string FirstName { get; set; }
Run Code Online (Sandbox Code Playgroud) 我在Outlook 2013的VSTO插件中使用.NET 4.5.我在完全掌握属性和访问器方面遇到了一些麻烦.我假设的自动实现的访问器就是你刚刚写的get; 组; 而不是得到{// code}等等也给我带来了麻烦.我有一本我在班上内部使用的词典.这是我的代码:
private Dictionary<string, string> clientDict { get; set; }
private Dictionary<string, string> clientHistoryDict { get; set; }
Run Code Online (Sandbox Code Playgroud)
然后是:
clientDict = new Dictionary<string, string>();
clientHistoryDict = new Dictionary<string, string>();
Run Code Online (Sandbox Code Playgroud)
我在稍后的代码中使用与同一类中的属性相同的名称.
我从来没写过:
private Dictionary<string, string> _clientDict; // etc.
Run Code Online (Sandbox Code Playgroud)
创建我刚才直接使用属性的变量.
我尝试更改我的代码来执行此操作,我遇到了一些问题,并意识到我对属性的理解有点混乱.
以下是我需要澄清的几个问题,我似乎无法找到正确的答案.
首先,有没有理由使用私有财产?我的字典永远不会在类之外或任何派生类中访问,所以是否有理由使用属性?我不使用任何特殊的验证或setter中的任何东西或类似的东西.
其次,当我尝试更改我的代码以使用变量,然后通过像典型属性示例那样的属性访问它们时,我遇到了问题.我找到了一个getter设置的示例return _clientDict
,但是setter只是set;
它给了我错误:我必须设置一个body,因为它不是抽象的或部分的.为什么在这种情况下它不会为我自动实现setter?
最后,当我在声明它的同一个类中的属性上调用new时,使用属性和相同类型的普通变量之间的区别是什么?在这种情况下,属性是否与变量完全不同?当应该使用私有变量完成时,以这种方式使用属性是不好的做法吗?
这些可能是一些误入歧途的问题,但我找不到任何其他有信息帮助我理解这些区别的地方.我一直在玩房产试图找出所有这些,但我可以使用这样的帮助.
我是新手,我正在努力学习C#的基础知识.这可能听起来很微不足道,可能是愚蠢的,但这是一个疑问.在浏览应用程序的一个源代码时,我在一个类中看到了一段代码
private string fname;
public string FirstName
{
get
{
return fname
}
set
{
fname = value;
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我这是什么意思.我知道当我们声明一个fname
使用别名访问的类时FirstName
.如果它出于某种安全目的那么呢?