C#控制对数组属性元素的访问

时间:2011-10-12 15:27:14

标签: c# .net c#-4.0

我想访问带有Property的内部数组,但是控制对数组元素的访问。

我写了一个简单的例子,可以比我更好地解释我的问题。

在示例中,我提供了“Fail”类和“Controlled”类。第二个按照我的意愿运行,但方法有点不同,只有一个数组才有用。

我的问题是下一个: 如果我必须有两个不同的数组,因此有两个不同的属性呢。

怎么做?

感谢。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("The Fail Class:");

            MyFailClass MyFailTestClass = new MyFailClass(5);
            MyFailTestClass.MyList[2] = 11;
            if (MyFailTestClass.Modified) {
                Console.WriteLine("Right");
            } else {
                Console.WriteLine("Error");
            }



            Console.WriteLine("The Controlled Class:");

            MyControlledClass MyControlledTestClass = new MyControlledClass(5);
            MyControlledTestClass[2] = 11;
            if (MyControlledTestClass.Modified) {
                Console.WriteLine("Right");
            } else {
                Console.WriteLine("Error");
            }

            Console.ReadKey();
        }
    }

    public class MyFailClass
    {
        // Property 
        public byte[] MyList
        {
            get
            {
                return myList;
            }
            set  // <--------- Never enters here if I set a concrete array element
            {
                Modified = !myList.Equals(value);
                myList = value;
            }
        }
        public bool Modified { get; set; }

        // Constructor
        public MyFailClass(int elements)
        {
            myList = new byte[elements];
        }

        private byte[] myList;
    }

    public class MyControlledClass
    {
        // Property 
        public byte this[int index]
        {
            get
            {
                return myList[index];
            }
            set
            {
                Modified = !myList[index].Equals(value);
                myList[index] = value;
            }
        }
        public bool Modified { get; set; }

        // Constructor
        public MyControlledClass(int elements)
        {
            myList = new byte[elements];
        }

        private byte[] myList;
    }
}

2 个答案:

答案 0 :(得分:2)

您可以考虑用ObservableCollection<T>替换您的数组属性。

您可能会将该属性公开为IList<T>,因为它的可观察性是一个内部实现细节。

public class MyClass
{
    public IList<byte> MyList
    {
        get { return _myList; }
    }
    private IList<byte> _myList = new ObservableCollection<byte>();

    ...
}

MyClass的实施应处理_myList的{​​{1}}和PropertyChanged事件。

请注意,通常不需要setter用于集合属性 - 如果调用者想要替换他可以调用的列表:

CollectionChanged

然后添加新元素。

答案 1 :(得分:1)

如果你想要两个数组,那么你可能以后想要三个或四个(我不确定,但这看起来似乎就是这样)。

在这种情况下,我会考虑创建一个“MyControlledClass”聚合的类

public class IndexedClass
{
    // Property 
    public byte this[int index]
    {
        get
        {
            return myList[index];
        }
        set
        {
            Modified = !myList[index].Equals(value);
            myList[index] = value;
        }
    }

}

public class IndexedClassGroup
{
    // Property 
    public IndexedClass this[int index]
    {
        get
        {
            return myList[index];
        }
        set
        {
            Modified = !myList[index].Equals(value);
            myList[index] = value;
        }
    }

}

然后,你可以像二维数组那样访问这些东西。

就个人而言,理论上我对将数组暴露为可获取/可设置的概念有点怀疑,因此我不太了解这样做的细节。类是使用数组还是列表,或者看起来像私有实现细节而不是公共属性。如果您要暴露某些内容,请展示ICollection&lt;&gt;或IEnumerable&lt;&gt;并在内部将其解析为数组。无论如何,我的两分钱。