string対Stringはスタイルの議論ではありません
[...]
キーワードstringはC#では具体的な意味を持っています。System.Stringコアランタイムアセンブリに存在するタイプです。ランタイムは本質的にこのタイプを理解し、開発者が.NETの文字列に期待する機能を提供します。その存在はC#にとって非常に重要であり、その型が存在しない場合、コンパイラーはコード行の解析さえ試みる前に終了します。したがってstring、C#コードでは正確で明確な意味があります。
Stringただし、C#では識別子は具体的な意味を持ちません。それはように、すべての名前のルックアップのルールを通過する識別子でありWidget、Studentそれは文字列に結合することができるか、それが別のアセンブリ完全にその目的とは全く異なるかもしれタイプに特異的に結合することができ、等... string。さらに悪いことに、次のようなコードで定義できますString s = "hello"。コンパイルし続けました。
class TricksterString {
void Example() {
String s = "Hello World"; // Okay but probably not what you expect.
}
}
class String {
public static implicit operator String(string s) => null;
}
の実際の意味は、String常に名前解決に依存します。つまり、プロジェクト内のすべてのソースファイルと、参照されるすべてのアセンブリで定義されているすべてのタイプに依存します。要するに、それが何を意味するのかを知るにはかなりのコンテキストが必要です。
真の例大多数であることStringとstring同じタイプにバインドします。しかし、Stringまだ使用するということは、開発者が正しい答えが1つしかない場所でプログラムを解釈に任せることを意味します。場合はString、間違った型に結合しないことは、コンパイラチームにバグを提出し、一般的に使用して保存されていたかもしれない時間を無駄、時間のデバッグ開発者を残すことができますstring。
違いを視覚化する別の方法は、このサンプルを使用することです。
string s1 = 42; // Errors 100% of the time
String s2 = 42; // Might error, might not, depends on the code
多くの人は、これは情報Stringですが、コードベースがこの名前のタイプを定義することは非常にまれであるため、技術的に正確な使用でも問題ないと主張します。または、Stringそれが定義されている場合、それは悪いコードベースの兆候です。
[...]
あなたはそれが表示されますStringこれらのライブラリのいずれかのために...など反射ヘルパー、シリアライズライブラリ、レクサー、プロトコル、:完全に有効ないくつかの目的のために定義されたString対stringのコードが使用されている場所に応じて、実際の結果があります。
ですから、Stringvs。のstring議論を見るとき、これはスタイルではなく、意味論についてです。文字列を選択すると、コードベースに明確な意味が与えられます。選択Stringは間違いではありませんが、将来の驚きに備えてドアを開いたままにしています。
stringである字句のC#の構文文法一方System.Stringだけのタイプです。仕様に明記されている明示的な違いに関係なく、あいまいさを伴う可能性のあるこの暗黙の違いはまだあります。言語自体はstring、実装が(完全に)BCLの特定のクラスを検討する義務がない(まったく)ない方法でサポートする必要があります。