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



这个问题是我的好奇心,所以我不打算寻找这个问题只是一个解释。

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

这是我本以为编译器可以工作的那种事情,当我转换为已知类型时,它会很神奇。

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

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

编辑:哦,我的理解是错误的!哎呀,我还以为没道理呢...医 管 局。另外一点,您是否认为任何一种方法(假设使用的括号数量正确)比另一种方法更清晰/可读?

这应该有效

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

嗯,这是因为你在第二个例子中实际上没有以正确的方式投射。

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

在选角时,尽可能清楚你到底要选角什么通常很重要。在这种情况下,添加几组括号向编译器表示您不想强制转换rowrow.ItemArrayrow.ItemArray[0].myCustomProperty,而是row.ItemArray[0],它实际上是类型myTypeA

你只需要添加括号,它就可以了:

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

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

现在,临时对象不需要像第一个示例那样在 if 语句的整个生命周期中生存(即使在实践中,该语句中途 GC 集合的几率是......低),但这不太可能重要。

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

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

复制引用。 不需要演员来做到这一点。

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

(row.ItemArray[0] as myTypeA).mycustomproperty = value

你应该添加括号;

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

最新更新