Я понимаю теоретическую концепцию, согласно которой при присвоении одной переменной ссылочного типа другой копируется только ссылка, а не объект. присваивая одну переменную типа значения другой, объект копируется. Но я не могу заметить отличия в коде. Кто-нибудь любезно указал бы на разницу между следующими двумя блоками кода? Спасибо!

НАЗНАЧЕНИЕ РЕФЕРЕНТНОГО ТИПА

using System;

class Employee
{
    private string m_name;

    public string Name
    {
        get { return m_name; }
        set { m_name = value; }
    }
}

class Program
{
    static void Main()
    {
        Employee joe = new Employee();
        joe.Name = "Joe";

        Employee bob = new Employee();
        bob.Name = "Bob";

        Console.WriteLine("Original Employee Values:");
        Console.WriteLine("joe = " + joe.Name);
        Console.WriteLine("bob = " + bob.Name);

        // assign joe reference to bob variable
        bob = joe;

        Console.WriteLine();
        Console.WriteLine("Values After Reference Assignment:");
        Console.WriteLine("joe = " + joe.Name);
        Console.WriteLine("bob = " + bob.Name);

        joe.Name = "Bobbi Jo";

        Console.WriteLine();
        Console.WriteLine("Values After Changing One Instance:");
        Console.WriteLine("joe = " + joe.Name);
        Console.WriteLine("bob = " + bob.Name);

        Console.ReadKey();
    }
}

НАЗНАЧЕНИЕ ТИПА СТОИМОСТИ

using System;

struct Height
{
    private int m_inches;

    public int Inches
    {
        get { return m_inches; }
        set { m_inches = value; }
    }
}

class Program
{
    static void Main()
    {
        Height joe = new Height();
        joe.Inches = 71;

        Height bob = new Height();
        bob.Inches = 59;

        Console.WriteLine("Original Height
            Values:");
        Console.WriteLine("joe = " + joe.Inches);
        Console.WriteLine("bob = " + bob.Inches);

        // assign joe reference to bob variable
        bob = joe;

        Console.WriteLine();
        Console.WriteLine("Values After Value Assignment:");
        Console.WriteLine("joe = " + joe.Inches);
        Console.WriteLine("bob = " + bob.Inches);

        joe.Inches = 65;

        Console.WriteLine();
        Console.WriteLine("Values After Changing One Instance:");
        Console.WriteLine("joe = " + joe.Inches);
        Console.WriteLine("bob = " + bob.Inches);

        Console.ReadKey();
    }
}
c#
3
user133466 2 Авг 2009 в 23:46

5 ответов

Лучший ответ

Что ж, очевидная разница в том, что в примере с классом кажется, что и joe, и bob изменились в последней части на одно и то же значение.

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

Основное различие в коде заключается в том, какой тип вы используете, class или struct , который определяет, создаете ли вы ссылочный тип или тип значения.

4
Lasse V. Karlsen 2 Авг 2009 в 19:51

Один - это структура, а другой - класс. Это кажется слишком сложным примером, включающим не только различия в значениях и ссылках, но и различия между классами и структурами.

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

3
Spencer Ruport 2 Авг 2009 в 19:56

// Тип ссылки

        StringBuilder sb1 = new StringBuilder();
        StringBuilder sb2 = new StringBuilder();
        sb2 = sb1;
        sb1.Append("hello");
        sb1.Append("world");
        Console.WriteLine(sb2);
        // Output Hello World


        // value Type
        int x=100;            
        int y = x;
        x = 30;            
        Console.WriteLine(y);

        // Out put 100 instead of 30
2
pratik 31 Авг 2011 в 13:45

Первый фрагмент кода содержит Employee, который является классом , а во втором Employee - структура .

1
Victor Hurdugaci 2 Авг 2009 в 19:52

В моей системе эти два блока кода дают следующий результат:

Исходные ценности сотрудников:

joe = Joe
bob = Bob

Values After Reference Assignment:
joe = Joe
bob = Joe

Values After Changing One Instance:
joe = Bobbi Jo
bob = Bobbi Jo

...и...

Original Height            Values:
joe = 71
bob = 59

Values After            Value Assignment:
joe = 71
bob = 71

Values After            Changing One Instance:
joe = 65
bob = 71

Разница кажется очевидной. В первом примере изменение одного из значений влияет на обе ссылки, поскольку они обе ссылаются на один и тот же базовый объект. Во втором примере изменение одного из объектов влияет только на этот объект, поскольку при копировании типов значений каждый объект получает свою собственную частную копию. Когда вы говорите bob = joe; во втором примере вы не назначаете ссылку (комментарий вводит в заблуждение). Вы создаете новый экземпляр структуры Height, копируете все значения из joe и сохраняете новый объект как bob.

1
Tim Long 2 Авг 2009 в 20:07