Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Присваиваем сразу много значений кортежами

390  
alex445 коренной житель03.03.23 17:27
NEW 03.03.23 17:27 
Последний раз изменено 03.03.23 17:34 (alex445)

Скажем, в одном контексте (блоке кода) доступы объекты


А а;

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 присваиваются независимо, и следовательно кортеж для них не создаётся. Но зато я пишу куда больше кода.

#1 
Срыв покровов патриот03.03.23 18:07
03.03.23 18:07 
в ответ alex445 03.03.23 17:27

открой для себя класс StopWatch.

#2 
alex445 коренной житель03.03.23 19:10
NEW 03.03.23 19:10 
в ответ alex445 03.03.23 17:27, Последний раз изменено 03.03.23 19:10 (alex445)

А, понял - это деконструкция. Чего-то из головы вылетело... Ну как "вылетело" - они, блин, каждый год дописывают чего-нибудь. Например, год назад так нельзя было, а теперь можно:


string city = "Raleigh";

int population = 458880;

(city, population, double area) = QueryCityData();

#3 
7495 старожил04.03.23 19:20
7495
NEW 04.03.23 19:20 
в ответ alex445 03.03.23 19:10
А, понял - это деконструкция. Чего-то из головы вылетело...


ага ага вспомнил он, это Джон тебе подсказал и объяснил! зло


Автор библии сишарпников, даже у меня наверное пару его книг было...


Он просто ещё не знает как ты о людях с книгами высказываешься, надо ему перевести твоё творчество:


Особенно прикольно смотрелись такие толмуды на заднем плане на полках. Для непонимающего сразу видно, что человек солидный, во всяких непонятных словах разбирается, половина из которых написаны по-английски - наверное, профессор. А для понимающего - нахрена ты всю эту давно устаревшую макулатуру на полках годами держишь, да ещё на их фоне фотаешься?


Всё равно как-то старомодно, когда видишь у какого-нибудь программиста за спиной натюрморт из полок и стопок книг. Особенно в летах люди этим грешат. Такой бэкграунд из стелажей с протухающими пылесборниками как бы подчёркивает, сколько знаний (тоже протухших) у человека в голове. У более молодых бумажные книги занимают своё самое подходящее ныне место.




кстати он и блокчейн мог бы программировать, если бы не возраст, играть с ключами могёт:


https://stackoverflow.com/a/32693483


.

Вопросы и Ответы - Программируем калькулятор пособий для беженцев вместе.
#4 
dudecarl12 прохожий09.03.23 16:12
NEW 09.03.23 16:12 
в ответ alex445 03.03.23 17:27

Два упомянутых вами назначения имеют разные характеристики производительности и потребления памяти:

(а, б) = МойМетод();

Это присваивание использует метод, называемый "распаковка кортежа", чтобы присвоить значения, возвращаемые MyMethod(), переменным a и b. Этот метод удобен и лаконичен, но может потреблять больше памяти, чем второй метод присваивания. Это связано с тем, что значения, возвращаемые MyMethod(), сначала упаковываются во временный объект кортежа, а затем распаковываются в отдельные переменные.

результат вар = MyMethod();
а = результат.MyA;
б = результат.MyB;

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

#5 
alex445 коренной житель09.03.23 16:51
NEW 09.03.23 16:51 
в ответ dudecarl12 09.03.23 16:12, Последний раз изменено 09.03.23 16:53 (alex445)

Кто-то стал общаться через бота с переводчиком? ))


Я там вообще ступил с производительностью. На неё импакт там ничтожный. Я просто забыл про деконструкцию.

#6