C#使用索引器

时间:2012-12-15 12:22:09

标签: c#

我有类似这样的类(这是代码的子集)

public struct overlay
{
    [FieldOffset(0)]
    public Byte[] b;
    [FieldOffset(0)]
    public Int32[] i;
}



 class MyClass
    {
    private overlay data;    \\Initialised using data.b=new Byte[4096]

    public Int32 site0 { set { data.i[0] = value; } get { return data.i[0]; } }
    public Int32 site1 { set { data.i[1] = value; } get { return data.i[1]; } }
    public String s
    {
        get { return System.Text.Encoding.ASCII.GetString(data.b, 8, 16).TrimEnd(' '); }
        set { System.Text.Encoding.ASCII.GetBytes(value.PadRight(16)).CopyTo(data.b, 8); }
    }
    public Int32 site2 { set { data.i[5] = value; } get { return data.i[5]; } }

    }

我目前正在访问这样的网站变量...

MyClass m=new MyClass();
m.site0=1;
m.site1=1;
m.site2=1;

我想像这样访问它们。

MyClass m=new MyClass();
for (Int32 i=0; i<m.sites.Count; ++i)
    m.sites[i]=1;

有人可以建议我怎么做吗?

2 个答案:

答案 0 :(得分:3)

您无法在班级中为字段创建索引器。你必须创建自己的类来存储数据,然后你可以创建它的类型字段。

class MyClass
{
    public MyIndexerClass Sites;
    public class MyIndexerClass
    {
        private byte[] data;

        public MyIndexerClass()
        {
            this.data = new byte[0];
        }
        public MyIndexerClass(byte[] Data)
        {
            this.data = Data;
        }

        public byte this[int index]
        {
            get
            {
                return data[index];
            }
            set
            {
                data[index] = value;
            }
        }
    }

    public MyClass()
    {
        this.Sites = new MyIndexerClass();
    }
    public MyClass(byte[] data)
    {
        this.Sites = new MyIndexerClass(data);
    }
}

如果您想在Count上使用foreach属性和MyIndexerClass,则应实施IEnumerable并创建自己的Enumerator

答案 1 :(得分:0)

C#中的indexer syntax允许这样做,它看起来像这样:

public byte this[int index] {
 get { return data[index]; }
 set { data[index] = value; }
}

这定义了类型的索引器。用法就像

m[i] = 1;

但是,.NET中的许多数组和列表构造已经具有索引器,因此您可以定义字段/属性sites,例如类型为List<byte>