2009-02-04 28 views
2

我重构了一些代码,其中的一部分包括将它从VB.Net移动到C#。VB.Net和C#之间的区别“作为新的WebControl”

旧的代码中声明这样一个成员:

Protected viewMode As New WebControl 

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

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

我可以推定该New关键字的意思是:拨打构造器!但VB.Net是如何调用一个构造函数(无参数的),我不能在C#中调用?

回答

9

在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#没有。

2

WebControl的默认构造函数(VB行中隐含)是使用跨度。你可以在C#中调用该构造函数以及VB.NET。

+0

其实,有在VB地方,你都可以在构造函数,你不能在C#。这就是他得到这个错误的原因。详情请参阅我的帖子。 – 2009-02-04 00:32:31

0

Webcontrol wc = tab;

1

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

从历史上看,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”始终正常工作。至于赋值初始化,它会引发编译错误。但是如果基类中有多个构造函数,那么赋值初始化也会起作用!

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