2016-07-20 11 views
0

C#はちょうど私がこのような文字列のインデックスの文字列戻りませんなぜ私は思ったんだけど:文字列をインデックスするときにC#がCharオブジェクトを返すのはなぜですか?

string x = "xyz"; 
var c = x[0] 
+11

文字列が文字で構成されているため – Plutonix

+2

なぜでしょうか?単一の文字のためにヒープ上にオブジェクトを作成するのはなぜですか?文字列が必要な場合は、いつでも変換できます。 –

+1

注意深く見てみると、1文字の文字列をインデックスで返す言語では、最初に「JavaScript」、「Python」などの「char」型はありません。 –

答えて

9

文字列が文字で構成されています。単一の要素にアクセスする場合は、インデックス演算子を使用しているときに、なぜ文字列を返す必要がありますか?

文字列を返す場合は、Substringを使用します。

3

文字列は、charの配列を初期化するためのクラスです。したがって、あるインデックスで要素を取得しようとすると、charが返されます。 文字列クラスを確認してくださいenter image description here

文字列クラスの宣言も参照してください。

public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string> 

これはIEnumerable<char>によって継承されます。

文字列クラスの内部には、インデックスが渡されたときにcharを返すgetプロパティがあります。画像を参照してください。これは明らかに、現在の可能System.Stringに指定された位置でのSystem.Charオブジェクトを取得しますと言っている私は本当に答え、返すのが自然だったことを示すコメントに同意しない

enter image description here

public char this[int index] { get; } 
1

a char。そして、いや、C#で文字列が定義によってcharない配列である(first answer to the duplicateを参照してください、それはそれ自身のクラスである。

charが返された唯一の理由は、C#のチームはそれを実装することを決めたということですC/C++の開発者がC/C++の後継者であることがこの実装の理由であると想像しています。

私はめったにchar型をC#で使用していません。文字列の実装では、文字列を返すインデクサーでうまくいくと思います(おそらくGetCharAt()メソッド)、他の人はなぜそれがそのように実装されているのか疑問に思うかもしれません。 MSDNによる

+0

好奇心のために、 'myString [i]'が返されるのはどういう意味ですか?別の文字列ですか?整数は多分意味をなさないかもしれませんが、むしろ使い方が難しいでしょう。 @Sacketが述べたように、文字列クラスは 'IEnumerable 'を実装しているので、 'char'の配列とは違って実装することを決めたとしても、インタフェースは単に' char'sで動作するように設計されています。 –

+3

はいです。実際の実装を見ると、すべてが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

+0

@JeremyKato 'IEnumerable 'はインデクサーがなく、インデクサーの戻り値の型に依存しません。 –

3

String

は、UTF-16コード単位のシーケンスとしてテキストを表します。

Char

UTF-16コード単位として文字を表します。

string(UTF-16コード単位のシーケンス)にあれば、あなたのインデックスは、あなたが(シングルUTF-16コード単位)charを得ることを自然に感じ。

関連する問題