2009-03-09 5 views
13

は誰かが次のようにコーディング想像:C#コンパイラの拡張提案

string s = "SomeString"; 
s.ToUpper(); 

我々は、すべての返された文字列が全く処理されないため、上記の例では、「TOUPPER()」メソッドの呼び出しが無意味であることを知っています。しかし、多くの人が間違いを犯して、問題を解決するために時間を費やしています。「自分の変数の文字が大文字にならないのはなぜですか?

戻り値オブジェクトが処理されない場合にコンパイラエラーを発生させる "ToUpper()"メソッドに適用できる属性があった場合、それは素晴らしいことではありませんか?以下のような何か:

[MustHandleReturnValueAttribute] 
public string ToUpper() 
{ 
… 
} 

このコードは、ユーザーを正しくコンパイルするためには、このような戻り値に処理しなければならない場合:

string s = "SomeString"; 
string uppers = s.ToUpper(); 

を、私は、これはそれがクリスタルクリアあなたがしなければならないことになるだろうと思います戻り値を処理しないと、その関数を呼び出すときにというポイントがありません。

文字列の例の場合、これは大きな問題ではないかもしれませんが、私はこれが便利な理由について他のより有効な理由を考えることができます。

あなたはどう思いますか?

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

+0

私は前にそれをしました。+1 –

+0

@Rene:有効なポイント、+1 – Codex

答えて

8

副作用、戻り値、またはその両方のためのメソッドを呼び出しますか? 「純粋な」関数(効果を持たず、戻り値を計算する役割を果たす)は、記述するエラーの種類を排除するだけでなく、潜在的な最適化/分析を可能にするために注釈を付けるのに適しています。 5年後にはこれが起こるかもしれない。

(F#コンパイラを使用すると、暗黙的に戻り値を無視する任意の時間を警告することに注意してください。あなたが明示的にそれを無視したいときに「無視」関数を使用することができます。)

+0

コンパイラがより多くを最適化することができるので、 '純度'アノテーションの概念に一般化すると良いでしょう。 C++のconstキーワードに似ています。 – Thomas

+0

また、[純粋な]アノテーションを追加することで、人々が機能を呼び出す場所とその副作用を気にしないところで話す問題を解決できます。私はそれが著者が実際に得ていたものだと考えています。 – Mason

0

少なくともコンパイラ警告が役に立ちます。おそらく、C#4.0(Design-by-Contract)のようなものが追加されるでしょう。

+0

私はエラーを警告したいと思います。コードを一緒に投げているだけの場合は、たとえば、コードを実行できないようにする必要はありません。 – Andy

+0

契約による設計は、前提条件、事後条件および不変条件に関するものです。返される値の使用方法/使用方法に関する用語の設定について –

0

これは警告のために保証しません。またはプラグマ。結果を破棄することが意図されている場所が多すぎます。コンパイラから警告/エラーを得るのはかなり面倒です。

この種の「警告」は、IDEのエディタで、「警告:戻り値を破棄する」などの小さなアイコンのように注釈を付ける必要があります。

2

私はこれが好きであるとは確信していません。私はキャプチャしないことを選択した値を返すメソッドを多く呼び出しました。いくつかの型のデフォルトを追加すると(戻り値が処理されないときにコンパイラが警告を生成します)、私には間違っているようです。

私は、示唆された行に沿ったものが新しいプログラマーを助けるかもしれないが、ゲームのこの時点で属性を追加することは、大きな既存のボディーに対して非常に少数のメソッドにしか影響しないことに同意します。その同じジュニアプログラマは、未処理の戻り値の大部分がコンパイラによってフラグが立てられていないときに、この問題を回避することは決してありません。

馬が納屋の外に出たときに戻ってきたことがありましたか?

+0

属性を追加するのはちょっとですが、コンパイラが「コードには何の効果もありません」という警告が表示されない理由はわかりません。 –

+0

私の問題は、あなたが有効な構成をとり、警告を生成することです。はい、混乱させる可能性がありますが、返された値をキャプチャせずに常に値を返すメソッドを使用します。 – andleer

+0

bool DoStuff(){doStuff(); if(成功)がtrueを返します。偽を返します。 } DoStuff()を呼び出すときに、成功または失敗を気にしないことがあります。結果が返されたと思ってもチェックする必要はありません。他の時、確かに、私は気にするかもしれません。 – andleer

6

Resharperをお持ちの場合は、このようなことが強調表示されます。 Cantはresharperを十分に推奨しています。特に、リファクタリングの周りに便利なIDEがたくさんあります。

http://www.jetbrains.com/resharper/

1

実は[不変]としてフラグを構造体またはクラスの方法を好むだろう、これは不変オブジェクトにその戻り値を使用せずに呼び出されたメソッドのために(警告で)自動的に処理しています。これは、作成後の変更からコンパイラによってオブジェクトを保護することもできます。

オブジェクトが本当に不変オブジェクトである場合は、本当にそれを処理する方法はありません。また、他の一般的な間違いをキャッチするためにコンパイラによって使用される可能性もあります。

メソッド自体にタグを付けることは、私にとってはあまり役に立ちません。私はそれに関する他のコメントのほとんどに同意します。オブジェクトが変更可能な場合、メソッドを呼び出すことは他の副作用を伴う可能性がありますので、上記のコードは完全に有効です。

1

戻り値が無視されることを防ぐためにLintをシャットダウンすることができないため、すべてのprintf()呼び出しに(void)キャストを追加することに逆戻りしています。

しかし、この機能は、コンパイラ自体ではなく、いくつかのコードチェッカーツールにあるようです。

関連する問題