なぜ誰かがするのでしょうか:
const object useless = null;
const IEnumerable meaningless = null;
Eric Lippert は、機能はデフォルトでは実装されておらず、すべての可能性がテスト、保守などにさらに労力を加えると述べています...参照型の null 値が定数として必要になるのはなぜですか?
なぜ誰かがするのでしょうか:
const object useless = null;
const IEnumerable meaningless = null;
Eric Lippert は、機能はデフォルトでは実装されておらず、すべての可能性がテスト、保守などにさらに労力を加えると述べています...参照型の null 値が定数として必要になるのはなぜですか?
Eric Lippert は、機能はデフォルトでは実装されておらず、すべての可能性がテスト、保守などにさらに労力を加えると述べています...参照型の null 値が定数として必要になるのはなぜですか?
const
「その型の非 null コンパイル時リテラルがある場合、任意のインスタンス フィールドを const としてマークできる」という機能を実装するよりも、「任意のインスタンス フィールドを としてマークできる」という機能を実装する方が簡単でした。
あなたは本質的に、「そのタイプの非nullコンパイル時リテラルがないかのようにフィールドをマークすることはできません」という機能を追加することを提案しています。const
その機能はデフォルトでは実装されておらず、追加された場合、テスト、保守などにより多くの労力がかかります。
ほとんどの場合、ノーと言います。
そのような有用なものを見ることができる唯一のケースは、プリプロセッサ条件内です。例えば:
#if DEBUG
const Object obj = "Debug text";
#else
const Object obj = null;
#endif
null
これは、通常とは異なる (またはそれに加えて) 特別な意味を持つ (通常は再帰的な) データ構造に対して意味があります。
たとえば、実装されたセット wherenull
は空のセットを意味します。セットを二分探索木の連結リストとして実装することは、当然のことです。その場合、定義const Set Empty = null
することはある程度意味があります。多くの場合、演算子のオーバーロードの悪用や、豊富な静的メソッドと一緒に見られます。
このプラクティスは、理論的なコンピューター サイエンスでよく使用される規則と一致しており、理論が実践に漏れているように見える可能性があります。
それが良いこと(tm)であるかどうかは別の問題ですが、実際に起こります。
「特別な」エンティティが「ループの終了」操作として使用される、非常に一般的なセンチネル値パターンがあります。以下は、そのようなコードの妥当な定数であることがわかります (明らかに、サンプルは非常に不自然であり、センチネルに依存する実際のアルゴリズムがあることに注意してください)。
const Item ItemLookpupSentinel = null;
Item Serach(IEnumerable<Item> items)
{
var sequenceWithSentinel =
items.Concat(Enumerable.Repeat(ItemLookpupSentinel, 1));
foreach(var item in sequenceWithSentinel )
{
if (item == ItemLookpupSentinel)
return null;
}
}
null を const として扱えるようにしたい理由の 1 つは、省略可能な引数 (参照型の場合) をデフォルトで null に指定できるようにするためです。これは正当な機能ではありませんが (既定のパラメーターは C# 1.0 には存在しませんでした)、参照型を (一貫性のために) const として宣言できるようにすることを支持するポイントです。