Практическое руководство. Определение различия между передачей структуры и ссылки класса в метод (руководство по программированию в C#)

Обновлен: Ноябрь 2007

В этом примере показывается, что при передаче структуры в метод передается копия структуры, а при передаче экземпляра класса передается ссылка.

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

Пример

class TheClass
{
    public string willIChange;
}

struct TheStruct
{
    public string willIChange;
}

class TestClassAndStruct
{
    static void ClassTaker(TheClass c)
    {
        c.willIChange = "Changed";
    }

    static void StructTaker(TheStruct s)
    {
        s.willIChange = "Changed";
    }

    static void Main()
    {
        TheClass testClass = new TheClass();
        TheStruct testStruct = new TheStruct();

        testClass.willIChange = "Not Changed";
        testStruct.willIChange = "Not Changed";

        ClassTaker(testClass);
        StructTaker(testStruct);

        Console.WriteLine("Class field = {0}", testClass.willIChange);
        Console.WriteLine("Struct field = {0}", testStruct.willIChange);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    Class field = Changed
    Struct field = Not Changed
*/

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Классы (руководство по программированию на C#)

Структуры (Руководство по программированию на C#)

Передача параметров (Руководство по программированию в C#)