Упражнение. Обнаружение ссылочных типов

Завершено

К ссылочным типам относятся массивы, классы и строки. Ссылочные типы обрабатываются по-разному от типов значений относительно способа хранения значений при выполнении приложения.

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

Отличие ссылочных типов от типов значений

Переменная типа значения хранит значения непосредственно в области хранилища, называемой стеком. Стек — это память, выделенная для кода, который выполняется центральным процессором в настоящее время (также называется кадром стека или кадром активации). Когда выполнение кадра стека завершается, значения в стеке удаляются.

Переменная ссылочного типа хранит значения в отдельном регионе памяти, называемом кучей. Куча — это область памяти, которая используется совместно приложениями, работающими в операционной системе одновременно. Среда выполнения .NET взаимодействует с операционной системой, чтобы определить доступные адреса памяти, и запрашивает адрес, по которому можно сохранить значение. Далее среда выполнения .NET сохраняет значение и возвращает адрес памяти переменной. Когда переменная используется в коде, среда выполнения .NET обращается по хранящемуся в переменной адресу и получает сохраненное значение.

Далее вы напишете код, иллюстрирующий эти идеи более четко.

Определение переменной ссылочного типа

  1. Удалите или используйте оператор // строковый комментарий, чтобы закомментировать весь код из предыдущих упражнений.

  2. Обновите код в редакторе Visual Studio Code следующим образом:

    int[] data;
    

    Предыдущий код определяет переменную, которая может содержать значение массива типов int .

    На этом этапе data — это просто переменная, которая может содержать ссылку на значение или его адрес в куче. Так как в настоящее время она не связана с адресом памяти, она называется пустой ссылкой.

  3. Создание экземпляра массива int с помощью new ключевое слово

    Обновите код в редакторе Visual Studio Code, чтобы создать и назначить новый экземпляр массива int , используя следующий код:

    int[] data;
    data = new int[3];
    

    Ключевое слово new сообщает среде выполнения .NET создать экземпляр массива, а затем координировать работу с операционной системой для хранения размера массива int для трех значений int в памяти. Среда выполнения .NET следует этим предписаниям и возвращает адрес нового массива int в памяти. Наконец, адрес памяти сохраняется в переменной. Элементы массива int по умолчанию имеют значение 0, поскольку это значение по умолчанию для типа int.

  4. Изменение примера кода для выполнения обеих операций в одной строке кода

    Как правило, две строки кода на предыдущем шаге сокращены до одной строки кода, чтобы объявить переменную и создать новый экземпляр массива int . Измените код из шага 3 следующим образом.

    int[] data = new int[3];
    
    

    Хотя нет выходных данных для наблюдения, надеюсь, это упражнение добавило ясность в том, как синтаксис C# относится к шагам процесса для работы с ссылочными типами.

Что отличается от типа данных строки C#?

Тип данных string также является ссылочным. Возможно, вам интересно, почему new оператор не использовался при объявлении строки. Это сделано авторами языка C# исключительно в целях удобства, string Так как тип данных используется так часто, можно использовать следующий формат:

string shortenedString = "Hello World!";
Console.WriteLine(shortenedString);

Однако за кулисами создается новый экземпляр System.String, который инициализируется как "Hello World!"

Кратко

  • Типы значений имеют меньшие допустимые значения и хранятся в стеке. Ссылочные типы могут содержать большие значения, а экземпляр ссылочного типа создается с помощью оператора new. Переменная ссылочного типа содержат ссылку (адрес памяти) на фактическое значение, хранящееся в куче.
  • К ссылочным типам относятся массивы, строки и классы.

Проверьте свои знания

1.

В C#, когда new ключевое слово используется для создания экземпляра объектаclass, где выделяется память?