6

Possible Duplicate:
C# - When to use properties instead of functions

I am trying to understand when and why to use "getters" and "setters"

would someone please provide some guidance.

What is the difference between the following constructs - please look in terms of accessor methods only.

//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

4 回答 4

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
}
于 2010-08-09T21:34:17.390 回答
5

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

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

public string Name { get; set; }
于 2010-08-09T21:40:36.997 回答
3

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

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

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

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

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

4:导致我的编译错误。假设这应该是一个方法声明,像在 Java 中那样手动定义一个 getter,那么它类似于示例 3。我相信还有其他问题使得这不太一样,比如如果你想把这个进入依赖属性等。不幸的是,我在该领域的知识不足。

==========

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

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

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

于 2010-08-09T21:46:14.240 回答
2

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

此外,使用自动属性可以提高 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 可能会保持不变。

于 2010-08-09T21:51:47.503 回答