Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建数组属性有意义吗?_C#_.net_Arrays_Properties - Fatal编程技术网

C# 创建数组属性有意义吗?

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

,当返回数组时,应使用方法而不是属性。他们进一步用一个具体的例子来解释为什么会出现这种情况

然而,我可以看到,在一些情况下,这种观点似乎有点极端

案例1 属性位于数据容器上,其余数据为属性。该属性不太可能被重构,从而为每个请求生成一个新数组

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;