Присваиваем сразу много значений кортежами
Скажем, в одном контексте (блоке кода) доступы объекты
А а;
B b;
Есть метод, который возвращает значения для этих объектов
(A MyA, B MyB) MyMethod();
В чём разница между двумя следующими присваиваниями ниже? Как оно выглядит - пофиг. Меня интересует производительность и потребление памяти.
(a, b) = MyMethod();
var result = MyMethod();
a = result.MyA;
b = result.MyB;
Пример может быть и сложнее - скажем, вместо простых a и b могут быть свойства разных объектов, коллекции и прочее. Но мне удобно объединить возврат в кортеж и присвоить тоже в кортеже, т.к. все значения в возврате связаны семантически. А не создавать отдельный объект на возврат и не писать портянку отдельных присваиваний, как во втором случае.
Вообще, запись
(a, b) = MyMethod();
создаёт кортеж из a и b в левом операнде, или это просто синтаксический сахар для присваивания? Если кортеж создаётся, то вот оно и потребление памяти - целый объект создался! В отличие от второго варианта сверху, где a и b присваиваются независимо, и следовательно кортеж для них не создаётся. Но зато я пишу куда больше кода.
А, понял - это деконструкция. Чего-то из головы вылетело... Ну как "вылетело" - они, блин, каждый год дописывают чего-нибудь. Например, год назад так нельзя было, а теперь можно:
string city = "Raleigh";
int population = 458880;
(city, population, double area) = QueryCityData();
А, понял - это деконструкция. Чего-то из головы вылетело...
ага ага вспомнил он, это Джон тебе подсказал и объяснил!
Автор библии сишарпников, даже у меня наверное пару его книг было...
Он просто ещё не знает как ты о людях с книгами высказываешься, надо ему перевести твоё творчество:
Особенно прикольно смотрелись такие толмуды на заднем плане на полках. Для непонимающего сразу видно, что человек солидный, во всяких непонятных словах разбирается, половина из которых написаны по-английски - наверное, профессор. А для понимающего - нахрена ты всю эту давно устаревшую макулатуру на полках годами держишь, да ещё на их фоне фотаешься?
Всё равно как-то старомодно, когда видишь у какого-нибудь программиста за спиной натюрморт из полок и стопок книг. Особенно в летах люди этим грешат. Такой бэкграунд из стелажей с протухающими пылесборниками как бы подчёркивает, сколько знаний (тоже протухших) у человека в голове. У более молодых бумажные книги занимают своё самое подходящее ныне место.
кстати он и блокчейн мог бы программировать, если бы не возраст, играть с ключами могёт:
https://stackoverflow.com/a/32693483
.

Два упомянутых вами назначения имеют разные характеристики производительности и потребления памяти:
(а, б) = МойМетод();
Это присваивание использует метод, называемый "распаковка кортежа", чтобы присвоить значения, возвращаемые MyMethod(), переменным a и b. Этот метод удобен и лаконичен, но может потреблять больше памяти, чем второй метод присваивания. Это связано с тем, что значения, возвращаемые MyMethod(), сначала упаковываются во временный объект кортежа, а затем распаковываются в отдельные переменные.
результат вар = MyMethod();
а = результат.MyA;
б = результат.MyB;
Это присваивание сначала присваивает результат MyMethod() переменной с именем result, которая предположительно содержит два свойства с именами MyA и MyB. Затем он присваивает значения этих свойств переменным a и b соответственно. Этот метод может иметь меньшее потребление памяти, чем первый метод, поскольку он не создает временный объект кортежа.