3

マルチスレッドやデッドロックなどを詳しく調べるのに忙しかったです。この本は疑似コードと C コードの両方を対象としており、Mutex ロックやモニターなどの実装を調べるのに忙しかったです。

これにより、次のことが思い浮かびました。C# や .NET では、物事を行うための構文糖衣がたくさんあります。たとえば(.NET 3.5):

lock(obj)
{
   body
}

以下と同一です:

var temp = obj;

Monitor.Enter(temp);

try 
{ 
   body 
}
finally 
{ 
   Monitor.Exit(temp); 
}

もちろん、コンストラクトなどの他の例もありますusing() {}。私の質問は、言語で「シンタックス シュガー」を使用するよりも、「独力で行って」文字通り物事を自分でコーディングする方が適切なのはいつですか? あなたがコーディングしている言語でより経験豊富な人々の方法ではなく、自分の方法を使用する必要がありますか?

以前は、マルチスレッドの問題や無限ループの問題を解決するためProcessに、ブロック内でオブジェクトを使用しないようにする必要があったことを思い出します。usingそこに using 構造がないことに、私はまだ汚いと感じています。

ありがとう、

カイル

4

4 に答える 4

11

可能な限りシンタックス シュガーに固執します。簡潔で、より保守しやすく、エラーが発生しにくく、よく理解されており、理由があって作成されました。

何かを手動で制御する必要がある場合 (たとえば、IEnumerator<T>を使用する代わりにan を操作する場合foreach)、はい、構文糖を捨てます。そうでなければ、慣用句であることは良いことです。

于 2010-05-14T05:37:47.113 に答える
7

ソフトウェア開発の最大のコストは、長期にわたるメンテナンスです。したがって、答えは常に、最も簡単で費用対効果の高いメンテナンス パスを提供することです (ルールを証明する可能性のあるすべての例外、たとえばパフォーマンス)。構文糖衣を使用してコードを読みやすくすることができる場合、構文糖衣が邪魔になる場合はそれを使用しないでください。

于 2010-05-14T05:36:25.847 に答える
2

C# では、この linq ステートメント:

var filteredCities =
    from city in cities
    where city.StartsWith("L") && city.Length < 15
    orderby city
    select city;

(および同等の) のシンタックス シュガーは次のとおりです。

var filteredCities =
  cities.Where(c => c.StartsWith("L") && c.Length < 15))
    .OrderBy(c => c)
    .Select(c => c); 

C# をよく知っている場合、後者のバージョンは前者よりもはるかに簡単に区別できます。ボンネットの下で何をしているのかを正確に見ることができます。

ただし、通常の日常的な使用では、ほとんどの人は、砂糖を入れたバージョンの方が見やすく、読みやすいと感じています.

于 2010-05-14T05:34:10.407 に答える
1

コンストラクトを使用できないというあなたの例はusing、.Net 言語とフレームワークで利用可能になった新しいアプローチからの私の最も一般的な逸脱です。IDisposable オブジェクトのスコープが 1 つの関数の少し外側にあるケースはたくさんあります。

ただし、これらのショートカットが何をするかを知ることは、これまでと同様に重要です。多くの人は、オブジェクトを でラップできない場合、オブジェクトを破棄しないと思います。オブジェクトがusing何をするのか、何が簡単になるのかを理解していないからです。

ですから、これらのすばらしいショートカットのいくつかについて、何か重要なことが起こっていることを示すツールチップのヘルプテキストのようなものがあればいいのにと思います。

編集:

using私はこれについて考えてきましたが、選択したのは誤解を招くキーワードにすぎないと私は信じていると判断しました。foreach私には、実際に何が起こっているのかを暗示しているわけではありusingません。誰でもこれについて何か考えがありますか?彼らのキーワードがdisposing代わりにあったとしたらどうでしょう。より明確になると思いますか?

于 2010-05-14T06:27:51.183 に答える