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
のコードが使用されている場所に応じて、実際の結果があります。
ですから、String
vs。のstring
議論を見るとき、これはスタイルではなく、意味論についてです。文字列を選択すると、コードベースに明確な意味が与えられます。選択String
は間違いではありませんが、将来の驚きに備えてドアを開いたままにしています。
string
である字句のC#の構文文法一方System.String
だけのタイプです。仕様に明記されている明示的な違いに関係なく、あいまいさを伴う可能性のあるこの暗黙の違いはまだあります。言語自体はstring
、実装が(完全に)BCLの特定のクラスを検討する義務がない(まったく)ない方法でサポートする必要があります。