2

我可以在 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;
   }
}
4

5 回答 5

5

The only bound is the semantics. You may use whatever operations you find suitable, as long as the general property semantics is preserved. Among others, I would check that

  • access is reasonably fast
  • if setter finished w/o error, getter should return the value semantically compatible with the set value
  • if possible, avoid raising exceptions inside
  • consecutive gets return semantically equivalent values if internal state didn't change

If you keep the semantics, IMHO any operation is allowed.

于 2012-08-31T11:36:15.957 回答
2

实际上,您可以在属性 getter 和 setter 中添加大多数您想要的东西。实际上,它们只不过是避免这样写的简单方法:

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

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

至于什么是正确的,很大程度上取决于上下文,许多人有不同的意见。我尝试遵循的一般准则是:

  1. 不要做任何需要太多时间的事情。预计属性会很快。
  2. 不要放任何会抛出异常的东西,Exception除非它被记录在案并且有意义。我将使用ArgumentExceptionorNullReferenceException在我必须考虑会破坏代码的属性中的值的情况下,但是如果它需要异常或者我调用可能导致与属性本身无关的异常的方法,那么方法更好.
  3. 使用常识。如果你可以对自己说,我想getset一个值,那么一个属性是有意义的。如果我想do something,那么你可能最好用一种方法。
  4. 这可以追溯到 #1,但是如果没有要获取或设置的支持字段(自动属性无论如何都会在后台执行此操作),那么您必须考虑一个属性是否真的是正确的方法。

但正如我所说,这些是我的指导方针,我会不时打破它们,但当我这样做时,我倾向于确保有文件证明该物业将做一些无例外或长期运行的事情。

myColl如果或是,p您的示例可能会引发异常null,因此除非您 100% 确定两者都不可能为空,否则我不会将此作为属性。

于 2012-08-31T11:54:50.270 回答
1

I think there are two rules:

  1. Common sense - if you think it shouldn't be like that. Then it probably shouldn't be like that.
  2. Principle of least surprise
于 2012-08-31T11:37:33.907 回答
1

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

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

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

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

一个。myColl一片空白,

湾。myValue一片空白,

C。FirstOrDefault返回空值,

d。AnotherCollection一片空白。

于 2012-08-31T11:42:10.397 回答
0

在我看来没问题

有些人会说它很丑,有些人会说它是有效的或者只是好的,也许很好......

get/set 深入 2 种方法,例如 get() 和 set()

什么是“一般”编码指南?

于 2012-08-31T11:32:08.470 回答