我正在尝试学习一些C#,这是我发现使用的代码片段之一:
(CheckBox)c
(其中c是foreach的结果)
我知道它这样做是为了让编译器知道 c 将表现为复选框,我的问题是:这种类型的构造叫什么?我希望能够谷歌更好地理解它。
谢谢!
它被称为演员表。正如你所说,它在这里用于告诉编译器c
实际上是一个复选框。还有一篇关于 MSDN 上转换的较长文章。如果使用非通用IEnumerable
foreach
,我认为这就是您正在做的事情,也有两种方法可以避免循环体中的这种转换:
for (CheckBox c in xs) {
}
for (var c in xs.Cast<CheckBox>()) {
}
这两段代码现在都c
公开为CheckBox
,无需强制转换。我可能会使用第一个,因为它是最惯用的(以及 .NET 1.1 和 Java 中熟悉的方法)。
它将 c 变量强制转换为类型 CheckBox。我认为在您的示例中,它是一个变量 c 的对象,如果您然后将其转换为复选框,您可以访问所有属性,例如"IsChecked"名称"等
换句话说。
演员阵容前:
bool isItChecked = c.IsChecked; // this would not compile because object does not have a property "IsChecked"
因此,要使其正常工作,我们必须告诉编译器变量 c 的类型为 CheckBox,如下所示:
var checkBoxC = (CheckBox)c; // The Cast
bool isItChecked = checkBoxC.IsChecked; // access the casted items properties.
这是一个关于类型转换的很好的初学者教程,您应该检查"显式转换",因为这就是您正在做的事情。
PS:这是必需的,因为 c# 是强类型而不是弱类型。
我们称之为casting
.请参阅MSDN。一些教程:一和二
您还有相关的东西,称为 boxing and unboxing
.MSDN
您的示例所做的是让您知道object c
实际上是一个checkbox
。这样您就可以访问checkbox
的所有属性。
它被称为"铸造"。查看更多信息:
强制转换和类型转换(C# 编程指南)
这称为强制转换。当您知道代码执行时"c"的类型将为复选框时,您可以执行此操作。但是,c 可能不是复选框,在这种情况下,您将获得 InvalidCastException。
实际上,C# 提供了许多结构来避免强制转换,例如泛型和泛型类型约束
根据经验:只有在您确实无法避免时才使用铸造。
它被称为"铸造"或"拆箱"
static private void TestBoxingAndUnboxing()
{
int i = 123;
object o = i; // Implicit boxing
i = 456; // Change the contents of i
int j = (int)o; // Unboxing (may throw an exception if the types are incompatible)
}
//this function is about 2*Log(N) faster
static private void TestNoBoxingAndUnboxing()
{
int i = 123;
i = 456; // Change the contents of i
int j = i; // Compatible types
}
了解两者之间的区别,尽管它们在做同样的事情。