2

私はいくつかのコードをリファクタリングしていましたが、その一部には VB.Net から C# への移行が含まれていました。

古いコードでは、次のようにメンバーを宣言していました。

Protected viewMode As New WebControl

新しいコードは、次のように最終的に機能するようになりました。

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

Newキーワードの意味は次のとおりだと推測できます:コンストラクターを呼び出してください!しかし、VB.Net では、C# では呼び出すことができなかったコンストラクター (パラメーターのないコンストラクター) をどのように呼び出すのでしょうか?

4

4 に答える 4

9

これが C# ではなく VB で機能した理由は、アセンブリとは何の関係もありませんでした。

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" メンバーにアクセスすることのみを許可します。"other" が "Derived1" ではない可能性があるため (たとえば、"Derived2" である可能性があります)、"m_x" へのアクセスは許可されません。

このコードの場合、VB は「WebControl」コンストラクターへの「横向き」アクセスを許可しました。

しかし、C# はそうではありませんでした。

于 2009-02-04T00:28:42.347 に答える
2

WebControl の既定のコンストラクター (VB 行で暗黙的) は、スパンを使用することです。そのコンストラクターは、VB.NET だけでなく C# でも呼び出すことができます。

于 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 では、2 つの方法で変数を初期化できます。最初に代入演算子が続き、宣言が続きました。2 番目に「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

Web コントロール wc =タブ;

于 2009-04-30T02:35:16.737 に答える