1

コンテンツの非表示と表示に使用しているパネルを備えたASP.NETユーザーコントロールがあります。つまり、

<asp:Panel runat="server" ID=pnlContainer">
    <!-- Some fairly uninteresting content -->
</asp:Panel>

オーバーライドとして可視プロパティがあります。つまり、

    public override bool Visible 
    {
        get { return pnlContainer.Visible; }
        set { pnlContainer.Visible = value;  } 
    }

設定すると、スタックオーバーフロー例外が発生しますが、キーワードをに変更するとnew、つまり、

    public new bool Visible 
    {
        get { return pnlContainer.Visible; }
        set { pnlContainer.Visible = value;  } 
    }

すべて正常に動作します。どうしてこれなの?私はこれらのキーワードについて一般的によく理解していないと思います。それがここに表示されています。

また:

キーワードを付けない場合、Visual Studio は、ユーザー コントロールの既存のメンバーをマスクしているためnew、キーワードまたはキーワードのいずれかを使用する必要があるという警告を表示します。override

ある意味では、パネルを使用してユーザー コントロールの表示を制御するという私の奇妙な習慣は、ここでは問題ではありません。貢献者の助けを借りて、それは明らかに狂っていて、やるべきではありません. しかし、私が興味を持った問題は、overrideandnewキーワードが非常に異なる方法で動作することと、その理由です。

4

2 に答える 2

6

この違いは、Microsoft のページKnowing When to Use Override and New Keywords (C# Programming Guide)にまとめられています。

そこに示されているコードのセクションを確認してください。また、以下にリストされています。

public static void TestCars2()
{
    Car[] cars = new Car[3];
    cars[0] = new Car();
    cars[1] = new ConvertibleCar();
    cars[2] = new Minivan();
}

foreach (Car vehicle in cars)
{
    System.Console.WriteLine("Car object: " + vehicle.GetType());
    vehicle.DescribeCar();
    System.Console.WriteLine("----------");
}

同じ原則がソースに適用されています。.NET フレームワークは、ページ上のすべてのコントロールを基本 Control クラスのコレクションとして扱います。Control.Visible仮想プロパティです。

つまり、ASP.NET フレームワークがControl.Visibleすべてのコントロールに対して呼び出す場合、Control.Visibleソースから呼び出される唯一のプロパティは、 としてマークされたoverrideものです。これは、標準的なポリモーフィズムで一般的に考えられるものです。それ以外の場合、プロパティを として宣言するとnew、ASP.NET フレームワークが を呼び出したときにControl.Visible、プロパティが呼び出されることはありません。

panel.Visibleしたがって、オーバーライドにより、自分自身を再帰的に何度も呼び出す自分の を呼び出すため、スタック オーバーフロー例外が発生します。

于 2012-10-31T16:54:00.650 に答える
0

newキーワードは、継承されたメンバーを非表示にします (例については、Overrideおよび New キーワードをいつ使用するかを知る (C# プログラミング ガイド)を参照してください)。

したがってnew、この場合に適用すると、ある時点でオブジェクトがその基本クラスとして参照され、派生クラスのセッターの代わりに基本クラスのセッターが呼び出されます (セッターがそれ自体を呼び出すため、無限ループが発生します)。

于 2012-10-31T16:41:45.213 に答える