1

我在声明属性的代码示例中一遍又一遍地看到这一点。 我知道这是利用带有匿名私有支持字段的自动属性功能。

public sometype somevar {get;set;} <-- nothing happening in the getter or setter.

但是,我似乎再也没有看到这样的例子了。当我在 2000 年上大学时,一直在使用 .NET 编程这样的东西。我能想到的最好的例子有一组属性,如服务器、数据库、用户,然后是另一个名为 ConnectionString 的属性(这只是一个例子,我没有这样的代码)

    public string ServerName { get; set; }
    public string DatabaseName { get; set; }
    public string UserName { get; set; }



    public string ConnectionString 
    {

        get
        {
            return SomePrivateMethod(this.ServerName,this.DatabaseName,this.UserName);
        }

        set
        {
            this.ServerName = PrivateMethodThatParsesOutTheServerName(value);
            this.DatabaseName = PrivateMethodThatParsesOutTheServerName(value);
            this.UserName = PrivateMethodThatParsesOutTheServerName(value);

        }
    }

我正准备做这样的事情我有一个名为 strap 的属性,它是一个文本字段,用于存储诸如“0001020003”之类的值,但我有一个无法解释该带格式的遗留系统。所以我打算这样做

public string strap {get;set;}

public string legacyFormat {

get {
 return FormatForLegacySystem(this.strap);
}

//don't need a setter though

}

然后我想,也许这应该是一个扩展......

public static string AsLegacyFormat(this string value){
 //formatting code;
return fancynewformat;
}

最后一个想法。我在想这种东西真的属于我的服务层。

public getLegacyFormat(string strap)
{
//stuff here
}

但是,现在当我需要以旧格式传递它时,必须包装每个 strap 实例似乎很愚蠢。并且很想将这种方法与属性一起使用

Model.LegacyFormat = service.getLegacyFormat(Model.strap);

好吧,这看起来很糟糕,因为 LegacyFormat 基于我的表带应该是不可变的。

4

3 回答 3

5

我不认为 getter/setter 中的代码过时。我会推荐 getter 和 setter 中的代码,只要它们是

  1. 小的
  2. 不要引起副作用
  3. 与正在获取/设置的属性相关

我有时也会对某些类使用虚拟 getter 和 setter,以便能够修改某些类型的行为。

有时候,你必须做你必须做的事。

于 2013-05-10T18:01:35.973 回答
2

我很惊讶没有人提到属性 getter 和 setter 的一个极其重要的方面:您可以验证属性值。

我不知道其他人的经验,但我的大多数类的属性在设置器中都有验证。

我为此使用代码契约,因此 setter 通常有 aContract.Requires()而 getter 通常有Contract.Ensures().

我的很多属性都不能为空,所以我在 getter 中使用代码协定来表达这一事实,例如Contract.Ensures(Contract.Result<string> != null);

所以我认为在 getter 和 setter 中有代码非常重要!

于 2013-05-10T19:53:00.480 回答
0

绝对不!!!事实上,如果您使用的是 WPF MVVM 应用程序,您会想要使用它。处理“SelectionChanged”事件的首选方法是在属性的 get/set 中处理它,而不是使用后面的代码。

于 2013-05-10T18:39:57.297 回答