虽然我当然熟悉自动属性,但我在工作中遇到了这个问题,它似乎是一个完全不同的东西:
public SomeType SomeProp
{
get
{
return someField;
}
set
{
}
}
我很惊讶它甚至编译通过了,我想这一定是一个bug: 这个属性似乎允许设置,但实际上根本不起作用。
这种构造有用吗?就像电梯里那些没有作用但能让用户感到好的“关门”按钮一样吗?
虽然我当然熟悉自动属性,但我在工作中遇到了这个问题,它似乎是一个完全不同的东西:
public SomeType SomeProp
{
get
{
return someField;
}
set
{
}
}
当需要通过web服务或使用XML或二进制序列化程序来序列化结果时,通常会出现这种情况。
这种做法是懒惰和粗心的,但它经常发生。这会使对象“看起来”具有可设置的属性。如果这样做是为了实现接口并允许编译,则执行此操作的开发人员应该受到惩罚,因为他刚刚破坏了接口。如果有有效的理由不能实现它,则开发人员需要将其退回给架构师进行审查。在实现接口时不应该只留下空的存根方法。如果目前没有定义实施技术,则至少抛出一个new NotImplementedException,以便单元测试能够捕获它。
就序列化而言:只读属性不包含在常规序列化中,这可能导致Web服务客户端无法使用属性。(参考:只读属性无法由XML Web服务公开。)这是我们所有人都应该转向WCF和DataContract的原因之一。如果您通过WCF将此类接受为方法的输入类型,那么再次召回钝物。
这个本身似乎没有什么用处,但考虑一个接口需要类具有SomeProp
属性,而你需要在你的类中实现这个接口,但是SomeProp
只能读取而不能写入。
public interface IQuestion
{
public int AnwserToLife { get; set; } //leave out 'set' for read-only
}
public class HitchHiker : IQuestion
{
public int AnwserToLife
{
get
{
return 42;
}
set
{
//never changes
}
}
}
throw new NotImplementedException("explanation");
。 - Ade Stringer有一些用例需要这种必要的解决方法,其中有些我已经在实际中遇到过。
例如:该属性是旧时代的遗留物,不再有用,但应用程序的某个其他部分从未更新(源代码丢失?第三方?),并坚持设置该属性。我曾在旧代码中看到过,需要插件在更新某些数据集后设置isDirty属性,当实现更改为观察数据集本身时,isDirty属性变得无用,但无法放弃,因为其他代码仍然希望设置它。
C#
是这里最受欢迎的标签... =) - gdoron