2011-06-22 10 views
2

インデックス値で文字列の新しい値を設定する方法は?なぜ文字列[0] = "新しい値"はコンパイルされませんか?

私が試した:

string a = "abc"; 
a[0] = "A"; 

stringsのために動作しますが、そうcharsのためではありません。どうして?

+1

文字列は不変ですが、 'a [0]'は 'char'参照を返し、二重引用符で文字列を割り当てようとしているので、一重引用符でなければなりません。しかし、一重引用符を使用しても機能しません:) –

答えて

14

列(あたりとして機能することができますおよびベースクラスライブラリでSystem.Stringを使用するその他の.NET言語)は、immu表。つまり、文字ごとに文字列を変更することはできません(文字列を変更することもできます)。

インデックスに基づいて文字列を変更する場合は、最初にSystem.String.ToCharArray()を使用して配列に変換する必要があります。 System.Stringのコンストラクタを使って文字列に変換し、変更した配列を渡します。

あなたの例では、見えるように変更しなければなりません:

string a = "abc"; 
char[] array = a.ToCharArray(); 
array[0] = 'A'; //Note single quotes, not double quotes 
a = new string(array); 
+0

StringBuilderもこの目的に役に立ちます。 – supercat

+0

@supercat:私はそれに精通していません。 upvotedすることができるように別の答えとして投稿することはできますか? –

1

文字の[0]は、値を割り当てることができるメモリ内のアドレスです。

文字列はクラスです。この場合、a [0]は実際にオーバーロードされたoperator []への関数呼び出しです。関数に値を代入することはできません。

+1

'[]'演算子の結果に値を代入できるのは、読み取り専用ではないと定義されている場合です。 ( 'System.String'はそれを読み込み専用に定義していますが、例えば' System.Collections.Generic.List'はそうではありません) –

3

置換はこのようになります:

string a = "abc"; 
a = a.Remove(0, 1); 
a = a.Insert(0, "A"); 

またはCのため言う:

string a = "abc"; 
a = a.Remove(2, 1); 
a = a.Insert(2, "C"); 

はまたのStringBuilderを使用してC#でhttp://msdn.microsoft.com/en-us/library/362314fe.aspx

StringBuilder sb = new StringBuilder("abc"); 
sb[0] = 'A'; 
sb[2] = 'C'; 
string str = sb.ToString(); 
+0

文字列は不変なので、 'a = a.Remove(...) ' –

+0

私はすでにやりました... –

+2

いいえ、あなたはしませんでした。 'Remove'はそれらのビットが削除された文字列のコピーを返します。それはあなたがそれを呼び出す文字列を変更しません。 –

5

System.Stringタイプは、インデックス(または任意の手段を介してで書き込みを許可していません - String変数の内容を変更するには、1つの必須に全く新しいStringへの参照と置き換えてください)。しかし、The System.Text.StringBuilder型は、インデックスによる書き込みを許可します。新しいSystem.Text.StringBuilderオブジェクトを作成し(オプションで文字列をコンストラクタに渡してもかまいません)、操作してからToStringメソッドを使用して文字列に変換し直すことができます。

+0

1. +1。 2.少し変更されました。ご同意いただけない場合は元に戻してください。 –

+0

@Billy ONeal:括弧内の注釈をさらに改訂しました。あなたの考えを教えてください。 (1)それがインスタンスメソッドである、(2)問題のインスタンスが文法上の前提である、(3)ToString関数は実際にはObjectの関数であるため、「ToStringメソッド」に関する言語を戻しました。 – supercat

+0

私には良いと思われる:) –

2

可変文字列が必要な場合は、StringBuilderを使用してください。 また、a [0]は1文字を表すことができ、 "A"は文字列オブジェクトです。これは不正です。

関連する問題