如何公开内部System.Array

时间:2009-11-21 20:50:30

标签: c#

我有一个类,它是两个固定长度数组的容器以及其他一些成员。我想公开数组的元素以便在类外部进行赋值。

示例是:

    using System.Collections.ObjectModel;

    class ArrayContainer<T, U>
    {
       private T[] x;
       private U[] y;

       // Some other members and constructor

       public Collection<T> X
       {
            get { return new Collection<T>(this.x); }
       }

       public Collection<U> Y
       {
           get { return new Collection<U>(this.y); }
       }
    }

如果我尝试执行instance.X [i] = value,我会收到一个异常,说该集合是只读的。所以我有三个问题:

  1. 为什么我不能完成上述任务?
  2. 这是正确的公开内部成员吗?
  3. 每次创建数组时,是否存在制作“新”集合的性能问题?

4 个答案:

答案 0 :(得分:3)

回答3: 你的表现肯定是个问题;你每次访问它时都会创建一个新实例。每当一个人写一个for ...循环时,你就会得到每个迭代的新实例。

为什么不公开展示您的收藏品?我可以通过简单地使用List来完成同样的事情:

class Data<T,U> {
    public List<T> X = new List<T>();
    public List<U> Y = new List<U>();
}

编写代码非常简单:

        Data<int, string> theData = new Data<int, string>();
        // add
        theData.X.Add(37);
        theData.Y.Add("foo");
        // access
        theData.X[0] = 42;
        theData.Y[0] = "bar";
        // as an array
        int[] x = theData.X.ToArray();

如果性能真的让你感到沮丧,只需使用数组而不是List&lt; T&gt;。

答案 1 :(得分:3)

  1. 不确定,但既然您要返回一个新的集合,那么您对它做了什么并不重要。垃圾收集器删除集合后,更改将丢失。对集合所做的更改不会影响原始数组。

  2. 不,正确的方法是直接暴露数组,或者,如果您担心客户端不会玩得很好,请通过getter和setter公开它们。由于C#只允许每个带有参数的类有1个属性,因此你必须使用函数:

    instance.SetX(int index, T value);
    T val = instance.GetX(int index);
    
  3. 是的,制作副本总是需要额外的时间和内存。如果这是性能关键代码,则此解决方案是不可接受的,否则,它可能没问题。

答案 2 :(得分:0)

如果您熟悉接口的概念,那么您可以选择或编写接口来解释外部应该是什么。然后为您的类声明添加接口,编译器将帮助您正确完成其余的事情。

答案 3 :(得分:0)

我不知道这是为了什么,但为什么不使用索引器或getter / setter方法呢?我认为这是典型的做法。