我可以在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;
}
}
答案 0 :(得分:5)
唯一的限制是语义。只要保留了一般属性语义,您就可以使用您认为合适的任何操作。其中,我会检查
如果你保留语义,恕我直言任何操作都是允许的。
答案 1 :(得分:2)
实际上,您可以在propeties getter和setter中添加您想要的任何内容。实际上,它们不仅仅是避免写这篇文章的简单方法:
private String _value;
public String GetValue
{
return _value;
}
public void SetValue(string value)
{
_value = value;
}
因此,如果您可以在方法中执行此操作,则可以在属性中执行此操作(并不一定意味着您应该这样做)
至于什么是正确的,很多都取决于背景,很多人都有不同的意见。我试图遵循自己的一般准则是:
Exception
的东西。我将使用ArgumentException
或NullReferenceException
我必须考虑属性中将破坏代码的值,否则如果它需要异常或我调用可能导致异常的方法与财产本身无关,那么方法更好。get
或set
一个值,那么一个属性是有道理的。如果我想要do something
,那么你可能会更好地使用方法。但正如我所说,这些是我的指导方针而且我会不时地打破它们,但是当我这样做时,我倾向于确保记录该属性将会执行某些未触及或长时间运行的事情。
如果myColl
或p
为null
,您的示例可能会抛出异常,所以除非您100%肯定都不可能为null,否则我不会将其作为属性
答案 2 :(得分:1)
我认为有两条规则:
答案 3 :(得分:1)
您提供的代码有“坏代码”气味。
您使用过FirstOrDefault函数;可能有空值。
myName变量似乎是一个类级变量。然后在一个属性中,你似乎使用了多个类级变量(myColl和myName);这对我来说似乎有点奇怪。
3.您似乎正在返回一个深层对象AnotherCollection
,它是列表中第一项的属性。这可能会导致问题;如果;
一个。 myColl
为空,
湾myValue
为空,
℃。 FirstOrDefault
返回null,
d。 AnotherCollection
为空。
答案 4 :(得分:0)
在我看来还不错,
有些人会说它很难看,有些人会说它有效或者只是确定,也许 很好......获取/设置深度2方法,如get()和set()
什么是&#39;一般&#39;编码指南?