getter和setter中的其他操作

时间:2012-08-31 11:27:22

标签: c#

我可以在C#公共财产的getter和setter中自由添加其他操作吗?到什么程度?
例如,下面的代码是否正常(返回并编辑嵌套到另一个集合中的集合)?

public ObservableCollection<MyEntity> MyCollection
{
   get
   {
     return myColl.Where(p => p.Name == myName).FirstOrDefault().AnotherCollection;
   }
   private set
   {
     myColl.Where(p => p.Name == myName).FirstOrDefault().AnotherCollection = value;
   }
}

5 个答案:

答案 0 :(得分:5)

唯一的限制是语义。只要保留了一般属性语义,您就可以使用您认为合适的任何操作。其中,我会检查

  • 访问速度相当快
  • 如果setter完成w / o错误,getter应该返回与设置值在语义上兼容的值
  • 如果可能,请避免在
  • 中引发异常 如果内部状态没有改变,
  • 连续获取返回语义上等效的值

如果你保留语义,恕我直言任何操作都是允许的。

答案 1 :(得分:2)

实际上,您可以在propeties getter和setter中添加您想要的任何内容。实际上,它们不仅仅是避免写这篇文章的简单方法:

private String _value;
public String GetValue
{
    return _value;
}
public void SetValue(string value)
{
    _value = value;
}

因此,如果您可以在方法中执行此操作,则可以在属性中执行此操作(并不一定意味着您应该这样做)

至于什么是正确的,很多都取决于背景,很多人都有不同的意见。我试图遵循自己的一般准则是:

  1. 不要做任何花费太多时间的事情。预计属性会很快。
  2. 除非记录在案,否则不要放任何会引发Exception的东西。我将使用ArgumentExceptionNullReferenceException我必须考虑属性中将破坏代码的值,否则如果它需要异常或我调用可能导致异常的方法与财产本身无关,那么方法更好。
  3. 使用常识。如果你可以对自己说,我想getset一个值,那么一个属性是有道理的。如果我想要do something,那么你可能会更好地使用方法。
  4. 这可以追溯到#1,但是如果没有要获取或设置的后备字段(自动属性无论如何在后台执行此操作),那么你必须考虑一个属性是否真的是正确的方法。
  5. 但正如我所说,这些是我的指导方针而且我会不时地打破它们,但是当我这样做时,我倾向于确保记录该属性将会执行某些未触及或长时间运行的事情。

    如果myCollpnull,您的示例可能会抛出异常,所以除非您100%肯定都不可能为null,否则我不会将其作为属性

答案 2 :(得分:1)

我认为有两条规则:

  1. 常识 - 如果你认为不应该那样。然后它可能不应该那样。
  2. 最少意外的原则

答案 3 :(得分:1)

您提供的代码有“坏代码”气味。

  1. 您使用过FirstOrDefault函数;可能有空值。

  2. myName变量似乎是一个类级变量。然后在一个属性中,你似乎使用了多个类级变量(myColl和myName);这对我来说似乎有点奇怪。

    3.您似乎正在返回一个深层对象AnotherCollection,它是列表中第一项的属性。这可能会导致问题;如果;

  3. 一个。 myColl为空,

    myValue为空,

    ℃。 FirstOrDefault返回null,

    d。 AnotherCollection为空。

答案 4 :(得分:0)

在我看来还不错,

  有些人会说它很难看,有些人会说它有效或者只是确定,也许   很好......

     

获取/设置深度2方法,如get()和set()

什么是&#39;一般&#39;编码指南?