4

私は自分自身を優れた中級レベルの .Net 開発者だと考えており、過去 3 年以上 C# に取り組んだ後、C# のすべての概念と用語を十分に理解しています。しかし、私が持っているこの 1 つの質問があります。それがばかげた、ばかげた質問のように見える場合は、お詫び申し上げます。私が知りたいのは、フレームワーク クラス ライブラリの一部のメソッドが、幅の広いデータ型の方が適切な場合に幅の狭いデータ型を返す理由です。後で、関心のあるデータ型にキャストする必要があります。私の質問をサポートするために、次の2つの例を示します。

  1. Label Label1 = (Label)Grid.FindControl("Label1");
    この例では、FindControl が Control 型のインスタンスを返すのはなぜですか。それを Label 型にキャストする必要があります。メソッド引数のマークアップで宣言された有効な ID を渡しているため、Label 型のインスタンスが返される可能性があります。

  2. protected override object SaveViewState()
    この例では、キャストする必要がある on オブジェクトが返されますが、これは文字列型である可能性があります。

私の質問が紛らわしい場合は、もう一度申し訳ありません。私が知りたいのは、そのようなシナリオが狭い型を返す可能性があるのに、なぜ広い型を返すのかということだけです。これにより、必要な型にキャストする追加の手順を回避できる可能性があります。

4

4 に答える 4

5

これは、フレームワークを設計するときに、可能な限り一般的なレベルで、または必要に応じて抽象的なレベルで操作する必要があるためです。この場合、最も可能性の高い基本クラスを返すと、ほとんどすべてをサポートできる抽象化が作成されます。想像:

Label     label1 = (Label)Grid.FindControl("Label1"); 
TextBox   textBox1 = (TextBox)Grid.FindControl("TextBox1"); 
Calendar  calendar1= (Grid)Grid.FindControl("Calendar1"); 

からコントロールを取得する方法は1つだけです。呼び出し元はそれが正確に何であるかを知っているので、既知のタイプにキャストします。Grid

フレームワークデザイナーのように、、、、の特別なメソッドを作成したい場合はLabel、タイプごとに1つのメソッドを追加する必要があります。フレームワーク設計者の観点からは考えられないことだとあなたは同意すると思います。他の開発者のために一般的なインフラストラクチャを設計する必要がある開発者の観点から。TextBoxCalendar

于 2012-09-06T20:35:03.050 に答える
3

これIDがマークアップファイルで定義されているという事実は、コンパイル時にタイプがわかっていることをまったく意味しません。さらに悪いことに、マークアップファイルはコンパイルプロセスの一部ではないため、これを検証する方法はまったくありません。

stringまた、C#では戻り型の共分散サポートがないため(とのFindControl両方を返すメソッドを呼び出すことはLabelできません) 、識別子だけでこのようなことを行うことができる可能性はほとんどありませんControl

これから得られる最も近い方法は、IDEに拡張メソッドを生成させて、FindLabel1それをキャストすることですが、これはコードと同じようにハックであり、何も保証されません。

于 2012-09-06T20:36:26.443 に答える
3

Label Label1 = (Label)Grid.FindControl("Label1");

この例では、FindControlがControlタイプのインスタンスを返すのはなぜですか。それを、Labelタイプにキャストする必要があります。

あなたが間違っている。メソッドの戻り型はですControlが、返されたインスタンス型はですLabel(そうでない場合、それをアップキャストすることはできません)。

メソッド引数のマークアップで宣言された有効なIDを渡しているため、Labelタイプのインスタンスを返す可能性があります。

できますし、します。しかし、あなたがここで本当に求めているのは、「なぜ私はアップキャストする必要があるのか​​」です。メソッドの戻り型はとして宣言されControlいるためです。これは、変数の型が解決されるときに、コンパイル時に制御型を知る方法がまったくないためです。

于 2012-09-06T20:37:07.687 に答える