Looking for c# Answers? Try Ask4KnowledgeBase
Looking for c# Keywords? Try Ask4Keywords

C# LanguageТип значения vs Тип ссылки


Синтаксис

  • Передача по ссылке: public void Double (ref int numberToDouble) {}

замечания

Вступление

Типы значений

Типы значений являются более простыми из двух. Типы значений часто используются для представления самих данных. Целое число, булево или точка в трехмерном пространстве - все примеры хороших типов значений.

Типы значений (structs) объявляются с помощью ключевого слова struct. См. Раздел синтаксиса для примера того, как объявить новую структуру.

Вообще говоря, у нас есть 2 ключевых слова, которые используются для объявления типов значений:

  • Структуры
  • Перечисления

Типы ссылок

Ссылочные типы немного сложнее. Ссылочные типы являются традиционными объектами в смысле объектно-ориентированного программирования. Таким образом, они поддерживают наследование (и преимущества там), а также поддерживают финализаторы.

В C #, как правило, мы имеем такие ссылочные типы:

  • Классы
  • Делегаты
  • Интерфейсы

Новые ссылочные типы (классы) объявляются с использованием ключевого слова class. Например, см. Раздел синтаксиса о том, как объявить новый тип ссылки.

Основные отличия

Основные различия между ссылочными типами и типами значений приведены ниже.

Типы значений существуют в стеке, ссылочные типы существуют в куче

Это часто упоминается различие между ними, но на самом деле то, что сводится к тому, что, когда вы используете тип значения в C #, например int, программа будет использовать эту переменную для прямого обращения к этому значению. Если вы скажете int mine = 0, то переменная шахта относится непосредственно к 0, что является эффективным. Однако ссылочные типы фактически удерживают (как следует из названия) ссылку на базовый объект, это похоже на указатели на других языках, таких как C ++.

Вы можете не заметить эффекты этого немедленно, но эффекты там, мощные и тонкие. См. Пример изменения типов ссылок в другом месте для примера.

Это различие является основной причиной следующих различий и заслуживает внимания.

Типы значений не изменяются при изменении их в методе, типы ссылок делают

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

См. Пример типов значений по сравнению с типами ссылок в методах для получения дополнительной информации.

Что делать, если я хочу их изменить?

Просто передайте их в свой метод, используя ключевое слово «ref», и вы передаете этот объект по ссылке. Смысл, это тот же объект в памяти. Таким образом, ваши изменения будут соблюдены. См. Пример при отправке по ссылке для примера.

Типы значений не могут быть нулевыми, ссылочные типы могут

В значительной степени, как говорится, вы можете назначить null ссылочному типу, то есть назначенная вам переменная не может иметь никакого действительного объекта, назначенного ему. Однако в случае типов значений это невозможно. Тем не менее, вы можете использовать Nullable, чтобы ваш тип значения имел значение NULL, если это требование, но если это то, что вы рассматриваете, подумайте, действительно ли класс может быть лучшим подходом здесь, если он является вашим собственным тип.

Тип значения vs Тип ссылки Связанные примеры