Explain the output of program below?

Refresh

December 2018

Views

168 time

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;

    }

}

After running the Above program, I got "1" as answer, which I'm not able to understand HOW? Can anyone explain, the answer according to me should be "3" -Thanks

But when I call Func1 method which is defined below:-

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

I get "2" as answer. Now if e was passed as Value type then how come it's giving me "2" as answer?

3 answers

0

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

2

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

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

Func2(ref emp);

private void Func2(ref Employee e)
{
    // etc... 
}
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, как вы ожидали.


Обновление, Что касается вашего добавил Func1:

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