C# '(class) var' - 这个结构是什么

  • 本文关键字:是什么 结构 var class c#
  • 更新时间 :
  • 英文 :


我正在尝试学习一些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
}

了解两者之间的区别,尽管它们在做同样的事情。

最新更新