Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使用索引器_C# - Fatal编程技术网

C#使用索引器

C#使用索引器,c#,C#,我有一个类似这样的类(这是代码的子集) 我目前访问的网站变量如下 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; MyClass m=newmyclass(); 对于(Int32 i=0;iin C#允许这样做,它看起来像这样: public

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

我目前访问的网站变量如下

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;
MyClass m=newmyclass();
对于(Int32 i=0;iin C#允许这样做,它看起来像这样:

public byte this[int index] {
 get { return data[index]; }
 set { data[index] = value; }
}
这在类型上定义了一个索引器

m[i] = 1;

但是,.NET中的许多数组和列表结构已经有索引器,因此您可以定义字段/属性
站点
,例如类型
列表
,您不能为类中的字段创建索引器。您必须创建自己的类来存储数据,然后才能创建其类型的字段

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);
    }
}

如果您想在
MyIndexerClass
上使用
Count
属性和
foreach
,您应该实现并创建自己的
枚举器

声明一个数组或一个int类型列表并按索引访问站点?…您意识到您以完全不受支持的、不安全的方式破坏了类型系统吗?您强制一个字节[]将被视为int[],结果是100%未定义。这意味着他的客户端代码看起来像
m[i]=1
,而不是
m.sites[i]=1
。但问题是“Byte[]“数据”是MyIndexerClass的一部分。我需要它成为MyClass的一部分,因为它包含的数据不仅仅是整数。是的,我已经解决了这个问题,但是从更新的代码中可以看到“字节[]”“数据”需要在MyClass而不是NyIndexerClass中。但是为什么需要它呢?你可以通过
MyClass.Sites
访问
数据
。如果你需要将数据加载到字节数组,你可以将
数据
数组公开,或者你可以创建特定的访问方法。我可以提供进一步的帮助,但你必须告诉我你要做什么你需要在
MyClass
中有
data
。问题是MyClass保存字节[],从那里我需要返回多个Int32[],一些字符串,一些字节和一些日期时间字段。我可以在MyClass中放置子索引器类,但我看不到如何传递对字节[]的引用。原始帖子中的updatedcode只显示了一个Int32[]和一个字符串,但实际上还有更多。我可以将其设置为不安全的代码并传递一个指向字节[]的指针,但我尽量不这样做。
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);
    }
}