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

編集:ああ、私の理解の間違いです!おっと、意味がないと思いました...は。少し余分に、どちらの方法も(正しい量の括弧が使用されていると仮定して)他の方法よりも明確で読みやすいと思いますか?

4

6 に答える 6

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";
}
于 2012-12-12T16:44:55.493 に答える
2

ええと、それはあなたが実際にあなたの2番目の例で完全に正しい方法をキャストしていないからです。

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

キャストするときは、キャストしようとしているものをできるだけ明確にすることが重要な場合がよくあります。rowこの場合、括弧のセットをいくつか追加すると、コンパイラに、またはrow.ItemArrayまたはをキャストしたくないrow.ItemArray[0].myCustomPropertyrow.ItemArray[0]、実際にはタイプである、が示されますmyTypeA

于 2012-12-12T16:33:15.833 に答える
1

かっこを追加するだけで機能します。

((myTypeA)row.ItemArray[0]).myCustomProperty = "dem breaks";
于 2012-12-12T16:33:19.830 に答える
1

2番目のケースでも、新しい参照が作成されます。スコープは低くなります。その複雑なステートメントを評価する過程で、中間値を格納するために、非常に短期間の一時変数がいくつか作成されます。キャストの結果はそのうちの1つになります。

一時オブジェクトがステートメントの存続期間全体にわたって存続する必要がなくなったのでif、最初の例のように(実際には、そのステートメントの途中のGCコレクションのオッズは...低いですが)、それは問題になる可能性は低いです。

また、キャストはこれとは何の関係もないことに注意してください。書くだけ:

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

参照をコピーします。それを行うためにキャストは必要ありません。

参照のコピーも遅い操作ではありません。実際、これは、コンピュータで実行できる可能性のある単一の最速の操作の1つであり、1ワードのメモリを取得して移動する操作です。

于 2012-12-12T16:33:30.263 に答える
0

括弧を追加する必要があります。

((myTypeA)row.ItemArray[0]).myCustomProperty = "dem breaks";
于 2012-12-12T16:34:19.610 に答える
0
(row.ItemArray[0] as myTypeA).mycustomproperty = value
于 2012-12-12T16:35:07.207 に答える