VB.Net与C#“As New WebControl”的区别

我正在重构一些代码,其中一部分包括将它从VB.Net转移到C#。

旧代码声明了这样的成员:

Protected viewMode As New WebControl 

新代码,我最终得到了工作,像这样:

 protected WebControl _viewMode = new WebControl(HtmlTextWriterTag.Span); 

我可以假设New关键字意味着:调用构造函数! 但是VB.Net如何调用我在C#中无法调用的构造函数(无参数)?

这在VB中起作用的原因,而不是在C#中,与程序集无关。

WebControl的默认构造函数受到保护。

VB和C#对“受保护”的含义有不同的解释。

在VB中,您可以从派生自该类的任何类型的任何方法访问类的受保护成员。

也就是说,VB允许这段代码编译:

 class Base protected m_x as integer end class class Derived1 inherits Base public sub Foo(other as Base) other.m_x = 2 end sub end class class Derived2 inherits Base end class 

因为“Derived1”是一个基础,它可以访问“其他”的受保护成员,这也是一个基础。

C#采用了不同的观点。 它不允许VB进行“侧向”访问。 它表示可以通过“this”或与包含该方法的类相同类型的任何对象来访问受保护的成员。

因为这里的“Foo”在“Derived1”中定义,所以C#只允许“Foo”从“Derived1”实例访问“Base”成员。 “其他”可能不是“Derived1”(例如,它可能是“Derived2”),因此它不允许访问“m_x”。

在这种代码的情况下,VB允许“侧向”访问“WebControl”构造函数。

但是,C#没有。

WebControl的默认构造函数(隐含在VB行中)是使用span。 您可以在c#和VB.NET中调用该构造函数。

在任何上下文中从派生类访问inheritance的受保护构造函数都会引发数据封装问题。

从历史上看,C#从第一个版本开始就允许这种访问。 但它已在VS 2005中修复。派生类现在只能从它们自己的构造函数中调用它们的基本受保护构造函数。

 class Base { protected Base() { } } class Derived : Base { public Derived() : base() // Still allowed in VS 2005 { } public void Main() { Base b = new Base(); // Allowed in VS 2003, but error in VS 2005 } } 

在VB.NET中,您可以通过两种方式初始化变量。 首先使用赋值运算符遵循声明; 第二个是“As New”声明。

在受保护的构造函数的情况下,“As New”总是正常工作。 至于通过赋值进行初始化,它将引发编译错误。 但是如果基类中有多个构造函数,则赋值初始化也会起作用!

 Class Base Protected Sub New() End Sub End Class Class Derived Inherits Base Public Sub Main() Dim foo As New Base // Allowed Dim moo As Base = New Base() // Error if Base has only one constructor End Sub End Class 

可能VB.NET允许这种访问的原因是与遗留代码的兼容性。

更多细节: http : //blogs.msdn.com/b/peterhal/archive/2005/06/29/434070.aspx

Webcontrol wc = tab ;