Кортежи ValueTuple

Знаете, меня, например, бесят новости, что новое железо/программы прекращают поддержку Win7 и требуют 8, 8.1 и 10. Мне проще не использовать это или искать нелегальные портированные версии. Тут - то же самое. На XP нельзя поставить что-то старше 4.0, во всяком случае без шаманства, но время идёт и место XP может занять семёрка. Так что я поступлю так:

Верно, но не всегда можно её обновить. Вот выйдет, скажем, .NET 8 версии без поддержки 7 и всё. Многие не хотят ставить что - то новее 7. А ничего, что за это ещё и платить надо. За копию. Вы ведь не хотите вирусов, нам подслушки и от РКН хватает за глаза.

Конечно, в компьютерном классе школы, к примеру. Там что сочли нужным поставить, то и стоит. Может, железо старое и не позволяет перейти на семерку даже. Или какие-то учебные программы, которые не работают на семерке из-за ограниченной поддержки ей DOS-режима.

Такое может быть. Я, например, встречал такое, что вместо WinXP ставили 10. Там мониторы на ЭЛТ и встроенный в системник дисковод для дискет(!). Как итог - загрузка 15 минут, выключение 10.

Если и не обновление .Net Framework, то, думаю, попробовать это стоит. При наличии свободного времени, разумеется.

А с чего вообще речь про обновления пошла? Они тут каким боком?

Таким, что не во всех версиях .Net Framework есть поддержка System.ValueTuple. Если точнее, то он есть в Framework 4.7+. В более низких версиях требуется пакет System.ValueTuple, который можно установить через менеджер пакетов NuGet.

В пакете с .NET есть утилита ngen.exe. Написано, что она генерирует машинный код для .NET-программы. Можно ли с её помощью отвязаться от .NET, просто скомпилировав программу?

Нет

@Admin похоже, @MrFresnel тестировал скорость кортежей в Debug версии компилятора. В Release разница больше чем в 5 раз!

4 лайка

Вот еще пример на многократное структурное сравнение разных кортежей из 3-х элементов. У меня разница в Release варианте иногда достигает 450 (!) раз. Конечно, это синтетика, но отчетливо показывает потенциал статической ValueTuple для некоторых алгоритмов.

uses 
  System.Diagnostics;
const
  Cycles = 10000000;
type 
  MyTuple1 = System.Tuple<integer, real, char>;
  MyTuple2 = System.ValueTuple<integer, real, char>;

begin
  var sw1 := Stopwatch.StartNew();
  var a1 := new MyTuple1(123, 1.23, 'a');
  var b1 := new MyTuple1(123, 1.23, 'a');
  loop Cycles do
    if a1 = b1 then;
  sw1.Stop();
  Println('Tuples =', sw1.ElapsedMilliseconds / 1000);
  
  var sw2 := Stopwatch.StartNew();
  var a2 := new MyTuple2(321, 3.21, 'z');
  var b2 := new MyTuple2(321, 3.21, 'z');
  loop Cycles do
    if a2 = b2 then;
  sw2.Stop();
  Println('ValueTuples =', sw2.ElapsedMilliseconds / 1000);
  
  Println($'Ratio = {sw1.ElapsedTicks/sw2.ElapsedTicks :f2}');
end.
3 лайка

Понятно. Спасибо за тестирование. Это круто.

У меня предложение переписать ValueTuple на Паскаль. Кто возьмётся? ILSpy в помощь. Минусы. Это будет несовместимо ни с каким Tuple, использованным в C#. Если какая-то функция стандартной библиотеки будет работать с Tuple, то нельзя будет в ней использовать наши кортежи.

Второе предложение - прошу высказаться остальных участников. Как-то чудодейственным волшебным образом сделать две версии компилятора - для WinXT и для современных Win.

Третье предложение. Оставить всё как есть.

Четвертое предложение. Выкинуть Tuple и оставить только ValueTuple. Удалить с сайта версию с NET 4.0, поскольку она всё равно будет не нужна и отвратить от нас от 40 до 60% пользователей старых компьютеров. И еще 10% уйдут позже за счет того, что они будут приносить к друзьям exe, те будут запускать, код будет валиться с ужасающе-непонятным сообщением об ошибке.

Пятое предложение. Подождать 2-3 годика когда аудитория WinXP и предустановленной платформы .NET версии ниже 4.7 сократится до минимума процентов в 5. Вполне неплохое кстати. Мы сидели на NET 2.0 года 4 - и ничего, потом перешли на 4.0 со всеми плюшками

Шестое предложение. Сделать новвый крутой Tuple с другими скобками - скажем, (. .). И сделать неявное преобразование одного к другому (по-моему, сделано)

Как насчёт сделать версию для старый компьютеров, которая больше не поддерживается (то есть так что сейчас), но её можно скачать. А новая - только для последней версии .Net ?

Насколько мне известно, в .NET можно выбрать целевую версию среди предыдущих.

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

Если получится реализовать какие-то ValueTuple так, чтобы они не затронули того что есть (вообще никак не затронули) - почему нет? Если что-то затронут - это потянет за собой цепь событий, как костяшки домино падающие и тогда - упаси бог от такого шага!

Поддерживать разработчикам две разных версии - это непосильная задача, когда в одной проблем выше крыши.

Я же говорю, сделать версию для .Net4.0 не поддерживаемой, то есть поддерживать только новую.

Это предложение для топика “Антипродвижение PascalABC.NET”. Который Вы можете создать.

2 лайка

А Вы понимаете, что NET 4.7 сейчас установлена проценте на 10 компьютеров?

Ну так у вас же первый установщик на станице скачки и так устанавливает .Net вместе с собой. Будут обновляться на новую - скачают вместе с .Net .

Блин поминальный! Ну может кто-нибудь сказать, почему когда одна группа людей “по самое немогу” озабочена продвижением языка, другая упорно его пытается куда-то затолкнуть, гарнируя это все “благими побуждениями”? Народ, у Вас что, совершенно нет понимания конечной цели? Или она у Вас настолько своя, что даже непонятна какова?