2016-08-26 3 views
1

У меня есть следующий пример.В чем проблема с назначением ссылочных типов

namespace sample 
{ 
    public class Customer 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Customer C1 = new Customer(); 
      C1.ID = 100; 
      C1.Name = "Mary"; 

      Customer C2 = C1; 

      C2.Name = "Sandra"; 

      Console.WriteLine("C1.Name ={0} && C2.Name = {1}", C1.Name, C2.Name); 

     } 
    } 
} 

Почему значение C1 изменяется, когда я назначаю новое значение C2. Поэтому в итоге я получаю следующий результат: C1.Name = Sandra & & C2.Name = Sandra

+0

[Read] (http://stackoverflow.com/a/5057284/6695970) Объяснение Джону Скиту о том, как работают ссылочные типы. –

ответ

2

Потому что они оба являются ссылками на один и тот же объект!

Противоположный будет:

 Customer C1 = new Customer(); 
     C1.ID = 100; 
     C1.Name = "Mary"; 

     // New instance stored on C2 reference 
     // so now both are different references to also 
     // different objects 
     Customer C2 = new Customer(); 

     C2.Name = "Sandra"; 
0

C1 и C2 оба ссылки в одном экземпляре Customer.

C2.Name = "Sandra"; изменяет имя этого клиента с помощью ссылки C2

You могли изменения Customer к значения типа, сделав его struct, а не class, или использовать синтаксис Customer C2 = new Customer(); для создания новый Customer объект.

0

Явление, которое вы наблюдаете, называется aliasing. Вы создали ссылки C1 и C2. Однако они не относятся к разным объектам, но к одному объекту, а именно к объекту, созданному вызовом конструктора new Customer(). Видимо, вы ожидаете заявление

Customer C2 = C1; 

создать новый объект клиента который затем получает назначенный то же значение, как C1. Это не так - вы создаете новую ссылку с именем C2, которая ссылается на тот же объект, что и C1.

Смежные вопросы