何时以及为何使用C#访问器方法

时间:2010-08-09 21:26:34

标签: c# accessor

  

可能重复:
  C# - When to use properties instead of functions

我试图了解何时以及为何使用“getters”和“setters”

有人请提供一些指导。

以下结构之间有什么区别 - 请仅查看访问方法。

//EXAMPLE 1: simple accessor method 
private static bool _isInitialEditMapPageLoad;
public static bool isInitialEditMapPageLoad
{
    get {return _isInitialEditMapPageLoad;}
    set {_isInitialEditMapPageLoad = value;}
}

//EXAMPLE 2: accessor method with a conditional test
private static bool _isInitialEditMapPageLoad;
public static bool isInitialEditMapPageLoad
{
    get 
    {
        if (currentSession[isAuthorizedUseder] == null)
            return false;
        else
            return _isInitialEditMapPageLoad;    
    }
    set {isInitialEditMapPageLoad = value;} 
}


//EXAMPLE 3: just a get accessor method - is this the same as EXAMPLE 4?
private static bool _isInitialEditMapPageLoad = false;
public static bool isInitialEditMapPageLoad
{
    get {return _isInitialEditMapPageLoad;}
}


//EXAMPLE 4: simple method
private static bool _isInitialEditMapPageLoad = false; 
public static bool isInitialEditMapPageLoad
{
  return _isInitialEditMapPageLoad;     
}

4 个答案:

答案 0 :(得分:8)

你的getter / setter应该是你班级的公共接口。

根据经验,您的所有成员都应该是私密的,除了您希望人们可以访问您班级之外的内容,并且您从不希望您的私人变量可以在您的班级之外直接访问

这是一个简单的例子。假设你有一个类,你需要一个age变量。在这种情况下,您可以在setter中执行验证,而您的外部类不需要知道该值已经过验证。

class Person {
  int age = 0;

  public int Age {
    get { return age; }
    set { 
      //do validation
      if (valid) {
        age = value;
      }
      //Error conditions if you want them.
    }
  } 

  //More getters/setters
}

答案 1 :(得分:5)

Getters / Setters背后的原因是当用户以无效的方式改变字段时保护类不被破坏,并且它们允许您更改类的实现,同时保持公开的属性不变。

除非您需要某种验证或延迟加载属性,否则通常只需使用自动属性。

public string Name { get; set; }

答案 2 :(得分:3)

1:这是一个简单的属性,可以像公共字段一样使用。如果您有理由向其他用户(即其他类)公开getset操作,并且您不需要任何花哨的东西,就是这样。这也可以用“自动属性”编写,

public static bool isInitialEditMapPageLoad {get;set;} // behaves just like example 1

自动道具写得快得多,而且在我看来比完整声明更具可读性(如果我看到带有支持字段的完整声明,我希望找到一些复杂性)。

2:这显示了属性的原因之一:使用某些逻辑返回值而不是直接返回值。有人可以随时将公共字段设置为该值。他们可以随时获得价值,并注意false意味着这不是初始加载或用户未被授权 - 也就是说,某些(简单)逻辑在之前完成返回一个值。

3:此行为仅作为公共字段进行读取 - 有人可以检索该值,但不能设置它。这本质上是一个只读取外部代码的值(不要与readonly关键字混淆)

4:导致编译错误。假设这应该是一个方法声明,手动定义一个类似于Java的getter,那么它类似于例3.我相信还有其他问题使得这个不完全相同,比如你想要转这个到了一个依赖属性等等。不幸的是,我在那方面的知识很短。

==========

作为一般规则,用户属性限制对类数据的访问。作为一个原则,任何你不能允许其他代码触摸的东西都应该保持这种状态。实际上,您需要能够在类上设置值以更改它们的显示方式,修改所表示的数据等等。使用属性来保持对此交互的最大控制。

如果其他类需要在您的类中查看某些内容,则需要公开getter,而不是setter。除非使用Java方法编写自定义getter方法,否则这对于字段是不可能的。它们还允许您在返回或设置数据之前执行计算或验证。例如,如果你有一些整数值应该在某个范围内(一个范围可以根据你的对象的状态改变,甚至),你可以在setter检查以确保满足这个条件之前实际上更新你的价值。

尽量避免将所有东西设置为autoprop的陷阱 - 这与将所有内容都设为公共字段没有什么不同。保持一切尽可能私密。除非必要,否则没有吸气剂,除非必要,否则设定者应该在接受之前执行验证输入所需的任何小逻辑,如果合适的话。也就是说,避免另一个陷阱:在getter / setter中放入大量代码。如果它需要超过一些行,你应该创建一个方法而不是一个属性,只是因为它为使用你的代码的其他人提供了一个更大的提示,即会发生一些重大的事情。

答案 3 :(得分:2)

与其他提到的一样,当您希望对象成员可用于其他对象时,请使用getter / setter。

此外,使用autoproperties可以提高yoru代码的可读性(如果您使用的是.NET 2.0或更高版本)。你拥有的例子就是这样的:

// example 1
public static bool IsInitialEditMapPageLoad { get; set; }

// example 3/4 - note that false is the default for bools
public static bool IsInitialEditMapPageLoad { get; private set; }

由于存在验证逻辑,示例3可能保持不变。