BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース C# 8:アサーションと自動テストのためのCaller Expression Attribute

C# 8:アサーションと自動テストのためのCaller Expression Attribute

原文(投稿日:2019/01/15)へのリンク

C#や他の.NET言語には、Caller Info属性と呼ばれる概念がある。パラメータに適用された場合、開発者は一致する引数を提供する責任を負わない。代わりに、コンパイラがその責任を負う。現在C#は、ファイル名/パス、行番号、呼び出し元のメソッドまたはプロパティの名前について、呼び出し元情報属性をサポートしている。Caller Expression Attributeの提案で、式がそのリストに追加される。

次のアサーションを検討する。

Assert.IsTrue(x - 7 > 0);
Assert.IsTrue(y - 3 > 0);

テストに失敗した場合、どのアサートがトリガーされたのかを判断するのは困難である。アサーションごとにメッセージを提供することもできるが、それは面倒であり、時代遅れになる可能性がある。表現そのものがキャプチャされれば、便利である。

public static void IsTrue(bool condition, [CallerArgumentExpression("condition")] string message = null);

この例では、開発者が明示的にメッセージを提供していない場合、コンパイラは条件引数に使用されているコードをすべて挿入する。基本的に、コンパイラはコードを次のように変換する。

Assert.IsTrue(x - 7 > 0, "x - 7 > 0");
Assert.IsTrue(y - 3 > 0, "x - 7 > 0");

提案された設計の下では、このキャプチャメカニズムは拡張メソッドでも機能する。

潜在的な問題

この設計に関して3つの問題が挙げられた。

nullまたはパラメータ名ではない文字列("notAParameterName"など)が指定された場合、コンパイラは空の文字列を渡します。

逆コンパイラの使い方を知っている人は、この属性でマークされたメソッドの呼び出しサイトでソースコードを見ることができるでしょう。これはクローズドソースソフトウェアにとっては望ましくない/予想外のことかもしれません。

機能自体の欠陥ではありませんが、問題となっているのは、現在bool値をとるだけのDebug.Assert APIが存在することです。メッセージを受け取るオーバーロードが、この属性でマークされているのが2番目のパラメーターでそれがオプションになっていても、コンパイラはオーバーロードによってメッセージなしのものを選択します。したがって、この機能を活用するにはメッセージなしのオーバーロードを削除する必要がある。この機能はバイナリ(ソースではない)の重大な変更になります。

ステータス

現在、Caller Expression AttributeはC# 8ロードマップにステータス 「Prototype」で表示されている。

この記事に星をつける

おすすめ度
スタイル

BT