2012-04-24 66 views
7

考虑下面的代码:这种访问修饰符的方法的目的是什么?

private string _text = null; 
    private string[] _values = null; 

    public string Text { get { return _text; } } 
    public string[] Values { get { return _values; } } 

是什么成就,仅仅具有public成员不会?

+7

请注意,在将数组作为类的只读属性公开时,应该非常非常小心。 **数组引用是只读的,但是数组内容不是。**这个类的用户可以随意改变数组的内容。如果不需要,则返回一个'ReadOnlyCollection ',而不是'string []'。 – 2012-04-24 18:52:43

+1

Eric对此主题的详细想法:http://blogs.msdn.com/b/ericlippert/archive/2008/09/22/arrays-considered-somewhat-harmful.aspx – SolutionYogi 2012-04-24 19:21:44

回答

10

通过使用属性而不是公用字段,可以隐藏实现。

如果在某些时候需要更改文本和值属性的返回值,则可以在不更改该类的API的情况下更改行为。

此外,此习语限制外部访问公开数据为只读。

+2

转载了只读访问的问题,希望这不太模糊。感谢@AdamHouldsworth! – 2012-04-24 16:12:16

5

此代码将允许外部实体读取您的值,而您的代码可以在内部修改后台字段。

可以简写,使用自动属性:

public string Text { get; private set; } 
public string[] Values { get; private set; } 

随着公共领域,你将无法防止外部修改,并支持在同一时间内修改。

即使您想将字段公开为外部可写,我仍然会建议将该东西封装在属性中 - 您永远不知道是否需要在内部支持某些内容而不破坏外部契约(set/get中的自定义代码为您提供空间来做到这一点)。

更不用说大多数数据绑定框架没有看到字段,只有属性。

2

_text_values只能在它们定义的类中设置,但它们的值可以通过属性访问。

6

这是让值只读的,但我更倾向于把它写这样的:

public string Text { get; private set;} 
public string[] Values { get; private set; } 
+3

这只会使值仅读取到课程外。 – 2012-04-24 16:04:38

+0

@AdamHouldsworth我不反对。 – asawyer 2012-04-24 16:05:14

+2

只是澄清,因为像readonly周围扔单词可能会与'readonly'关键字混淆。 – 2012-04-24 16:06:01

2

在你的榜样其作为只读使得性能,但也有其他用途。

public string Text { get { return _text; } } 

如果你想在内部做了一些return_text操作,然后对proeperty返回它Text你可以像。

public string Text { get { return _text.ToUpper(); } } 

这是场Encapsulation

封装有时被称为第一支柱或面向对象编程的 原理。根据封装的原理 ,一个类或结构可以指定其成员的每个成员在类或结构外编码的可访问性。方法和 变量不打算从类别 或程序集外使用,可以隐藏以限制编码错误或恶意漏洞利用的可能性。

请看下面的例子:

// private field 
    private DateTime date; 


    // Public property exposes date field safely. 
    public DateTime Date 
    { 
     get 
     { 
      return date; 
     } 
     set 
     { 
      // Set some reasonable boundaries for likely birth dates. 
      if (value.Year > 1900 && value.Year <= DateTime.Today.Year) 
      { 
       date = value; 
      } 
      else 
       throw new ArgumentOutOfRangeException(); 
     } 

    } 

在这个例子中是通过财产Date公开曝光的私人领域date。现在,如果您想为日期设置边界,则可以看到属性的设置部分。

相关问题