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

sha*_*tch 6 c# accessor

可能重复:
C# - 何时使用属性而不是函数

我试图了解何时以及为何使用"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;     
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*ner 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
}
Run Code Online (Sandbox Code Playgroud)


Str*_*uan 5

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

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

public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)


Pet*_*erL 3

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

public static bool isInitialEditMapPageLoad {get;set;} // behaves just like example 1
Run Code Online (Sandbox Code Playgroud)

auto 属性的编写速度要快得多,并且在我看来比完整声明更具可读性(如果我看到带有支持字段的完整声明,我预计会发现一些复杂性)。

2:这说明了属性的原因之一:使用一些逻辑来返回一个值而不是总是直接返回一个值。有人可以随时设置此值,就像设置公共字段一样。他们也可以随时获取该值,但需要注意的是,这false意味着这不是初始加载,或者用户未获得授权——也就是说,在返回值之前会完成一些(简单的)逻辑。

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

4:导致我出现编译错误。假设这应该是一个方法声明,像在 Java 中那样手动定义一个 getter,那么它与示例 3 类似。我相信还有其他问题使得这不完全相同,比如如果你想把它变成这样不幸的是我在这方面的知识还不够。

=========

作为一般规则,用户属性会限制对类数据的访问。原则上,任何可以阻止其他代码接触的内容都应该保持这种方式。实际上,您将希望能够在类上设置值以更改它们的显示方式、修改表示的数据等等。使用属性来最大程度地控制此交互。

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

尽量避免将所有内容设置为自动道具的陷阱——这与将所有内容设置为公共领域没有什么不同。尽可能保持一切私密性。除非必要,否则不使用 getter,除非必要,否则不使用 setter,并且 setter 应该在接受输入之前执行任何必要的小逻辑来验证输入(如果适用)。也就是说,要避免另一个陷阱:将大量代码放入 getter/setter 中。如果需要多行代码,您可能应该创建一个方法而不是属性,因为它向使用您的代码的其他人提供了更大的提示,表明即将发生大事。