我们经常被告知我们应该通过为类字段制作getter和setter方法(C#中的属性)来保护封装,而不是将字段暴露给外部世界.
但是很多时候,一个字段只是用来保存一个值,并且不需要任何计算来获取或设置.对于这些,我们都会这样做:
public class Book
{
private string _title;
public string Title
{
get{ return _title; }
set{ _title = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,我有一个坦白,我不忍心写所有这些(真的,它不必写它,它不得不看它),所以我去流氓和使用公共领域.
然后是C#3.0,我看到他们添加了自动属性:
public class Book
{
public string Title {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
这更整洁,我很感激它,但是真的,除了创建一个公共领域之外还有什么不同?
public class Book
{
public string Title;
}
Run Code Online (Sandbox Code Playgroud) 我看到很多C#类的示例代码执行此操作:
public class Point {
public int x { get; set; }
public int y { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
或者,在旧代码中,具有显式私有支持值并且没有新的自动实现属性:
public class Point {
private int _x;
private int _y;
public int x {
get { return _x; }
set { _x = value; }
}
public int y {
get { return _y; }
set { _y = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么.在执行上述操作与仅将这些成员设为公共字段之间是否有任何功能差异,如下所示?
public class Point {
public int x;
public int y;
}
Run Code Online (Sandbox Code Playgroud)
为了清楚起见,当您需要对基础数据进行一些翻译时,我理解了getter和setter的价值.但是,如果你只是传递价值观,那似乎是不必要的冗长.
在我看过的大部分代码中(在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中提供一个漂亮的图标,并放在类图中的特殊部分!
首先,我已经阅读了关于这个主题的帖子列表,并且由于我对封装和字段修饰符(private,public..ect)的了解,我不觉得我已经掌握了属性.
我学习的C#的一个主要方面是使用封装在代码中保护数据的重要性.我认为'我理解这是因为使用修饰符的能力(私人,公共,内部,受保护).然而,在了解了属性之后,我不仅理解了属性的使用,而且还理解了C#中数据保护(我理解为封装)的整体重要性/能力.
更具体地说,当我到达C#中的属性时,我读过的所有内容都是你应该尝试使用它们代替字段,因为:
1)当您直接直接访问字段时,它们允许您更改数据类型.
2)它们为数据访问增加了一定程度的保护
然而,根据我的想法,我已经了解了字段修饰符的使用#2,在我看来属性只是生成了额外的代码,除非你有一些理由改变类型(#1) - 因为你是(或多或少)创建隐藏方法来访问字段而不是直接访问.
然后可以将整个修饰符添加到属性中,这进一步使我对属性访问数据的需要的理解变得复杂.
我已经阅读了不同作者关于"属性"的一些章节,并且没有人真正解释过对属性与字段与封装(以及良好的编程方法)的良好理解.
有人能解释一下:
1)为什么我想要使用属性而不是字段(特别是当它出现时我只是添加额外的代码
2)在跟踪其他人的代码时,有关识别属性的使用以及不将它们视为简单方法(除了get; set明显)之外的任何提示吗?
3)任何关于何时使用什么的良好编程方法的一般经验法则?
感谢和抱歉这篇长篇文章 - 我不想只问一个问题100x而不解释为什么我再问它.
每当有关于Properties的可信度的问题时,我发现大多数讨论都是围绕函数/方法和属性进行的.但我也想知道使用属性与相关私有字段直接与公共字段直接使用的令人信服的理由,包含最常见的获取/设置行为而没有其他处理,我的意思是这种方式
public string CustomerName;
Run Code Online (Sandbox Code Playgroud)
VS
private string customerName;
public string CustomerName
{
get{return customerName;}
set(string value){this.customerName=value;}
}
Run Code Online (Sandbox Code Playgroud)