1

私はこれについて疑問に思っていました.メソッドのパラメーターとして単にオブジェクトを使用することをサポートしますか? これを行う理由は、オーバーロードです。現在、さまざまなデータ型に対応するメソッドを作成しようとしています: stringdecimalDateTime... リストは続きます。

ちょっと面倒なので、次のことを考えていました

public void GenericMethod(object val)
{
    if (val is string)
        // process as string
    else if (val is decimal)
        // process as decimal
    else if (val is DateTime)
        // do something for dt
    else
        // ...
}

このような方法をどう思いますか?不必要なオーバーヘッドが発生しますか? (型チェック中)実装しましたか?教えて...

編集:ええ、そしてただの補足ですが、私はオーバーロードに少し慣れています。しかし、オーバーロードが 10 個を超えると、少し面倒になります...

4

6 に答える 6

9

はい、それはうまくいきます。ただし、これを行うより良い方法があります。

あなたの最善の策は、オーバーロードを使用することです:

public void GenericMethod(string val)
{
        // process as string
}
public void GenericMethod(decimal val)
{
    // process as decimal
}

コードでキーワードを使用するときはいつでも、is重要な OO 原則 (オーバーロード、サブクラスなど) の使用を忘れている可能性が高いという大きなヒントになります。

オーバーロードは、書くだけで、実際に作業するのはそれほど面倒ではありません。 覚えておいてください、あなたは今日自分のためにこれをコーディングしているのではなく、今から 3 か月後に自分のためにコードをコーディングしているので、コードを読んで、どうしてそんなことをしたのか、またはバグが世界のどこから来たのかを理解する必要があります。から。

「型の切り替え」手法を避けるもう 1 つの理由は、.NET フレームワーク (および人々の期待) との一貫性のためです。特定のクラス内およびクラスの下でオーバーライドされる、フォローConsole.Writeおよびその他のさまざまなメソッド。

于 2012-05-22T16:42:55.600 に答える
7

私はこれについて疑問に思っていました.メソッドのパラメーターとして単にオブジェクトを使用することをサポートしますか?

めったにありません。適切にサポートされている型の固定セットがあり、それ以外の場合は例外をスローする場合は、オーバーロードを使用します。

実際に任意の型を受け入れることができ、特にサポートされていない型をよく知られている方法で処理する場合は、受け入れても問題ありませんobject。これは LINQ to XML があらゆる場所で行っていることであり、その結果、非常にクリーンな API が作成されます。ただし、非常に慎重に行います-それが良い考えであることはめったにありません。

そして、はい、オーバーヘッドがあります。ただし、通常はそれを決定の根拠にすることはありません。ほとんどの場合、オーバーヘッドは無視できるほど小さくなります。API をできる限りきれいに設計し、それがボトルネックを引き起こすかどうかを調べます。

于 2012-05-22T16:44:26.097 に答える
3

それらの必要はありません!

同じ名前のメソッドを必要な数だけ宣言し、各メソッドの引数として各型を取るだけです。[これはオーバーロードと呼ばれます。たとえば、メソッドの横にあるのを見たことがあるかもしれません+1 Overloads。これは、同じ名前で引数の型が異なるメソッドがもう 1 つあることを意味します]

このように言います:

void Method(decimal d)
{
    //Process Decimal
}
void Method(string s)
{
    //Process String
}

デフォルトでは、Type に従って独自のメソッドを見つけます。

于 2012-05-22T16:46:46.300 に答える
3

はい、型チェックと値型のボックス化/ボックス化解除の両方でオーバーヘッドが発生します。オーバーロードをお勧めします。

別の可能性は、数値を使って多くの計算を行っていない限り、それをジェネリック メソッドにすることです。ただし、演​​算子の使用を可能にする値型の制約がないため、算術演算はジェネリックではかなり困難です。

于 2012-05-22T16:42:55.437 に答える
1

あなたのアプローチが理にかなっている場合があります。以前に使用したことがありますが、ほとんどの場合、さまざまなデータ型に対して同じ処理がたくさんある場合です。

しかし、これは過負荷ではありません。オーバーロードは、次のように同じメソッド名に対して異なるシグネチャを定義することです。

public void GenericMethod(string val)
{
    // process as string
}

public void GenericMethod(decimal val)
{
    // process as decimal
}

public void GenericMethod(DateTime val)
{
    // do something for dt
}

// Etc.

また、場合によっては、このアプローチの方が理にかなっています。

于 2012-05-22T16:44:36.300 に答える
0

それらの 1 つが取る多くのオーバーロードを実装することobjectは問題ありません。Console.WriteLineたとえば、オーバーロードを見てください。http://msdn.microsoft.com/en-us/library/system.console.writeline.aspxただし、たとえば int が double と競合する可能性があることに注意してください。

int sum(int i, int j)
{
 return i + j;
}

double sum(double i, double j)
{
 return i + j;
}

object sum(object i, object j)
{
  return i.ToString() + j.ToString();
}

==============================

static void Main()
{
   sum(1, 2); // Error: ambigous call between `int` and `double` versions
   sum(1.0, 2.0); // calls double version, although 1.0 and 2.0 are objects too
   sum("Hello", "World"); // object
}
于 2012-05-22T16:45:10.573 に答える