c# - var 和 Class 类在对象创建上的区别

标签 c# .net visual-studio-2010 c#-4.0

这是一个愚蠢的问题,但看到不同的行为却感到震惊。学到很多。

假设我下面有两个类

Class A
{
 public void Display()
 {
 }
}

Class B : A
{
 public void Display()
 {
 }
}

Class C : B
{
 public void Display()
 {
 }
}

Class Final
{
 static void Main()
 {
  var c = new C();
//  B c = new C();  

 }
}

我的疑问是,以上两者给出了不同的结果。我可以知道 B c = new C() 创建 B 或 C 的对象吗?我的理解是,它创建了 B 的对象。那为什么我们说 new C()?我同意 C c = new C(); 但我想,B b = new C(); 创建 B 的对象。我们在哪里使用这种风格?仅在使用运行时多态性时? (覆盖方法)?

最佳答案

使用 var keyword 声明变量时,编译器从赋值的右侧推断变量的类型。特别是,它使用赋值运算符 (=) 右侧表达式的计算结果类型。

因此,对于你的声明

var c = new C();

,变量c将被声明为类型C

如果你想让c有任何其他类型,基本上有两个选择:

  • 要么明确指出c的类型:B c = new C();
  • 或者,您可以更改右侧表达式以将其识别为选择的类型:var c = (B)(new C());

至于你更详细的问题:

  • B c = new C() 创建类型 C 的实例。这就是 new C() 所做的。变量 c 被类型化为 B 的事实仅意味着编译器将假定 c 具有 B 类型的任何属性和方法,但不一定是 C 类型。同样,您以后不仅可以将类型 C 的实例分配给 c,还可以将类型 B 的实例分配给 c。<
  • 确实,当您不确定 c 是否会在某个时刻引用类型 B 的实例,而不是排他性地引用类型 的实例时,您可以使用这种样式>C.

关于c# - var 和 Class 类在对象创建上的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19891694/

相关文章:

c# - ‘之后的标题大小写大写字母

c# - iTemplate 它是什么以及我可以在 C# 中获得好的例子的地方

visual-studio-2010 - VS2010 beta 2 的稳定性如何?

c# - C#找不到数据提供者。 NET框架要求

c# - 在运行时添加控件的最佳实践

C# - 实时显示多行文本框计数

c# - 如何通过拖动扩展窗口框架使 WPF 窗口可移动?

.net - 术语 - 事件可以是 "thrown"吗?

.net - 在 .Net 中找出 Unicode 字符名称

c++ - 在 Debug 中覆盖 memcpy 工作但在 Release 中不工作?