有更好的方法来封装数组吗?

本文关键字:数组 封装 更好 方法 | 更新日期: 2023-09-27 18:17:25

我现在是怎么做的:

class Foo
{
    public int[] A { get { return (int[])a.Clone(); } }
    private int[] a;
}

我认为它不好,因为它创建了一个克隆并在我访问它时强制转换。我知道我可以通过引入一个额外的变量来解决这个问题,比如

var foo = new Foo();
// as soon as you have to access foo.A do this
int[] fooA = foo.A;
// use fooA instead of foo.A from now on

但看起来还是很糟糕。

我也不喜欢java封装

的方式
int get(int index) { return a[index]; }

因为我没有得到使用数组的好处

有更好的方法吗?

edit:我想要一个封装变量的数组。问题是

public int[] A { get; private set; }

不是封装变量的数组,因为我可以从类外部修改数组的元素。

edit:它也应该可以处理多维数组

有更好的方法来封装数组吗?

数组实现了IReadOnlyList<T>,它公开了你想要的所有相关信息(迭代器,索引器,计数等),而不暴露数组的任何可变功能。

class Foo
{
    public IReadOnlyList<int> A { get { return a; } }
    private int[] a;
}

或者,您可以使用迭代器/生成器来返回所请求的项:

class Foo
{
    public IEnumerable<int> A
    {
        get
        {
            foreach (int i in a)
                yield return i;
        }
    }
    private int[] a;
}

…然后正常迭代它们,或者使用LINQ将它们作为新数组或其他类型的集合:

int[] arr = foo.A.ToArray();

为什么不公开A作为IReadOnlyList的实现

class Foo
{
    public IReadOnlyList<int> A { get { return a; } }
    private int[] a;
}

这允许你返回数组作为一个集合,他们可以使用索引,但不能改变数组本身的内容。

听起来你需要一个索引器

...
public int this[int i]{
  get{return a[i];}
  set{a[i] = value;}
}
....
https://msdn.microsoft.com/en-us/library/6x16t2tx.aspx