6

このスレッドへの多くの返信を読んだ後、それを嫌う人の多くが新しいキーワードの悪用の可能性を挙げていることがわかりました. 私の質問は、どのような虐待ですか?これがひどく悪用されて、人々がそれを激しく嫌うようになるのはどうしてでしょうか? 純粋主義だけですか?それとも、私が見ていない本当の落とし穴がありますか?

4

7 に答える 7

17

人々がこの機能に対して表現している嫌悪感の多くは、「悪い開発者が悪いコードを書くことを可能にするため、これは悪い言語機能である」ということに要約されると思います。考えてみれば、その論理ではすべての言語機能が悪いのです。

ある天才が接頭辞としてOn Error Resume Next. 多分私はそうすべきだと思います。しかし、私の経験では、ヒューズボックスにペニーを入れようと決心した人は、道を見つけるでしょう。あなたが彼のポケットを空にしても、彼は自分のペニーを作るでしょう.

私は、C# と Python の間で相互運用するためのより便利な方法を楽しみにしています。これを行うコードをどんどん書いています。このdynamicキーワードは、その特定のユースケースにすぐに対応できるものではありません。なぜなら、現在のやり方では、1950 年代に会議のために西側に旅行しているソ連の学者になったような気分になるからです。私がそこにいる間ずっと、誰かが私を見張っていることは間違いないだろうし、私がそこにいる間に拾ったもののほとんどは、私が戻ったときに国境で私から奪われるだろう.

于 2008-10-29T02:44:30.210 に答える
16

悪用されるツールと見なす人もいます。C# や Java などの「純粋な」言語にはなかった VB の「Option Strict Off」と「On Error Resume Next」のように。

多くの人が「var」キーワードについて同じことを言っていましたが、VB の「Variant」と同じではないことが理解されると、悪用されているようには見えません。

怠惰な開発者がクラスの型チェックを望まず、「if blah is Blah ...」と書く代わりに動的呼び出しをキャッチしようとする場所で悪用される可能性があります。

個人的には、最近回答したこの質問のような状況で適切に使用できると感じています.

その力を本当に理解しているのは、動的な .NET 言語に深く関わっている人だと思います。

于 2008-10-29T00:01:05.283 に答える
7

次のようなコードがいたるところに表示されるため、dynamicは良くありません。

public dynamic Foo(dynamic other) {
  dynamic clone = other.Clone();
  clone.AssignData(this.Data);
  return clone ;
}

それ以外の:

public T Foo<T>(T other) where T: ICloneable, IAssignData{
    T clone = (T)other.Clone();
    clone.AssignData(this.Data);
    return clone;
}

最初のものは、静的な型情報がなく、コンパイル時のチェックもありません。自己文書化も型推論も行われないため、人々は結果を格納するために呼び出しサイトで動的参照を使用することを余儀なくされ、より多くの型の損失につながります。これはスパイラルダウンします。

私はすでに動的を恐れ始めています。

編集:危険は過ぎ去りました(ふぅ!)...そしてダイナミックは結局悪用されていませんでした.3年後に私に反対票を投じる必要はありません:)

于 2008-10-29T01:47:56.800 に答える
6

本当の落とし穴?ドキュメントの深刻な不足。アプリケーションのアーキテクチャ全体は、それを書いた人の心の中に存在します。少なくとも厳密な型付けを使用すると、クラス定義を介してオブジェクトが何をするかを確認できます。動的型付けでは、せいぜいその使用から意味を推測する必要があります。最悪の場合、オブジェクトが何であるかがわかりません。JavaScript ですべてをプログラミングするようなものです。アック!

于 2008-10-29T00:02:03.940 に答える
2

人々がIntelliSenseをうまく利用できないことに気付いたとき、dynamic彼らは幸せから必要なとき、そして他のすべての時間に戻ります。dynamicdynamicvar

目的は次のdynamicとおりです。COM/C++やDLR/IronPython/IronRubyなどの動的言語およびプラットフォームとの相互運用性。また、C#自体をIronSmalltalkWithBracesに変換し、すべてを実装しIDynamicObjectます。

みんなで楽しい時間を過ごせます。(他の誰かが書いたコードを維持する必要がない限り。)

于 2008-10-29T02:04:16.907 に答える
-2

メソッドを動的に呼び出す現在の方法に欠陥がある理由がわかりません。

これを行うには 3 行かかります。または、System.Object に拡張メソッドを追加して、それを行うことができます。

class Program
{
    static void Main(string[] args)
    {
        var foo = new Foo();            
        Console.WriteLine(foo.Invoke("Hello","Jonathan"));
    }        
}

static class DynamicDispatchHelper
{
    static public object Invoke(this object ot, string methodName, params object[] args)
    {
        var t = ot.GetType();
        var m = t.GetMethod(methodName);
        return m.Invoke(ot, args);
    }
}

class Foo
{
    public string Hello(string name)
    {
        return ("Hello World, " + name);
    }
}
于 2008-10-29T02:47:56.817 に答える