set {return;的目的是什么? }?

时间:2017-02-16 20:35:51

标签: c# accessor

我在各个地方看到过以下代码:

 namespace My.name.space
    {
        class myClass
        {       
            public CustomObject Name
            {
                get { return new CustomObject (this.Dog); }
                set { return; }
            }

        }
    }

set { return; }的目的是什么?

我不明白返回的目的是什么。

我认为你可以完全删除set accessor。

5 个答案:

答案 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中根本没有任何作用。那么为什么有人这样做呢? 有几个理由是有道理的:

  • 他们希望稍后向该setter引入功能,因此它现在可以作为占位符
  • setter是必需的,因为Property来自一个接口,但在具体实现中设置值是没有意义的
  • 某些API或基于反射的东西需要set方法,即使它没有被使用。

答案 4 :(得分:0)

这与只读属性相同,但可以设置属性(显然没有意义)。