1

匿名オブジェクトを引数として受け入れるメソッドを書きたいと思います。このようなメソッドを宣言する場合、パラメータはobjectまたはdynamic?として宣言する必要があります。

  1. public static void DoSomethingWith(dynamic details) { }また
  2. public static void DoSomethingWith(object details) { }

私のアプリケーションは、.NET4.0を対象としたスタンドアロンアプリケーションです。

私が1を好むように見える理由のひとつは、メソッドのシグネチャを示すIntelliSenseのヒントを見ると、dynamic引数が。よりもその意図をより明確に示しているためobjectです。

2を使用するより良い理由がない限り、1を使用します。

これについてのあなたの経験は何ですか?

4

3 に答える 3

1

フレームワーク4.0以降をターゲットにしている場合は、動的を使用することをお勧めします。

public static void DoSomethingWith(dynamic details)
{
    Console.Write(details.X);
    Console.Write(details.Y);
}

そしてそれを次のように呼びます:

DoSomethingWith(new { X = "ABC", Y = 10 });
于 2013-01-03T10:37:07.273 に答える
0

この場合、使用することdynamicにはいくつかの利点がobjectあり、私が見ることができる欠点はないので、オプション1が明らかに進むべき道です。

オプション1を使用すると、実際の型で宣言した場合と同じようにパラメーターを使用できます(匿名であるため、パラメーターを使用することはできません)。

public static void DoSomethingWith(dynamic details)
{
  var temp = details.Property; // Correct, as long as the object has a property called Property
}

オプション2を使用すると、このコードは違法になり、に頼る必要がありますInvokeMethod()。これは、実際の利点を提供せずに使用したり読んだりするのがより面倒です。

于 2013-01-03T10:48:34.037 に答える
0

これはコンテキストに大きく依存します。dynamicメンバーへのアクセスを許可する機能について説明している既存の回答が2つありますが、発信者がそれらのメンバーを提供することを意図していることが明らかでないという大きな問題があります。そのような場合、それらのメンバーを持つタイプが、事実上すべての場合に好まれます。

主に、の使用は、dynamic実際に必要なシナリオ(動的タイプとの通信)に限定する必要があります。実際に通常のPOCOオブジェクト(おそらく匿名タイプなど)と話している場合はobject、いくつかの複雑さを回避できる可能性がありますが、基本的objectには、メンバーへのアクセスを開始するまでdynamicは両方とも実装されます。object

一般に、メソッドにネイキッドを渡す場合はobject、メソッドがおそらくリフレクションを介してメソッドを検査することを期待します。これらの目的のために、は絶対に問題なく、間接参照なしでetcobjectへの直接アクセスを提供します。.GetType().GetProperties()

基本的に:メソッド内で何をしているのかについてのコンテキストがなければ、メソッド内で「より良い」または「より適切」であり、自明に交換可能であると結論付けることは不可能です(キャストdynamicobjectどちらの方向でも常に成功します) 。

于 2013-01-03T10:57:06.870 に答える