2012-12-12 44 views
4

這個問題是我的好奇心,所以我不想在這個問題上尋找一個解釋。鑄造對象類型而不創建新變量

我一直想知道爲什麼在鑄造時必須創建一個新變量。

這是我認爲編譯器可以工作的那種東西,因爲我正在轉換成已知類型。

因此,這樣的代碼可以寫得更短。

DataTable dataTable = RetrieveDataTableFrom(whereEver); 

foreach (DataRow row in dataTable.rows) 
{ 
    if (row.ItemArray[0].GetType() == typeof(myTypeA)) 
    { 
     MyTypeA myTypeA = (myTypeA)row.ItemArray[0]; 
     myTypeA.myCustomProperty = "dem works"; 
    } 
} 

像這樣,我只是更直接地編輯屬性。

foreach (DataRow row in dataTable.rows) 
{ 
    if (row.ItemArray[0].GetType() == typeof(myTypeA)) 
    { 
     (myTypeA)row.ItemArray[0].myCustomProperty = "dem breaks"; 
    } 
} 

編輯:哦,所以我的理解錯誤!哎呀,我認爲這沒有道理......哈。 有一點額外的,你會考慮兩種方法(假設使用正確數量的括號)比其他方法更清晰/可讀嗎?

回答

2

嗯,這是因爲在第二個例子中,你實際上並沒有正確地施放方法。

((myTypeA)(row.ItemArray[0])).myCustomProperty = "dem breaks"; 

在投射時,儘可能清楚你想要投射什麼樣的東西通常很重要。在這種情況下,向編譯器添加幾組括號可以向編譯器指出,您不會投入rowrow.ItemArrayrow.ItemArray[0].myCustomProperty,但是row.ItemArray[0],它實際上是myTypeA類型。

1

你只需要添加括號,也將努力:

((myTypeA)row.ItemArray[0]).myCustomProperty = "dem breaks"; 
1

一個新的參考仍將在第二種情況下被創建,它將是在一個較低的範圍內。在評估複雜語句的過程中,會創建一些非常短暫的臨時變量來存儲中間值;你演員的結果將是其中之一。

既然臨時對象不需要在if陳述的整個生命週期內生存,就像第一個示例所做的那樣(儘管實際上GC集合在該陳述的一半中的可能性是......低),但這不太可能。

另請注意演員陣容與此無關。只寫:

object first = new object(); 
object second = first; //the reference is copied here 

複製引用。不需要演員就可以做到這一點。

複製引用也不是一個緩慢的操作。事實上,它是計算機可能執行的最快的單一操作之一,即記錄一個單詞並移動它。

0

您應該添加圓括號;

((myTypeA)row.ItemArray[0]).myCustomProperty = "dem breaks"; 
0
(row.ItemArray[0] as myTypeA).mycustomproperty = value 
4

這應該工作

foreach (DataRow row in dataTable.rows) 
{ 
    if (row.ItemArray[0].GetType() == typeof(myTypeA)) 
    { 
     ((myTypeA)row.ItemArray[0]).myCustomProperty = "dem breaks"; 
    } 
} 

,或者你可以使用LINQ

foreach (var row in dataTable.Rows.Cast<DataRow>().Where(row => row.ItemArray[0].GetType() == typeof(myTypeA))) 
{ 
    ((myTypeA)row.ItemArray[0]).myCustomProperty = "dem breaks"; 
} 
+0

總是有趣的替代方案LINQ +1 – Amicable