C# 创建数组属性有意义吗?
,当返回数组时,应使用方法而不是属性。他们进一步用一个具体的例子来解释为什么会出现这种情况 然而,我可以看到,在一些情况下,这种观点似乎有点极端 案例1 属性位于数据容器上,其余数据为属性。该属性不太可能被重构,从而为每个请求生成一个新数组C# 创建数组属性有意义吗?,c#,.net,arrays,properties,C#,.net,Arrays,Properties,,当返回数组时,应使用方法而不是属性。他们进一步用一个具体的例子来解释为什么会出现这种情况 然而,我可以看到,在一些情况下,这种观点似乎有点极端 案例1 属性位于数据容器上,其余数据为属性。该属性不太可能被重构,从而为每个请求生成一个新数组 public class Foo { private readonly int[] bar; private int fooish; public Foo(int[] bar, int fooish) { t
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; }
}
}
案例2
类的公共字段正在重构为属性(至少提供封装的假象)
我的问题是——如果我知道这些方法是由一个字段支持的(而且可能永远都是),那么将它们转换为方法是否有任何现实的理由
Background:我正在将一个其他人将从Java使用的库移植到C#中,并尝试提出一些经验法则,以确定何时使用属性,何时不使用属性(因为在Java中,属性要么是方法,要么是字段)。不幸的是,在应用程序中广泛使用公共数组字段使决策变得困难-如果我确定它应该始终像数组变量一样工作,我真的需要创建方法GetBar()
和SetBar(int[]bar)
?或者在这种情况下,这些公共字段是否应该保留为.NET中的公共字段,而不是生成属性?(恶心)
首先,您提到的指导原则是用于设计类库的——如果您的代码将被其他开发人员使用,那么它们比在您维护的应用程序中使用时要重要得多 数组的问题是调用者可以修改其中的元素——我不认为仅仅因为这些准则就将数组公开为公共字段是有意义的(无意冒犯),因为它不能解决这个问题 在可能的情况下,您可以将它们公开为
IReadOnlyList
:
在这种情况下,
obj.Arr[2]=12代码>更直观。我从来没有公共数组属性。这似乎有点奇怪,但如果我想这样做,我会返回一个新的副本或只读列表=>bar.ToList().AsReadOnly()
,不幸的是,我不能总是假设应用程序的作者希望这些公共数组字段是只读的。其中一些文档特别指出它们不应为null(在这种情况下,这是创建setter的一个参数),这意味着它们可以由最终用户设置。当列表、集合和只读集合被视为良好的属性时,我总是发现无数组作为属性规则很奇怪。在MSDN文章中,没有克隆数组内容的属性是有意义的,但如果只是数组本身,我从未发现它有问题。我更新了我的问题,以反映这是一个正在移植的库。MSDN链接提到“使用操作返回数组的方法,因为要保留内部数组,必须返回数组的深度副本“因此,如果您希望库的用户修改数组,您不会给他们数组的副本,也不需要方法。因此,对于不应该更改的属性,我会说IReadOnlyList
,而对于不应该更改的属性,我会说T[]
。您可能希望在这些属性的文档注释中对此进行详细说明。谢谢。这很有帮助。我最后得到了第三个案例,因为应用程序中也有返回数组的方法。有些人显然是要写信给他们的。我真的无法对其余部分做出任何假设,所以我只留下了可写属性。我无法使用IReadOnlyList
,但还是要感谢您的建议。
public class Foo
{
public int[] Bar { get; set; }
public int Fooish { get; set; }
// Other members...
}
private int[] arr;
public IReadOnlyList<int> Arr { get { return arr; }}
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;