2011-06-16 50 views
1

我使用C#和ASP.NET。可循環的Int類型與循環中的值相關聯 - 您最喜歡的方法是什麼?

我用下面的代碼粘貼在我的應用程序中沒有問題,但我想知道是否有更好的方法來實現相同的結果。

我需要做的:

我需要使用一個循環設置一個變量int imageId。 變量imageId它在Loop之外,所以可以用在我的代碼的其他部分。

我的問題:

  • 爲什麼,如果我只使用int imageId;編譯器抱怨(錯誤:未分配使用局部變量「圖像標識」的)?
  • 我使用nullable int type而不是int imageId = 0;,所以我可以將它設置爲空值..(對我來說似乎是語義上正確的),你會建議嗎?如果沒有原因。
  • 你最喜歡怎樣處理這類問題?

謝謝你們的支持!!!!

  int? imageId = null; 
      foreach (DictionaryEntry valueEntry in e.Keys) 
      { 
       if (valueEntry.Key.Equals("ImageContentId")) 
       { 
        imageId = Convert.ToInt32(valueEntry.Value.ToString()); 
        break; 
       } 
      } 

請給我一個你的代碼示例謝謝!

+1

e是如何定義的? – 2011-06-16 12:27:08

+0

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridviewdeleteeventargs.aspx – GibboK 2011-06-16 12:28:21

+0

e來自GridViewDeleteEventArgs – GibboK 2011-06-16 12:28:35

回答

4

您可以使用IOrderedDictionary方法Contains。這將允許您完全刪除循環結構。例如

if(e.Keys.Contains("ImageContentId")) 
{ 
    imageId = Convert.ToInt32(e.Keys["ImageContentId"].ToString()); 
} 

此外,如果你知道該值是一個字符串,你可能會感興趣的Int32.TryParse方法例如

int imageId ; 
if(Int32.TryParse(e["ImageContentId"].ToString(), out imageId)) 
{ } 

,你想使用一個int?的唯一理由是,如果你操縱數據可以未初始化。如果你正在解析數據並且它是垃圾文件,你有兩個選擇: (注意:這裏假設你不想拋出Exceptions RE的錯誤數據)。

1)使用默認值 - 這具有天生耐受不良數據的好處。

2)使用int?構造 - 這樣做的好處是通知代碼的其餘部分數據已知是不好的,並確保它們設計爲處理空值。

至於哪個更好......只能在系統結構中回答。如果你使用不支持可空類型的外部dll進行互操作,那麼這個決定非常明確!

至於編譯器錯誤:如果您在if語句中初始化imageId,則會出現不會執行初始化分支的情況,例如,一個不好的價值。爲確保始終初始化imageId,編譯器將強制您在條件代碼路徑之外初始化它。通常我會在聲明它時嘗試初始化一個變量。例如

int imageId = 0; 
+0

請你可以參考我發佈的問題嗎? THanks – GibboK 2011-06-16 12:31:45

+0

對於IOrderedDictionary,你可以使用Contains http://msdn.microsoft.com/en-us/library/system.collections.idictionary.contains.aspx – 2011-06-16 12:38:35

+0

嗨,GridViewDeleteEventArgs不包含e.ContainsKey .. – GibboK 2011-06-16 12:42:44

0

,你可以使用LINQ找到入口:

var foundKey = e.Keys.FirstOrDefault(k => k.Key.Equals('ImageContentId')); 

然後三元表達式來獲取值:

int? imageId = foundKey == null ? (int?)null : Convert.ToInt32(foundKey.Value); 

然而,什麼樣的價值?如果你確定這是一個int,你可以投它,而不是調用Convert.ToInt32。另外,Convert.ToInt32在某些情況下可能需要(int?)null返回0。

1

回答您的問題

  • 在.NET中所有價值型是這樣實現的結構。所有結構必須在使用前初始化。
  • 如果您有興趣檢查該值是否存在,那麼可爲空是正確的選擇。否則,與int imageId = 0
  • 沒有問題,你可以使用下面的代碼
int imageId = 0; 
if(e.Contains("ImageContentId")) 
{ 
    //If you are sure value is int 
    imageId = (int)e["ImageContentId"]; 
} 
0

我最喜歡的方式來這樣的問題不是靠超載有關的值是否與信息的價值存儲變量找到。我明確地這樣做。

bool value_present = false; 
int imageId; 

foreach (DictionaryEntry valueEntry in e.Keys) 
{ 
    if (valueEntry.Key.Equals("ImageContentId")) 
    { 
     value_present = true; 
     imageId = Convert.ToInt32(valueEntry.Value.ToString()); 
     break; 
    } 
} 

然後在使用imageId之前測試value_present

這就是說,和其他人一樣,這是瘋了。

  • 不要循環就是這樣,只需要調用e.Keys.Contains()
  • 沒有轉換爲字符串,然後返回一個int。如果它是一個int,就施放它。