C# getter和setter中的代码是否已不再受欢迎?
我在声明属性的代码示例中反复看到了这一点我知道这是在利用自动属性功能和匿名私人支持字段。C# getter和setter中的代码是否已不再受欢迎?,c#,asp.net-mvc,C#,Asp.net Mvc,我在声明属性的代码示例中反复看到了这一点我知道这是在利用自动属性功能和匿名私人支持字段。 public sometype somevar {get;set;} <-- nothing happening in the getter or setter. 我正准备这样做,我有一个名为strap的属性,它是一个文本字段,存储“0001020003”之类的值,但我有一个无法解释strap格式的遗留系统。所以我打算这么做 public string strap {get;set;} publi
public sometype somevar {get;set;} <-- nothing happening in the getter or setter.
我正准备这样做,我有一个名为strap的属性,它是一个文本字段,存储“0001020003”之类的值,但我有一个无法解释strap格式的遗留系统。所以我打算这么做
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时,必须包装strap的每个实例似乎很愚蠢。和轮胎使用这种方法与一个属性
Model.LegacyFormat = service.getLegacyFormat(Model.strap);
好吧,这看起来很糟糕,因为根据我的strap,LegacyFormat应该是不可变的。我不认为getter/setter中的代码过时了。我建议使用getter和setter中的代码,只要它们是
有时候,你必须做你必须做的事。我不认为getter/setter中的代码过时了。我建议使用getter和setter中的代码,只要它们是
有时候,你必须做你必须做的事。绝对不是!!!事实上,如果您使用的是WPF MVVM应用程序,那么您将希望使用此功能。处理“SelecctionChanged”事件的首选方法是在属性的get/set中处理它,而不是使用代码隐藏。绝对不是!!!事实上,如果您使用的是WPF MVVM应用程序,那么您将希望使用此功能。处理“SelecctionChanged”事件的首选方法是在属性的get/set中处理它,而不是在后面使用代码。我很惊讶没有人提到属性getter和setter的一个极其重要的方面:可以验证属性值 我不知道其他人的经验,但我的类的大多数属性都在setter中进行了验证 为此,我使用代码契约,因此setter通常有一个
契约。Requires()
,getter通常有一个契约。Contract()
我的很多属性都不能为null,因此我在getter中使用了一个代码契约来表示这一事实,例如Contract.surveures(Contract.Result!=null)代码>
所以我认为在getter和setter中使用代码是非常重要的 我很惊讶没有人提到属性getter和setter的一个极其重要的方面:您可以验证属性值
我不知道其他人的经验,但我的类的大多数属性都在setter中进行了验证
为此,我使用代码契约,因此setter通常有一个契约。Requires()
,getter通常有一个契约。Contract()
我的很多属性都不能为null,因此我在getter中使用了一个代码契约来表示这一事实,例如Contract.surveures(Contract.Result!=null)代码>
所以我认为在getter和setter中使用代码是非常重要的 不,他们没有,只是你经常不需要他们。不,它没有失宠,至少不是普遍的:几天前我在生产中编写了类似的代码。不过,这并没有减少您的问题的主观性:它似乎是在征求意见,而不是事实。也许我应该重新回答我的问题,扩展方法是否替换getter和setter中的代码?可能是离题了,但一般来说,我避免在基本类型(如string
)上创建扩展方法,因为所有字符串现在都有一个AsLegacyFormat
成员,即使该字符串与连接字符串无关,也可以调用该成员。除非这样的扩展方法只被少数类使用,并且这些类主要(或理想情况下,仅)将字符串视为连接字符串,否则我发现它只会带来痛苦。但是,我真的更喜欢使用非常干净的intellisense/autocomplete条目,所以可能我在这方面有点疯了:)我倾向于使用只读字段来支持我的属性,因为我的许多对象是不可变的。此外,我还大量使用代码契约(即Contract.Requires()
和Contract.assures()
)。显然,裸体自动属性设置程序无法验证其价值。不,他们没有,只是你通常不需要它们。不,它并没有失宠,至少没有普及:几天前我在生产中编写了类似的代码。不过,这并没有减少您的问题的主观性:它似乎是在征求意见,而不是事实。也许我应该重新回答我的问题,扩展方法是否替换getter和setter中的代码?可能是离题了,但一般来说,我避免在基本类型(如string
)上创建扩展方法,因为所有字符串现在都有一个AsLegacyFormat
成员,即使该字符串与连接字符串无关,也可以调用该成员。除非这样的扩展方法只被少数类使用,并且这些类主要(或理想情况下,仅)将字符串视为连接字符串,否则我发现它只会带来痛苦。但是,我真的更喜欢使用非常干净的intellisense/autocomplete条目,所以可能我在这方面有点疯了:)我倾向于使用只读字段来支持我的属性,因为我的许多对象是不可变的。此外,我还大量使用代码契约(即Contract.Requires()<
Model.LegacyFormat = service.getLegacyFormat(Model.strap);