C#はちょうど私がこのような文字列のインデックスの文字列戻りませんなぜ私は思ったんだけど:文字列をインデックスするときにC#がCharオブジェクトを返すのはなぜですか?
string x = "xyz";
var c = x[0]
C#はちょうど私がこのような文字列のインデックスの文字列戻りませんなぜ私は思ったんだけど:文字列をインデックスするときにC#がCharオブジェクトを返すのはなぜですか?
string x = "xyz";
var c = x[0]
文字列が文字で構成されています。単一の要素にアクセスする場合は、インデックス演算子を使用しているときに、なぜ文字列を返す必要がありますか?
文字列を返す場合は、Substringを使用します。
文字列は、charの配列を初期化するためのクラスです。したがって、あるインデックスで要素を取得しようとすると、charが返されます。 文字列クラスを確認してください
文字列クラスの宣言も参照してください。
public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string>
これはIEnumerable<char>
によって継承されます。
文字列クラスの内部には、インデックスが渡されたときにcharを返すgetプロパティがあります。画像を参照してください。これは明らかに、現在の可能System.Stringに指定された位置でのSystem.Charオブジェクトを取得しますと言っている私は本当に答え、返すのが自然だったことを示すコメントに同意しない
public char this[int index] { get; }
a char
。そして、いや、C#で文字列が定義によってchar
のない配列である(first answer to the duplicateを参照してください、それはそれ自身のクラスである。
char
が返された唯一の理由は、C#のチームはそれを実装することを決めたということですC/C++の開発者がC/C++の後継者であることがこの実装の理由であると想像しています。
私はめったにchar
型をC#で使用していません。文字列の実装では、文字列を返すインデクサーでうまくいくと思います(おそらくGetCharAt()
メソッド)、他の人はなぜそれがそのように実装されているのか疑問に思うかもしれません。 MSDNによる
好奇心のために、 'myString [i]'が返されるのはどういう意味ですか?別の文字列ですか?整数は多分意味をなさないかもしれませんが、むしろ使い方が難しいでしょう。 @Sacketが述べたように、文字列クラスは 'IEnumerable
はいです。実際の実装を見ると、すべてがexternとunsafeとしてマークされ、ポインタはどこでも使用されます。これは、charのネイティブ構造に対するクラスであるためです。 string.Compareもどのように機能するかを見て、それは、のIntPtrハンドル( '[SecurityCritical、SuppressUnmanagedCodeSecurity] \t \t [DLLIMPORT( "QCall"、のCharSet = CharSet.Unicode)] \t \tプライベート静的にextern int型のInternalCompareStringへのIntPtr handleOriginを沸騰ダウン、文字列localeName、文字列string1、int offset1、int length1、文字列string2、int offset2、int length2、intフラグ); 'これは、CLRではchar比較によってcharを行います。 – Dispersia
@JeremyKato 'IEnumerable
文字列が文字で構成されているため – Plutonix
なぜでしょうか?単一の文字のためにヒープ上にオブジェクトを作成するのはなぜですか?文字列が必要な場合は、いつでも変換できます。 –
注意深く見てみると、1文字の文字列をインデックスで返す言語では、最初に「JavaScript」、「Python」などの「char」型はありません。 –