According to MSDN,当返回数组时,应该使用方法而不是属性。他们进一步推论为什么会出现这种情况的具体例子。
然而,有几种情况我可以看到这看起来有点极端。
该属性位于数据容器中,其余数据属性。根据请求,不可能重构属性以生成新数组。
public class Foo
{
private readonly int[] bar;
private int fooish;
public Foo(int[] bar, int fooish)
{
this.bar = bar;
this.fooish = fooish;
}
public int[] Bar
{
get { return bar; }
}
public int Fooish
{
get { return fooish; }
}
}
一个类的公共字段被重构为属性(至少提供封装的假象)。
public class Foo
{
public int[] Bar { get; set; }
public int Fooish { get; set; }
// Other members...
}
我的问题是 - 如果我知道它们是由一个字段支持(并且可能永远都是),那么将它们变成方法是否有任何现实的论据?
背景:我正在移植一个其他人将从Java中使用到C#中的库,并尝试在使用属性时提出某种经验法则,何时不使用(因为在Java中它们是方法或领域)。不幸的是,在应用程序中广泛使用公共数组字段使得决策变得困难 - 如果我确定它应该总是像数组变量一样,我真的需要创建方法
GetBar()
和SetBar(int[] bar)
吗?或者在这种情况下,这些公共字段是否应该作为.NET中的公共字段而不是制作属性? (呸)
答案 0 :(得分:4)
首先,您提到的指南是用于设计类库 - 如果您的代码将由其他开发人员使用,则它们比您在维护的应用程序中使用时更重要。
数组的问题在于调用者可以修改其中的元素 - 我不认为将数组暴露为公共字段仅仅是因为这些指南很有意义(没有冒犯),因为它没有解决这个问题。 / p>
如果可能,您可以将其公开为IReadOnlyList<T>
:
private int[] arr;
public IReadOnlyList<int> Arr { get { return arr; }}
如果应用程序 要求调用者可以更改数组的内容,那么肯定避免使用方法,因为这会使其更加模糊:< / p>
class MyClass
{
private int[] arr;
// can't clone the array, because your application requires the caller to change elements
public int[] GetArr() { return arr; }
}
...
// very unclear for the caller that he's actually modifying the array on the obj instance
int[] values = obj.GetArr();
values[2] = 12;
在这种情况下,obj.Arr[2] = 12;
更直观。