22

プロパティ名を表現するためにマジックストリングを使用する必要があるC#コードを頻繁に記述します。誰もがマジックストリングの問題を知っています。それらはリファクタリングが非常に難しく、コンパイル時のチェックがなく、多くの場合、診断が難しい問題につながります。それでも、C#/。NETは、プロパティ/クラス/メソッド名を表すために、あらゆる場所でそれらを使用します。

この問題は何年にもわたって続いており、現在実行可能な唯一の解決策は、実行時にプロパティ名を解析する式ツリーを使用することです。これにより、コンパイル時のチェックを十分に行うことができますが、コードが複雑になり(Expression型のパラメーターが必要)、実行時のコストが発生します。

この広範な問題を克服するためにコンパイル時の反映を追加するためにC#/。NETの機能に関する考慮事項があったかどうかを誰かが知っていますか?

簡単に追加できるようで、重大な変更ではなく、多くの開発者に大きなメリットがあります。typeof()演算子は、コンパイル時のリフレクションの形式をすでに実行しているため、演算子nameof()(または同様のもの)は非常に補完的であるように思われます。

さらに、そのような機能の潜在的な問題を知っている人はいますか?

助けてくれてありがとう。

4

4 に答える 4

14

ソースから直接-これはC#言語デザイナーによるブログ投稿です。この投稿の「ユーザー」はあなたと同じ質問をして回答します。著者は、要求したいすべてのメタデータ項目の構文を指定する必要があり、それは些細なことではないと言います。「info-of」メソッドが必要で、メソッドがオーバーロードされている場合、どのオーバーロードが必要ですか?ジェネリックスと明示的なインターフェイスの実装が関係している場合はどうなりますか?等々。これらの理由により、2009年に実装する価値はないと見なされていましたが、2015年にはC#6で実装される予定です。 2014年7月9日のC#言語設計ノートを参照してください。

于 2012-02-17T20:47:54.213 に答える
13

C#6.0では、nameofコンパイル時にプロパティ、クラス、フィールド、イベント、および変数の名前を取得できる新しい演算子、が追加されています。

デザインノートへのリンク

コンパイラが設計時にすでに知っている情報を反映する必要はもうありません。

于 2015-01-30T21:00:18.777 に答える
7

私も同様の問題を抱えていました。発信者情報属性.NET Framework 4.5 と呼ばれる機能があることが最近発見されました。これらを使用することにより、コンパイル時にメソッドの呼び出し元に関する情報を取得できます。ソースコードのファイルパス、ソースコードの行番号、発信者のメンバー名を取得できます。

public void DoProcessing()
{
    TraceMessage("Something happened.");
}

public void TraceMessage(string message,
        [CallerMemberName] string memberName = "",
        [CallerFilePath] string sourceFilePath = "",
        [CallerLineNumber] int sourceLineNumber = 0)
{
    Trace.WriteLine("message: " + message);
    Trace.WriteLine("member name: " + memberName);
    Trace.WriteLine("source file path: " + sourceFilePath);
    Trace.WriteLine("source line number: " + sourceLineNumber);
}
于 2015-01-29T14:54:17.467 に答える
0

それでも、C#/。NETは、プロパティ/クラス/メソッド名を表すために、あらゆる場所でそれらを使用します。

まず最初に:私は同意しません。いたるところにマジックストリングを使用する特定のフレームワーク(WebFormsなど)がありますが、C#および.NETのベースライブラリは、そのようなことを非常にうまく回避する傾向があります。

第二に:マジックストリングが使用される多くの場合、ReSharperはエラーを認識できます。これはかなり役に立ちます。

最後に:あなたが求めていることは、「サービスとしてのコンパイル」を提供することを約束するRoslynコンパイラを介して可能かもしれません。

于 2012-02-17T20:57:11.163 に答える