2012-05-12 2 views
4
class Program 
{ 
    static void Main(string[] args) 
    { 
     A a = new A(); 
     a.print(); 

    } 
} 

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

class A 
{ 
    public void print() 
    { 
     Employee emp = new Employee { Name = "1" }; 
     Func2(emp); 

     Console.WriteLine(emp.Name); 
     Console.ReadLine(); 
    } 

    private void Func2(Employee e) 
    { 
     Employee e2 = new Employee { Name = "3" }; 
     e = e2; 

    } 

} 

После запуска программы Above, я получил ответ «1», который я не могу понять, КАК? Может кто-нибудь объяснить, ответ по мне должно быть «3» -СпасибоОбъясните вывод программы ниже?

Но когда я называю метод FUNC1, который определен ниже: -

private void Func1(Employee e) 
{ 
    e.Name = "2"; 
} 

я получаю «2» в качестве ответа. Теперь, если e был передан как тип значения, то как получилось, что он дал мне «2» в качестве ответа?

ответ

8

Вот бит, который получает вас о Func2:

private void Func2(Employee e) 
{ 
    Employee e2 = new Employee { Name = "3" }; 
    e = e2; 
} 

Employee является ссылочным типом (класс), но ссылки сам передаются по значению - это копия ссылки.

Затем вы присваиваете этой копии новую ссылку, но ссылка оригинала (которая была скопирована с) не изменилась. Следовательно, вы получаете 1.

Если вы передаете ссылку сам по ссылке, вы можете изменить его:

private void Func2(ref Employee e) 
{ 
    Employee e2 = new Employee { Name = "3" }; 
    e = e2; 
} 

выше будет производить 3, как вы ожидали.


Update, относительно ваш добавил Func1:

Ссылка является копией, но все еще указывает на объект же - вы меняете состояние этого объекта (установка Name собственности), а не основной ссылкой на объект.

2

Когда вы звоните Func2, он передает ссылку по значению. Присвоение e внутри метода не изменяет значение, хранящееся в emp, оно просто присваивает значение переменной локальной переменной e.

Если вы хотите перейти по ссылке, используйте ключевое слово ref.

Func2(ref emp); 

private void Func2(ref Employee e) 
{ 
    // etc... 
} 
0

В func2 вы создаете новый экземпляр сотрудника и присваиваете ему значение. Где, как и в func1, вы просто изменяете уже созданный экземпляр, и это изменение отражается обратно.

+0

Да, я создаю новый экземпляр в Func2, но после изменения свойства name я назначаю этот вновь созданный экземпляр уже созданному экземпляру, поэтому именно поэтому я думал, что он должен отражать –

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