我不知道为什么我开始考虑这个,但现在我似乎无法停止.
在C#中 - 可能还有很多其他语言,我记得Delphi曾经让你这么做 - 编写这种语法是合法的:
class WeirdClass
{
private void Hello(string name)
{
Console.WriteLine("Hello, {0}!", name);
}
public string Name
{
set { Hello(name); }
}
}
Run Code Online (Sandbox Code Playgroud)
换句话说,该属性有一个setter但没有getter,它是只写的.
我想我无法想到为什么这应该是非法的,但我从来没有真正在野外看过它,而且我似乎在野外看起来非常精彩/可怕的代码.这似乎是一种代码味道; 似乎编译器应该给我一个警告:
CS83417:属性"名称"似乎完全无用且愚蠢.糟糕的程序员!考虑用方法替换.
但也许我只是没有做足够长的时间,或者为了看到任何有效使用这种结构的例子而在一个太狭窄的领域工作.
是否存在只写属性的现实示例,这些示例要么不能被直接方法调用替换,要么变得不那么直观?
我最近遇到了一个界面,它只定义了一个像这样的setter:
public interface IAggregationView
{
DataTable SetSiteData { set; }
}
Run Code Online (Sandbox Code Playgroud)
我质疑这一点,并且相信这是微软为WebPart设计(针对SharePoint)所倡导的做法之一.实际上,这个例子是从他们的例子中直接复制的.
我认为这是一个糟糕的模式,我不明白为什么有人应该能够设置一个值,然后再也无法再读它了,我相信一个二传手应该总是伴随着一个吸气剂(但不一定是其他方式).
我想知道是否有人可以解释只有一个二传手的好处,为什么微软可能会在这种情况下建议它,以及它是否真的是一个好的模式?
我的经理问我,使用带有二传手的房产是否是一个好习惯,但没有吸气剂.
public class PropertyWrapper
{
private MyClass _field;
public MyClass Property
{
set { _field = value; }
}
public string FirstProperty
{
get { return _field.FirstProperty; }
}
public string SecondProperty
{
get { return _field.SecondProperty; }
}
}
Run Code Online (Sandbox Code Playgroud)
他将使用其他属性来公开由此setter设置的私有字段的属性.
我的建议是只使用一个私有字段并在构造函数中设置它,在这种情况下工作正常.如果我需要首先构建一个构造对象(甚至可能使用多态),我仍然会更喜欢一个Load
方法,而不是一个getter-less属性.
但我很感兴趣.我们都非常关注最佳实践,并尝试确保我们的代码是标准化的.有没有人有关于无吸气剂属性的官方文章?或者更好 - 在.NET Framework本身中这种用法的一个例子?
您何时想要创建一个具有只写属性但您无法读取的属性的对象?显然反向(只读)在许多情况下都很有用,但是有人可以给我一个只写属性的例子吗?什么时候有用呢?