2009-02-24 12 views
11

したがって、私はかなりのを得られなかったメソッドの中でラムダ式または匿名メソッドを書くたびに、アプリケーションまたはユニットテストフレームワーク全体を再コンパイルして再起動しなければなりません。これは真剣に迷惑で、私は最初にこれらの構造を使って救ったよりも多くの時間を無駄にします。リンクとラムダが私の好きなC#の機能の中にあっても、私ができるならば、私はそれらから離れようとするのはとても悪いことです。デバッガで匿名メソッドを含むメソッドを編集できないのはなぜですか?

なぜこのような理由で良い技術的理由があると思いますが、おそらく誰かが知っていますか?さらに、VS2010で修正されるかどうかは誰にも分かりますか?

ありがとうございました。

答えて

14

はい、これを行うことができない理由は非常にあります。単純な理由はコストです。 C#(またはVB)でこの機能を有効にするコストはで、極端にはです。

ラムダ関数の編集は、現在のENC(Edit'n'Continue)アーキテクチャでは解決が難しいENC問題のクラスの特定のケースです。

をクラスの形

  • 編集にメタデータを生成またはジェネリックメソッドを生成します - :つまり、それはENCは、次のいずれかんのいずれかの方法ENCには非常に困難です最初の問題は論理的な制約ではありますが、ENCアーキテクチャでは2つの制限があります。つまり、問題は最初のクラスを生成することは非常に困難ではありません。 2回目の編集後にクラスを生成するのは面倒です。 ENCエンジンは、ライブコードだけでなく生成されたクラスについてもシンボルテーブルの追跡を開始する必要があります。通常これはそれほど悪くはありませんが、生成されたクラスの形状が使用されているコンテキストに基づいている場合(Closureのためにlambdasの場合のように)、これはますます困難になります。さらに重要なことは、プロセスで既に生存しているクラスのインスタンスとの違いをどのように解決するかです。

    第2の問題は、CLR ENCアーキテクチャの厳しい制限です。これを回避するためにC#(またはVB)ができることは何もありません。

    Lambdasは残念ながら、これらの問題の両方で死んでしまった。短いバージョンでは、ラムダのENC'ingは既存のクラス(他のENCから生成されているかもしれないし、そうでないかもしれない)に多くの突然変異を含む。大きな問題は、現在のプロセス空間で新しいコードと既存のクロージャー・インスタンスとの違いを解決することにあります。また、ラムダはジェネリックスを他のコードよりも多く使用し、第2のヒットとなる傾向があります。

    詳細はかなり毛深く、普通のSOの答えにはあまりにも関わっています。私は主題に関する長いブログ投稿を書くことを考えました。私がそれに取り掛かると、私はこの特定の答えに戻ってリンクします。

  • +1

    馬の口から真っ直ぐに。 +1 –

    +0

    @Jon私たちはこの件に関して多くの社内会議を開催しています。私はこのプレゼンテーションを何度も伝えなければなりませんでした。私は本当に件名に完全な吹き飛ばされた文書を書く必要があります。ブログはそれのための良い場所のように思える。これがVSの将来のバージョンで解決されることが期待されています。 – JaredPar

    +1

    それについてのブログを書いてください。 – Eyvind

    0

    単体テストの再起動には数秒かかる場合があります。私は決して "編集と継続"モデルが正直であるとは思っていませんでした。実行の途中で変更が以前に実行されたコードに影響を与えた場合に備えて、常にスクラッチIMOから再実行する必要があります。そのことを考えると、素早く回帰することができる単体テストを使用する方が良いでしょう。個々の単体テストが耐え難いほどの時間を要する場合は、アドレッシングを検討する必要があります。

    EDIT:それがうまくいかない理由として、いくつかのラムダでは動作するが、他のラムダでは動作しないことがあります。任意の変数(thisを含む)を取得しないラムダ式は、プライベート静的変数にキャッシュされるため、デリゲートのインスタンスは1つしか作成されません。コードを変更するということは、その変数を再初期化することで、私が疑う興味深い副作用を持つ可能性があることを意味します。

    +0

    私は同意しますが、質問に対する回答ではありません。 –

    +0

    私はあなたが答えを知っていることを知っていた;-) –

    +0

    IMO多くの質問に対する答えは、まず苦しい状況に陥るのを避けることです。 –

    1

    Supported Code Changesのリストによれば、既存のタイプにフィールドを追加することはできません。匿名メソッドは、奇妙な名前のクラス(kinda <>_c__DisplayClass1)にコンパイルされます。匿名メソッドの変更には、囲まれた変数のセットの変更(既存のクラスのフィールドを変更することを追加することは含まれません)が含まれていても、匿名メソッドを変更することは不可能です。

    +1

    この問題は、匿名メソッド自体を変更する必要はありません。匿名メソッドを含むメソッドを変更するだけで十分です.1つのスペースでも、それをオフにするには十分です... – Eyvind

    1

    それは、この機能が部分的にVBではなく、C#でサポートされていることを恥ビットである:、C#で同じ動作を実装 http://msdn.microsoft.com/en-us/library/bb385795.aspx

    は、ラムダ式を含む関数に対して80%で痛みのレベルを低減するであろうラムダ式やそれらに依存する式を変更する必要はなく、おそらく「モンスターコスト」ではありません。

    関連する問題