2012-12-15 25 views
3

我有一類這樣的事情(這是代碼的一個子集)下,使用#索引

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; 

任何人都可以建議我會怎麼做嗎?

+1

聲明一個int類型的數組或列表,並通過索引訪問這些網站? – Anthill

+0

你意識到你打破了完全不受支持的,不安全的方式的類型系統?您強制將byte []視爲int [],結果爲100%未定義。 – usr

回答

0

C#中的indexer syntax可以做到這一點,它會是這個樣子:

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

此定義的類型的索引。用法是一樣

m[i] = 1; 

然而,許多陣列和列表在.NET構造已經有索引,所以你可以定義一個字段/屬性sites例如的類型List<byte>

+1

儘管如此,這意味着他的客戶端代碼看起來像'm [i] = 1',而不是'm.sites [i] = 1'。 – carlpett

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

如果你想在MyIndexerClass使用Count財產和foreach,你應該實現IEnumerable並創建自己的Enumerator

+0

問題在於'Byte [] data'是MyIndexerClass的一部分。我需要它成爲MyClass的一部分,因爲它包含的數據不只是整數。 – BobZ

+0

是的,我確實工作過,但從更新的代碼中可以看出,'Byte [] data'需要位於MyClass而不是NyIndexerClass。 – BobZ

+0

但你爲什麼需要這個?你可以通過MyClass.Sites來訪問數據。如果你需要將你的數據加載到字節數組中,你可以公開'data'數組,或者你可以創建特定的訪問方法。我可以給予進一步的幫助,但是你必須告訴我你需要在'MyClass'中擁有'data'。 – user35443