2011-12-27 3 views
0

クラスは参照型ですが、構造体は値型です。基本的にクラスであるときに、型のStringに対してrefを使用する必要があるのはなぜですか?

これは、クラスのタイプであるすべてのパラメータに対してrefを明示的に指定する必要はないことを意味します。

私の質問は、私たちは基本的にクラスの型である文字列型のため、REFキーワードを指定しなければならないのはなぜ

のですか?

文字列に固有ではありません

public partial class StringManupulation : Form 
{ 
    public StringManupulation() 
    { 
     InitializeComponent(); 

     String value = "Hello "; 

     Concatenate(value); 
     MessageBox.Show(value); 

     Concatenate(ref value); 
     MessageBox.Show(value); 
    } 

    /// <summary> 
    /// Does not work 
    /// </summary> 
    /// <param name="value"></param> 
    public void Concatenate(String value) 
    { 
     value = string.Concat(value, "StackOverflow"); 
    } 

    /// <summary> 
    /// Works! 
    /// </summary> 
    /// <param name="value"></param> 
    public void Concatenate(ref String value) 
    { 
     value = string.Concat(value, "StackOverflow"); 
    } 
} 
+3

System.Stringは不変であるためです。 – adatapost

答えて

3

System.Stringは不変です。つまり、割り当てられた文字列の内容を変更することはできません。 System.Stringクラスの代わりにSystem.Text.StringBuilder(可変オブジェクト)を試してみてください。深さのC#からの章 -

static void ParamTest(System.Text.StringBuilder paramSb) 
{ 
    paramSb.Append("World"); 
} 

static void Main() 
{ 
    System.Text.StringBuilder sb = new StringBuilder(); 
    sb.Append("Hello"); 

    ParamTest(sb); 
    Console.WriteLine(sb); 
} 

Strings in C# and .NETarticleを見てください。 Jon Skeet

の引用は、それが参照型ですか?

文字列が 値型であることはよくある誤解です。その不変性(次の点を参照してください)は、値型のようなact sortを にするためです。実際には、通常の 参照型のように機能します。値のタイプと参照の違いの詳細については、 のパラメータ渡しとメモリに関する記事を参照してください。 タイプ。

+0

+1 - 文字列が値型であり、サンプルを証明しているという誤解を明確にしてくれてありがとう。 – Karthik

6

以下の例を見つけてください、それは、任意のパラメータの場合です。パラメータで渡された変数を変更する場合は、参照渡しする必要があります。

値渡しの場合、渡された参照型のインスタンスの内容のみを変更できます。文字列には変更可能なコンテンツはありません。注意すべき

+0

疑問:**値渡しの場合、参照型の渡されたインスタンスの内容のみを変更できます。文字列に変更可能なコンテンツはありません。** _この行を理解することができますか?_ '私が理解したところでは、値渡しでクラスの内容が参照型になりました。私は間違っていますか? – Karthik

0

2つのこと:

  • 文字列.NETで不変です。通常の方法では、文字列インスタンスの内容を変更することはできません。
  • メソッドでの参照の再割り当てには、refが必要です。メソッド内の基になる参照を変更し、この変更を呼び出し元に表示させる場合は、refで渡す必要があります。
0

変数に新しい参照を割り当てるときは、refキーワードを使用する必要があります。

class A { 
    public string prop { get; set; } 
} 

public void test(A a) 
{ 
    a = new A(); // NO, it's a new ref 
    a.prop = "foo"; // Yes, you modify the object it's not a new ref. 
} 

public void test2(string s) 
{ 
    s = "bar"; // Equivalent to s = new String("bar"), so it's a new ref. 
} 
関連する問題