2016-03-22 16 views
0

参照型メンバ(私の場合は文字列)を持つ値型をコピーすると、CLRはシャローコピー(book)を行います。だから私はちょうど実験するために小さなプログラムを書いたが、期待される結果を得ることはできない。私はここでいくつかの詳細が不足していると確信しています。参照型をメンバに持つ値型をコピーする

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Console.WriteLine("First Example"); 
     //first example 
     Point p1 = new Point(); 
     p1.Name = "firstPoint"; 
     p1.X = 10; 
     p1.Y = 20; 

     Point p2 = p1; 

     p2.Name = "secondPoint"; 
     p2.X = 40; 
     p2.Y = 50; 

     p1.Print(); //Prints - Name: firstPoint, X:10, Y:20 
        //Expected - Name: secondPoint, X:10, Y:20 
     p2.Print(); //Prints - Name: secondPoint, X:40, Y:50 

     Console.ReadLine(); 
    } 
} 

public struct Point 
{ 
    public string Name; 
    public int X; 
    public int Y; 

    public void Print() 
    { 
     Console.WriteLine("Name: {0}, X: {1}, Y: {2}", this.Name.ToString(), this.X, this.Y); 
    } 
} 
+0

Nameは参照型であり、p2によって変更されたため、p1.Print()は 'Name:secondPoint、X:40、Y:50'を出力することを期待しています。 – vabii

+0

@VaibhavGathibandhe古いオブジェクトp1が古い参照に固執し、新しい参照がp2オブジェクトに割り当てられるように、参照自体を変更しています。 –

+0

@Jenish ...ありがとう、完璧な意味がある。 – vabii

答えて

1

それはその代わりに、あなたが確認し、その周りに再生するために、その参照型のメンバーを変更してみてくださいそのように振る舞ってあなたはあなたの全体の参照型を変更しました。

は、参照用コード下記参照:

public class Program 
{ 
    public static void Main() 
    { 
     Console.WriteLine("First Example"); 
     //first example 
     Point p1 = new Point(); 
     p1.store = new SomeClass(); 
     p1.store.Name = "Jenish"; 
     p1.Name = "firstPoint"; 
     p1.X = 10; 
     p1.Y = 20; 

     Point p2 = p1; 

     p2.Name = "secondPoint"; 
     p2.store.Name = "Jenish2"; 
     p2.X = 40; 
     p2.Y = 50; 

     p1.Print(); //Prints - Name: firstPoint, X:10, Y:20 
     p2.Print(); //Prints - Name: secondPoint, X:40, Y:50 

     Console.ReadLine(); 
    } 
} 

public struct Point 
{ 

    public string Name; 
    public int X; 
    public int Y; 
    public SomeClass store; 

    public void Print() 
    { 
     Console.WriteLine("Name: {0}, X: {1}, Y: {2}, Name: {3}", this.Name.ToString(), this.X, this.Y, this.store.Name); 
    } 
} 

public class SomeClass{ 
    public string Name {get; set;} 
} 

出力

第1実施例

名:firstPoint、X 10、Y 20、名称:Jenish2

名前:secondPoint、X:40、Y:50、名前:Jenish2

ここにはfiddleがあります。

以下の例は、参照型全体を変更した場合の動作を示しています。

public class Program 
{ 
    public static void Main() 
    { 
     Console.WriteLine("First Example"); 
     //first example 
     Point p1 = new Point(); 
     p1.store = new SomeClass(); 
     p1.store.Name = "Jenish"; 
     p1.Name = "firstPoint"; 
     p1.X = 10; 
     p1.Y = 20; 

     Point p2 = p1; 

     p2.Name = "secondPoint"; 
     p2.store = new SomeClass(); 
     p2.store.Name = "Jenish2"; 
     p2.X = 40; 
     p2.Y = 50; 

     p1.Print(); //Prints - Name: firstPoint, X:10, Y:20 
     p2.Print(); //Prints - Name: secondPoint, X:40, Y:50 

     Console.ReadLine(); 
    } 
} 

public struct Point 
{ 

    public string Name; 
    public int X; 
    public int Y; 
    public SomeClass store; 

    public void Print() 
    { 
     Console.WriteLine("Name: {0}, X: {1}, Y: {2}, Name: {3}", this.Name.ToString(), this.X, this.Y, this.store.Name); 
    } 
} 

public class SomeClass{ 
    public string Name {get; set;} 
} 

:名前がオブジェクトの両方で異なっています。

ここでは、2番目の例ではfiddleです。

+0

OPが提供するサンプルには 'string'は特別なものはありません。 'p2.store'を' SomeClass'の新しいインスタンスに設定すると、 'p2.Name'を文字列の新しいインスタンスに設定するのと同じように動作します。 –

+0

@AlexeiLevenkovあなたは正しいです。 –

関連する問題