Кортежи: возможные типы
В .NET кортежи - значимые типы, читал информацию про них в очередной книге, и обнаружил, что в прошлом коде, будучи совсем новичком, использовал в кортежах ссылочные переменные. И там всё работает. Как такое возможно? Это код для API, который обязан писаться в версии Framework 4.8. Может ранее в кортежи можно было помещать всё что угодно?
Для уточнения, возвращал из методов не просто ссылочные типы, но и даже списки ссылок. Что-то вроде этого:
public (List<SomeType>, List<List<SomeType2>>) Method()
{ }
Почему код допустил использование в кортежах ссылочных типов?
Ответы (1 шт):
У вас путаница между самим кортежем и его элементами:
- Сам кортеж - значимый тип, т.е. он хранится сразу в памяти, в отличие от ссылочных типов, для которых сначала создаётся объект где-нибудь в куче, а потом берётся ссылка на этот объект, и уже эта ссылка отправляется куда-то. Поэтому кортежи используют, например, для возврата из функций - так работает быстрее, чем с объектами, которые сначала создаются, а потом из функции возвращается ссылка на объект. В случае кортежа из функции возвращается сразу сам кортеж.
- Элементы кортежа могут быть любого типа. Хотите - значимого, хотите - ссылочного, ограничений нет.
P.S. Ссылка на официальную документацию. Цитата:
Tuple types are value types; tuple elements are public fields. That makes tuples mutable value types.