Поиск…


замечания

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

Используемые типы значений

Типы значений просто содержат значение .

Все типы значений производятся из класса System.ValueType , и это включает большинство встроенных типов.

При создании нового типа значения используется область памяти, называемая стеком .
Соответственно, стек будет расти по размеру объявленного типа. Так, например, int всегда будет выделено 32 бита памяти в стеке. Когда тип значения больше не находится в области видимости, пространство в стеке будет освобождено.

В приведенном ниже коде показано, что тип значения присваивается новой переменной. Структура используется как удобный способ создания пользовательского типа значений (класс System.ValueType не может быть иным образом расширен).

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

struct PersonAsValueType
{
    public string Name;
}

class Program
{
    static void Main()
    {
        PersonAsValueType personA;

        personA.Name = "Bob";

        var personB = personA;

        personA.Name = "Linda";

        Console.WriteLine(                // Outputs 'False' - because 
            object.ReferenceEquals(       // personA and personB are referencing 
                personA,                  // different areas of memory
                personB));                

        Console.WriteLine(personA.Name);  // Outputs 'Linda'
        Console.WriteLine(personB.Name);  // Outputs 'Bob'
    }
}

Используемые типы ссылок

Типы ссылок состоят как из ссылки на область памяти, так и из значения, хранящегося в этой области.
Это аналогично указателям на C / C ++.

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

Помимо пространства памяти, необходимого для самого экземпляра, требуется дополнительное пространство для хранения самой ссылки, а также дополнительная временная информация, требуемая .NET CLR.

В приведенном ниже коде показано, что ссылочный тип присваивается новой переменной. В этом случае мы используем класс, все классы являются ссылочными типами (даже если они статичны).

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

Последствия этого заключаются в том, что теперь у нас есть две ссылки на один и тот же объект.
Любые изменения значений внутри этого объекта будут отражаться обеими переменными.

class PersonAsReferenceType
{
    public string Name;
}

class Program
{
    static void Main()
    {
        PersonAsReferenceType personA;

        personA = new PersonAsReferenceType { Name = "Bob" };

        var personB = personA;

        personA.Name = "Linda";

        Console.WriteLine(               // Outputs 'True' - because
            object.ReferenceEquals(      // personA and personB are referencing 
                personA,                 // the *same* memory location
                personB));

        Console.WriteLine(personA.Name); // Outputs 'Linda'
        Console.WriteLine(personB.Name); // Outputs 'Linda'
    }


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow