我在各个地方看到过以下代码:
namespace My.name.space
{
class myClass
{
public CustomObject Name
{
get { return new CustomObject (this.Dog); }
set { return; }
}
}
}
set { return; }
的目的是什么?
我不明白返回的目的是什么。
我认为你可以完全删除set accessor。
答案 0 :(得分:7)
无。有些人不太清楚,只要不包括set
public Derp MuhDerp { get { return _derp; } }
CSharpie在评论中提出的有趣观点......
如果 拥有set
,因为它是在界面中定义的,您可以添加set
但省略返回:
public Derp MuhDerp { get { return _derp; } set { } }
当然,如果界面定义了一个setter,你应该确保它按预期工作:)
答案 1 :(得分:1)
这仅仅意味着“不做任何事情,我不想做任务”。这就像二传手中的无操作。它也相当于一个空的setter,即set { }
。真的,这是一个偏好的问题;我想有些人不喜欢空代码体。
当然,你通常不会这样做(正如威尔指出的那样)。您只需使用只读属性,但存在一个关键区别:使用只读属性时,尝试设置它将在编译时失败 ;如果你正在使用你所询问的那个,那么它根本不会失败,它只会在运行时“无所事事”。
您使用哪一个很大程度上取决于您希望应用程序执行的操作。我会指出使用这种方法(而不是只读属性)会导致代码变得脆弱,因为程序员可能不会意识到他们故意尝试分配值被忽略了。
答案 2 :(得分:1)
这基本上是为了给出一个假设,即有一个二传手,有,但什么都不做。但可能是为了保持一些界面满意或父类:
public CustomObject Name
{
get { return new CustomObject( this.Dog ); }
set { return; } // does absolutely nothing
}
这是一个班级:
public abstract class A {
public abstract void DoWork();
public abstract string SomeProperty { get; set; }
}
这给出了它正在实现抽象接口的错觉,但它实际上并没有实现所有内容:
public class B : A {
public override string SomeProperty
{
get
{
return "whatever";
}
set
{
return; // keep interface happy
}
}
public override void DoWork() {
// I am not doing nothing but compiler is happy
}
}
该代码也会中断Liskov Substitution Principle。
答案 3 :(得分:1)
C#中的属性只是特殊情况下的语法糖果。
像
这样的“常规”属性public int Foo {get;set;}
实际上是(类似的东西)
int _foo;
public int get_Foo() { return _foo;}
public void set_Foo(int value) { _foo = value;}
但是你可以自己设定,在setter和getter中会发生什么
public int Foo { get { return 47; } set { Console.WriteLine(value); } }
所以以你的例子为例,编译器会把它变成
public CustomObject get_Name() { return new CustomObject (this.Dog); }
public void set_Name(CustomObject value) { return; }
在set-Method中根本没有任何作用。那么为什么有人这样做呢? 有几个理由是有道理的:
答案 4 :(得分:0)
这与只读属性相同,但可以设置属性(显然没有意义)。