2009-02-04 68 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