Здравствуйте, vdimas, Вы писали:
V>Именно так.
V>Под каждую такую задачку — отдельная мини-борьба с кроссплатформенностью.
Ну вы же это подаёте так, как будто у вас там прямо разное приложение под каждую платформу. А не 95% единой кодовой базы, с тщательно изолированными платформенно-специфичными 5%.
V>Это был просто один из примеров, который дотнет еще не покрыл.
V>Я не сомневаюсь, что рано или поздно донет покроет последние дыры, как грится, это просто пример того, что "кроссплатформенность" в своей сути — это умение обыгрывать различия платформ на некоем уровне, давая возможность приложению в целевом уровне оставаться одинаковым для большого кол-ва платформ.
А то.
V>Просто на Си (даже не С++) инструментарий обыгрывания различий удобнее из-за макропроцесора.
V>"Удобнее" означает меньше трудозатрат в пересчёте на каждое такое обыгрывание.
Да вы смеётесь? Как вы обыграете отсутствие eventfd на винде при помощи "макропроцессора"?
У вас будет ровно то же самое — слой абстракции, который реализован сильно по-разному под винду и под линукс. Максимум, чего можно получить макропроцессором — это автоматического выбора нужного названия класса или семейства функций в месте их вызова.
То есть то, что в дотнете мы будем решать или при помощи DllImport, который стреляет в .dll / .so, или при помощи отдельной менеджед библиотеки, которая собирается из разных исходников в зависимости от target, из исходников с #ifdef.
V>Плюс, по правилам велосипедостроения, уже очень мало кто изобретает велосипеды, т.к. эти задачи давно и многократно решены, т.е. стоимость "обыгрывания" порой примерно нулевая.
Если задачи решены — то вопросов нет.
V>Вот здесь на входе три массива:
V>https://docs.microsoft.com/ru-ru/dotnet/api/system.net.sockets.socket.select?view=net-5.0
Так кто вам мешает написать свою функцию Select?
Там кода — полстранички. Делаете её Select<T> where T: IList<Socket>, и она сохраняет совместимость со старой версией. При этом она будет уметь принимать не только массивы сокетов, но и Span-ы, и при этом благодаря рантайм-специализации уйдет почти вся косвенность вместе с нагрузкой на GC.
V>ОК, сейчас проверю опять.
V>О да, сейчас до 64 элементов создают через stackalloc:
V>https://github.com/dotnet/runtime/blob/57bfe474518ab5b7cfe6bf7424a79ce3af9d6657/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Windows.cs#L914
V>Глядишь, к моей пенсии всем этим можно будет пользоваться...
Пользоваться можно и сейчас. Менеджед код писать очень легко. Это в JIT контрибутить трудно, и если он чего-то не умеет — то упс.
V>А какие мы были молодые, когда всё это только начиналось? ))
Начиналось оно, прямо скажем, бледно. Первый дотнет был — обнять и плакать. И самое, конечно, поганое — в том, что его следы до сих пор сохраняются в дотнете.
Вот это вот наследование IEnumerable<T> от IEnumerable, или вот ваш же пример с IList (!) в качестве аргументов...
В общем, понятно, что передать дотнет в опенсорс надо было на десять лет раньше.