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