1

ブロックまたは関数内のオブジェクトを(前に宣言せずに)初期化して、ブロック外でも使用できるようにすることはできますか...?

ここで、Type2はType1から派生したクラスです。

例:

if(a==b)
{ Type1 obj = new Type1();}
else
{Type2 obj = new Type2();}

obj.getFunction(); 

基本クラスのUSER派生クラスADMINがあり、ユーザーがログインしている間、ユーザーの役割に応じてオブジェクトを作成し、後でそのオブジェクトを使用する必要があるため、毎回ユーザーの役割を確認する必要はありません。初心者)

これは可能ですか?

4

3 に答える 3

5

スコープで関数を実行させてみませんか?スコープを超えて変数にアクセスすることはできません。(Jon Skeetの答え(最高のプレーヤーがアリーナを踏む)を参照しない限り...

if(a==b)
{ 
    TYPE1 obj = new TYPE1();
    obj.function(); 
}
else
{
    TYPE2 obj = new TYPE2();
    obj.function(); 
}
于 2012-09-24T06:11:38.700 に答える
5

変数は、あるタイプまたは別のタイプのみにすることができます。そうでない場合、コンパイラーは、後で許可するメンバーアクセスをどのように知るのでしょうか。

を宣言する一般的なベースタイプ(ベースクラスまたはインターフェイス)があるfunction場合、それは変数のタイプである必要があります。

BaseType obj;
if (a == b)
{
    obj = new Type1();
}
else
{
    obj = new Type2();
}
obj.Function(); // Name fixed to follow conventions

これは次のように簡単になります。

BaseType obj = a == b ? (BaseType) new Type1() : new Type2();
obj.Function();

それらが本当に異なるタイプであるため、完全に別個のメソッドを効果的に呼び出す場合は、各ブロック内で変数を宣言してそこでメソッドを呼び出す必要があります。または、C#4以降を使用している場合、動的型付け:

dynamic obj = a == b ? (dynamic) new Type1() : new Type2();
obj.Function();

これが本当に一般的な関数であるかどうか(この場合は基本型で宣言する必要があるかどうか)、または同じ名前の2つの関数があるのは偶然の一致であるかどうか(この場合)を実際に検討する必要があります。それらを同じように扱うことを試みることは悪い考えです。(たとえば、1つのタイプをリファクタリングしてメソッド名を変更するとします...)

于 2012-09-24T06:12:51.463 に答える
5

ブロックまたは関数の内部に変数を作成して(前に宣言せずに)、ブロックの外部でも使用できるようにすることはできますか...?

いいえ、それはできません。ブロックの外側でも変数にアクセスできるように、ブロックの外側で変数を定義する必要があります。

于 2012-09-24T06:13:14.850 に答える