getter和setter中的代码是否已失宠?

时间:2013-05-10 17:58:05

标签: c# asp.net-mvc

我看到了这一点,并在代码示例中用于声明属性。 我知道这是利用自动属性功能和匿名私有支持字段。

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

但是,我似乎再也没有看到这样的例子了。当我在大学2000年的.NET编程时,这样的东西一直被使用。最好的例子我可以想到拥有一组属性,如Server,Database,User,然后是另一个名为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
}

但是,现在,当我需要传递它的传统格式时,必须包装每个带子实例似乎很愚蠢。并且将这种方法与属性

一起使用
Model.LegacyFormat = service.getLegacyFormat(Model.strap);

嗯,这似乎很糟糕,因为LegacyFormat应该是基于我的表带不可变的。

3 个答案:

答案 0 :(得分:5)

我认为getter / setter中的代码不合适。只要它们是

,我会建议getter和setter中的代码
  1. 不引起副作用
  2. 与正在获取/设置的属性相关
  3. 我有时也会为某些类使用虚拟getter和setter来修改某些行为。

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

答案 1 :(得分:2)

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

我不了解其他人的经历,但我的大多数班级的属性都在制定者中得到验证。

我为此使用代码合约,因此设置者通常会有Contract.Requires(),而获取者通常会有Contract.Ensures()

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

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

答案 2 :(得分:0)

绝对不是!实际上,如果您使用的是WPF MVVM应用程序,则需要使用它。首选的处理方式可以说是选择性的&#39; SelecctionChanged&#39; event是在属性的get / set中处理它,而不是使用后面的代码。