2011-09-19 44 views
0

我會通過其他開發人員的代碼,如下所示需要:澄清關於基本索引和收集在C#

[XmlElement("AdminRecipient")] public AdminRecipient[] AdminRecipientCollection = new AdminRecipient[0]; 

     public AdminRecipient this[ string type ] 
     { 
      get 
      { 
       AdminRecipient result = null; 
       foreach(AdminRecipient emailRecipient in AdminRecipientCollection) 
       { 
        if(emailRecipient.Type == type) 
        { 
         result = emailRecipient; 
         break; 
        } 
       } 
       return(result); 
      }   

有人能解釋這是怎麼回事在此行中出現呢?

public AdminRecipient[] AdminRecipientCollection = new AdminRecipient[0]; 

包含所有電子郵件收件人的XML文件包含大約5個電子郵件地址。但通過使用[0],foreach循環會返回每個這些電子郵件地址嗎?

我對索引器有一個基本的瞭解,但我不這樣做。這是什麼?:

做在一天結束的時候,這裏的問題是,應用程序不會發送電子郵件時,所有5個收件人在XML文件中。如果我只用1個電子郵件地址替換5個地址,那麼我就可以得到電子郵件(這使我相信這裏存在邏輯問題)。

回答

1

索引器允許您使用與數組訪問相同語法的類型。一個最簡單的例子是List<T>

List<string> x = new List<string>(); 
x.Add("Item 0"); 
x.Add("Item 1"); 

string y = x[0]; // "Item 0" 

即使用x[0]呼籲索引爲List<T>。現在爲List<T>索引是一個整數,因爲它是一個數組,但它不一定是。例如,Dictionary<TKey, TValue>它的密鑰類型:

Dictionary<string, string> dictionary = new Dictionary<string, string>(); 
dictionary.Add("foo", "bar"); 

string fetched = dictionary["foo"]; // fetched = "bar" 

你可以有一個索引一個「二傳手」太:

dictionary["a"] = "b"; 

你的索引僅僅是一個帶有匹配返回第一AdminRecipient數組中鍵入 - 如果找不到匹配,則返回null。

(不幸的是,你所展示的代碼也使用了公共領域,作爲一個屬性 - 也可能不是一個數組,但這是一個單獨的討論。)

編輯:關於突出顯示的第一行:

public AdminRecipient[] AdminRecipientCollection = new AdminRecipient[0]; 

這將創建沒有元件的陣列,並且分配給AdminRecipientCollection場的參考。沒有進一步的改變,foreach循環將沒有任何東西可以迭代,索引器將總是返回null。

但是,大概是別的東西 - 比如XML序列化 - 正在給該字段分配一個不同的值 - 用更多有用的數據填充它。

+0

我不認爲實際的問題是索引器的內容不足,而是關於數組初始化與使用索引器的混淆。在行代碼OP突出顯示 –

+0

@Rune FS:我看着他突出顯示的第二行*代碼,但不是第一個。已編輯過,也談論這一點。 –

+0

@Jon:你如何爲這樣詳細的答案抽出時間是任何人的猜測,但是謝謝你! – Ray

0

您所要求的行是將AdminRecipientCollection賦值給一個空數組。此分配將在實例化時發生。在之後,XML將會發生的實例化,如果有的話。作者的目的大概是爲了確保AdminRecipientCollection永遠不會爲空,即使在XML被反序列化之前使用了該類。

通過確保AdminRecipientCollection永遠不爲null,作者可以忽略foreach循環將引發NullReferenceException的可能性。至少,這可能是希望。

不幸的是,因爲AdminRecipientCollection是公衆,AdminRecipient財產仍然可以扔了,如下面的情況:

var demoClass = new DemoClass(); 
demoClass.AdminRecipientCollection = null; 
var firstRecipient = demoClass[0]; 

爲了防止這種可能性,刪除初始分配,在開始之前AdminRecipient屬性檢查null列舉。