有更好的方法来封装数组吗?
本文关键字:数组 封装 更好 方法 | 更新日期: 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