这个问题是我的好奇心,所以我不打算寻找这个问题只是一个解释。
我一直想知道为什么在转换时必须创建一个新变量。
这是我本以为编译器可以工作的那种事情,当我转换为已知类型时,它会很神奇。
因此,这样的代码可以写得更短。
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";
在选角时,尽可能清楚你到底要选角什么通常很重要。在这种情况下,添加几组括号向编译器表示您不想强制转换row
或row.ItemArray
或row.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";