将对象转换为类型而不创建新变量

时间:2012-12-12 16:28:26

标签: c# reference compilation

这个问题是我的一个好奇心,所以我不是想要解决这个问题。

我一直想知道为什么在施法时必须创建一个新变量。

这就是我认为编译器可以在我投射到已知类型的过程中发挥作用的那种东西。

因此,这样的代码可以写得更短。

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

编辑:哦,我的理解错误!哎呀,我觉得这没有意义......哈。 还有一点,你会考虑使用哪种方法(假设使用的括号正确)比另一种方法更清晰/可读?

6 个答案:

答案 0 :(得分: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";
}

答案 1 :(得分:2)

嗯,这是因为你在第二个例子中实际上并没有采用正确的方法。

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

在施法时,尽可能清楚地了解你究竟要施放什么是很重要的。在这种情况下,添加几组括号表示编译器您不想投射rowrow.ItemArrayrow.ItemArray[0].myCustomProperty,而是row.ItemArray[0],这实际上是类型为myTypeA

答案 2 :(得分:1)

您只需添加括号即可起作用:

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

答案 3 :(得分:1)

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

现在,临时对象不需要在if语句的整个生命周期中生存,这是第一个示例所采用的方式(尽管实际上GC语言集合的可能性是该语句的一半)。 ..)),但这不太重要。

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

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

复制参考。这样做不需要演员。

复制引用也不是一个缓慢的操作。实际上,它是计算机可能执行的单个最快的操作之一,即单个内存单元并移动它。

答案 4 :(得分:0)

您应该添加括号;

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

答案 5 :(得分:0)

(row.ItemArray[0] as myTypeA).mycustomproperty = value
相关问题