我看到了这一点,并在代码示例中用于声明属性。 我知道这是利用自动属性功能和匿名私有支持字段。
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应该是基于我的表带不可变的。
答案 0 :(得分:5)
我认为getter / setter中的代码不合适。只要它们是
,我会建议getter和setter中的代码我有时也会为某些类使用虚拟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中处理它,而不是使用后面的代码。