質問
への返信の多くを読んだ後このスレッドでは、嫌いな人の多くが新しいキーワードの悪用の可能性を挙げているようです。私の質問は、どのような虐待ですか?どうしてこれをひどく乱用して、人々を激しく嫌わせることができるでしょうか?それは純粋主義についてですか?または、私が見ない本当の落とし穴がありますか?
解決
悪用されるツールと考える人もいます。 「Option Strict Off」のようにおよび「エラー時の次の再開」 VBでは、「純粋な」 C#やJavaのような言語にはなかった。
「var」についても同じことが言えます。キーワードですが、VBの「Variant」と同じではないことが理解されると、悪用されることはありません
怠zyな開発者がクラスの型チェックを望まず、「if blah is Blah ...」と書く代わりに、動的呼び出しをキャッチしようとする場所で悪用される可能性があります。
個人的には this のような状況で適切に使用できると思う私が答えた質問。
その力を本当に理解しているのは、動的な.NET言語に深く関わっている人たちだと思います。
他のヒント
この機能に対して人々が表現している多くの嫌悪感は、「これは悪い開発者が悪いコードを書くことを可能にするため、これは悪い言語機能です」と結論付けられると思います。考えてみると、そのロジックにより、すべての言語機能は悪いです。
ある天才が On Error Resume Next
というプレフィックスを付けたVBコードのブロックに遭遇したとき、私が呪ったのはVBではありません。たぶん私はすべきだと思う。しかし、私の経験では、ヒューズボックスにペニーを入れることに決めた人が道を見つけるでしょう。あなたが彼のポケットを空にしても、彼は彼自身の小銭を作ります。
私は、C#とPythonの間で相互運用するより便利な方法を楽しみにしています。これを行うコードをどんどん書いています。 dynamic
キーワードはその特定のユースケースにはすぐに届きません。なぜなら、それを行う現在の方法は、会議のために西に旅行している1950年代のソビエト学者のように感じるからです。 :出発する前に膨大な量のルールと書類があり、私がそこにいる間ずっと誰かが私を見ていて、そこにいる間に拾ったもののほとんどが奪われます私が戻ったときに国境で私。
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;
}
最初のものは、静的な型情報、コンパイル時のチェック、自己文書化、型推論がないため、呼び出しサイトで動的参照を使用して結果を保存する必要があり、より多くの型損失が発生します、そしてこのすべてがスパイラルダウンします。
すでに動的を恐れ始めています。
編集:危険は過ぎ去りました(Phew!)...そして、ダイナミックは結局悪用されませんでした、3年後に私を下票する必要はありません:)
本当の落とし穴?ドキュメントの深刻な不足。アプリケーションのアーキテクチャ全体は、それを書いた人の心の中にあります。少なくともストロングタイピングでは、クラス定義を介してオブジェクトの動作を確認できます。動的型付けでは、せいぜいその使用から意味を推測する必要があります。最悪の場合、オブジェクトとは何のアイデアもありません。 JavaScriptですべてをプログラミングするようなものです。 ACK!
人々が dynamic
で良いIntelliSenseを取得できないことに気付いた場合、 dynamic
-happyから dynamic
に戻ります。 -when-necessary-and- var
-at-all-other-times。
dynamic
の目的は次のとおりです。COM/ C ++やDLR / IronPython / IronRubyなどの動的言語およびプラットフォームとの相互運用性。 IDynamicObject
をすべて実装することで、C#自体をIronSmalltalkWithBracesに変換します。
すべての人が楽しい時間を過ごします。 (他の誰かが書いたコードを維持する必要がない限り。)
これは一種の公共カメラについて話し合うようなもので、誤用される可能性があり、誤用される可能性がありますが、それらを持つことには利点もあります。
「動的」を禁止できない理由はありません。必要ない場合は、独自のコーディングガイドラインのキーワードを使用してください。だから問題は何ですか?つまり、「ダイナミック」で狂ったことをしたいのならキーワードとふりをするC#はJavaScriptのミュータントのいとこです。これらの実験を私のコードベースから遠ざけてください。 ;)
FUD。パンをスライスして以来最高のことかもしれませんが、VBやJavaScriptなどで経験したことはすべて、C#が動的バインディングを持っていることを知って悪寒をもたらします。近い将来、合理的にそれを見て、動的言語との相互運用性を実現するためにその新しい機能がどれほど良いものになるかを知ることができることを知っています。しかし、しばらく時間がかかります。私は人間です:-)
動的にメソッドを呼び出す現在の方法に欠陥がある理由はわかりません:
それを行うには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);
}
}