2

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

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

Protected viewMode As New WebControl

新代码,我最终开始工作了,像这样:

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

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

4

4 回答 4

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”是一个基,它可以访问“other”的受保护成员,它也是一个基。

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

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

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

然而,C# 没有。

于 2009-02-04T00:28:42.347 回答
2

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

于 2009-02-04T00:03:36.610 回答
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

于 2010-12-03T10:24:12.863 回答
0

Webcontrol wc = tab ;

于 2009-04-30T02:35:16.737 回答