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

好吧,这是因为您在第二个示例中实际上并没有以正确的方式进行投射。

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

在施放时,尽可能清楚地知道您要施放的具体内容通常很重要。在这种情况下,添加几组括号向编译器表明您不想强制转换roworrow.ItemArrayrow.ItemArray[0].myCustomProperty,但是row.ItemArray[0],它实际上是 type myTypeA

于 2012-12-12T16:33:15.833 回答
1

您只需要添加括号就可以了:

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

在第二种情况下仍然会创建一个新的引用,它只是在一个较低的范围内。在评估该复杂语句的过程中,将创建一些非常短暂的临时变量来存储中间值;你的演员的结果将是其中之一。

现在临时对象不需要在if语句的整个生命周期内都存在,就像第一个示例一样(尽管实际上在该语句中途 GC 收集的几率是...低),但那是不太重要。

另请注意,演员阵容与此无关。只写:

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

复制参考。不需要演员来做到这一点。

复制参考也不是一项缓慢的操作。事实上,它是计算机可能执行的最快的操作之一,即从内存中取出一个单词并移动它。

于 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 回答