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

时间:2009-02-04 00:00:40

标签: c# .net asp.net vb.net clr

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

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

Protected viewMode As New WebControl

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

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

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

4 个答案:

答案 0 :(得分: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#没有。

答案 1 :(得分:2)

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

答案 2 :(得分: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”声明。

如果受保护的构造函数,“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

答案 3 :(得分:0)

Webcontrol wc = 标签;