LINUX.ORG.RU

C# 9 опережает Rust?

 , ,


0

7

Тут выложили обзор фич C# 9, и там очень много ФП и странного синтаксиса (привет @WitcherGeralt).

Sum Types:

enum class MixedType  
{  
  Person P;  
  ByteOrBool U;  
}

var person = new Person()  
{  
  Firstname = "Bassam";  
  Lastname = "Alugili";  
};  
  
var unionRecord = new MixedType.P(person);
var unionType1 = new MixedType.U(B true);
var unionType2 = new MixedType.U(Y 86uy);

Pattern matching:

public class GenericClass<T> where T : T1 | T2 | T3 

var crazyCollectionFP = new List<int|double|string>{1, 2.3, "bassam"}; 

var result = x switch { true => "Successful", false => 0 }; 

Типы аля Rust:

public class None {}  
public typealias Option<T> = T | None; 
public typealias Result<T> = T | Exception; 

Некое чудо-юдо для автоматической проверки на null:

void M(List<int> list, uint? u)  
{  
  IEnumerable<int> x = list ?? new[] { 1, 2 };  
  var l = u ?? -1;
}  

Что значит uint? - без понятия.

Проверка аргумента на null:

void DoSomething (string txt!)  
{  
  …  
} 

Lambda discard parameters (хз как перевести):

Func zero = (_,_) => 0;  
(_,_) => 1, (int, string) => 1, void local(int , int);

Атрибуты аргументов (опять как в rust):

static bool LocalFunc([NotNull] data)  
{  
  return true;  
} 

Нативный int:

nint nativeInt = 55; // take 4 bytes when I compile in 32 Bit host.  
nint nativeInt = 55; // take 8 bytes when I compile in 64 Bit host with x64 compilation settings.

nuint nativeUnsignedInt = 55; 

А @eao197 говорил, что u32 - это дно. Оказывается нет.

Указатели на функцию (неужели до этого не было?):

unsafe class Example  
{  
  void Example(Action<int> a, delegate*<int, void> f)  
  {  
    a(42);  
    f(42);  
  }  
} 

В целом радует, что идут в сторону ФП и null-safety, но в итоге получаем второй C++, в котором на любой чих есть с десяток конструкций. Что в конечном итоге убивает экосистему.

но в итоге получаем второй C++

Это судьба любого старого языка, который не закопали вовремя. Нужно же его постоянно омолаживать, чтобы пограмисты не сбежали на новенькие и модные. Но все равно получается молодуха уровня пугачевой.

anonymous ()
Ответ на: комментарий от vertexua

Потому, что бабло приносят. Пишешь на C# значит деплоишь на вендосервер и ms sql. А это куча бабла. А уйдут на Go и будут деплоить на какой-нибудь GCP, бабло понесут гуглю.

Legioner ★★★★★ ()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Legioner

Это устаревшая информация.

.NET Core уже лучше работает на Линуксе, Майкрософт пакует грамотно сделанные Docker контейнеры с ним. И вообще MS уже рулит в опенсорсной экосистеме для разработчиков.

Софт на Go запросто гоняют в Azure, ему вообще все равно где работать.

vertexua ★★★★☆ ()
Последнее исправление: vertexua (всего исправлений: 1)

Sum Types: Это юнион.

Типы аля Rust:

Ты там упоролся что-ли? Где ты там нашел rust, покажешь? Это типы аля С++ + f#/TS.

Что значит uint? - без понятия. Очевидно - значит жабку.

Атрибуты аргументов (опять как в rust):

В каком rust - ты опять упорлося. Атрибуты - из си. Синтаксис оттрибутов из С++.

В целом радует, что идут в сторону ФП

Где ты там ФП увидел, покажешь?

и null-safety

Наоборот.

но в итоге получаем второй C++

Это и был С++ всегда.

в котором на любой чих есть с десяток конструкций.

Ты хотел сказать язык в котором есть возможности и конструкции? А у тебя их попросту нету, потому что не осилил? Ну да, так бывает.

Что в конечном итоге убивает экосистему.

Это откровения про экосистему. Обосновывай.

anonymous ()
Ответ на: комментарий от vertexua

Ну это в теории. На практике все на винде как сидели, так сидят. Не знаю никого, кто перешел бы на линукс с венды, чтобы деплоить там .NET. Обычно линуксоиды все на джаве пишут.

У GCP какой-то спец API. Так просто его не запустишь больше нигде, если под это API пишешь.

Legioner ★★★★★ ()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Deleted

Может быть опциональный аргумент.

Нет. очевидно даже потому, что вопросик у типа, а не у переменной. Судя по:

void M(List<int> list, uint? u)  
{  
  IEnumerable<int> x = list ?? new[] { 1, 2 };  
  var l = u ?? -1;
}  

Очевидно, все типы по умолчанию nullable. Либо как минимум List такой.

Соответственно - это необходимо для того, что-бы запретить nullable по умолчанию. А далее T? - это костыль, который делает из типа nullable тип.

?. ?? и прочее - это то, что раст пастил отсюда. А это - вариация на тему ?: - из си.

anonymous ()
Ответ на: комментарий от vertexua

Более того, Go работает и в винде, а виндузота взяла его на вооружение.

Когда менял работу в начале года, с удивлением обнаружил, что заметная часть вакансий на Go виндузотная. Внезапно осознал, что кросс-платформенность — это не всегда хорошо.

WitcherGeralt ★★ ()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от WitcherGeralt

Ты такой ненавистник винды? Наоборот это приятно, что нормальные инструменты теснят микрософтовские говна даже в их логове. Кстати, сабжевые изменения в сисярпе только ускорят наступление го. Ну кому захочется копаться в этой осьминожьей «функциональщине» (читай очередная доза кулфич).

anonymous ()
Ответ на: комментарий от anonymous

?? и прочее - это то, что раст пастил отсюда

В ES в скором времени будет оператор ??. А в TS он появился недели 2 назад. Зовется nullish coalescing

Deleted ()
Последнее исправление: Deleted (всего исправлений: 3)
Ответ на: комментарий от Deleted

В ES в скором времени будет оператор ??.

Он там валяется тыщу лет.

А в TS он появился недели 2 назад.

Я знаю.

Зовется nullish coalescing

Так же я знаю что это. И я даже тебе сообщил откуда он взялся. Это огрызок ?: из си. Потом оно уже ввиде ?./?? поплыло в шарп и там захайпилось. А далее уже пошло по по скриптухе. Там всякие расты, жаваскрипты и прочее.

anonymous ()
Ответ на: комментарий от WitcherGeralt

Более того, Go работает и в винде, а виндузота взяла его на вооружение.

Когда менял работу в начале года, с удивлением обнаружил, что заметная часть вакансий на Go виндузотная.

там в стандартной библиотеке запилили кроссплатформенные функции для работы с ФС. Виндузятникам и правда очень удобно: взял любой код, любую библиотеку, и с большой вероятностью оно сконпеляется.

anonymous ()

Указатели на функцию (неужели до этого не было?):

Было конечно, только раньше нужно было где-то отдельно объявлять тип функции(делегат, типа typedef на функцию в С), а сейчас видимо сделали чтобы можно было сразу, без делегата.

Как-то так можно было делать раньше:

public class Program
{
    delegate void GetMessage(/*int x, int y*/);
 
    public static void Main(string[] args)
    {
        if (DateTime.Now.Hour < 12)
        {
            Show_Message(GoodMorning);
        }
        else
        {
            Show_Message(GoodEvening);
        }
    }
    private static void Show_Message(GetMessage f)
    {
        f();
    }
    private static void GoodMorning()
    {
        Console.WriteLine("Good Morning");
    }
    private static void GoodEvening()
    {
        Console.WriteLine("Good Evening");
    }
}
fsb4000 ★★★★★ ()

но в итоге получаем второй C++, в котором на любой чих есть с десяток конструкций.

Т.е. превращается в стройную систему костылей и подпорок? Молодцы,что тут сказать.

WatchCat ★★★★★ ()
Ответ на: комментарий от slaykovsky

Я гуглю в основном что-то по JavaScript, команды, когда влом ман читать и всякий рандом, когда играюсь с новыми для меня языками. Первое и последнее просто по фану, а второе проблема, да, но меня бы спасли TLDR pages. У современных языков (кроме JS) и БД шикарная документация, так что особых проблем я бы не испытывал.

WitcherGeralt ★★ ()

C# был скопирован полностью с жавы. Очень быстро стало ясно, что жава, как язык - говно, а причина этому - построение всего языка на классах. Потому в языки начинают вводить анонимные классы, лямбды, обобщения и ветвления по типу вместо наследования, алгебраические типы данных - всё для того, чтобы писать работающий код вместо бесполезных объявлений.

Это не ФП - это просто языковые констуркции здорового человека. К сожалению, из этого языка не получится удалеть безнадежно больные части, потому язык останется перегруженным. Не нравится - используйте F#. Но вы же сами прекрасно понимаете, что макаки не смогут освоить F#.

byko3y ★★★ ()
Ответ на: комментарий от Deleted

нуллабле велью типы там уже давно, это не «фича Ц диез 9». Оператор ?? тоже появился мягко говоря не вчера. Опа с разморозкой :)

slackwarrior ★★★★★ ()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от anonymous

Нет, ну в самом деле, зачем? Диалоги с умалишённым фанатиком не имеют никакого смысла, в особенности - интеллектуального и коммерческого.

anonymous ()

Очень путано, пришлось по ссылке сходить, но там тоже все довольно сумрачно (может быть простуда виновата).

Некое чудо-юдо для автоматической проверки на null:

На самом деле речь там всего лишь об автокасте массива к IEnumerable

uint?

Эквивалентно Nullable - обертка для value типов, позволяющая хранить null

?? это coalescing operator, которому сто лет в обед.

Проверка аргумента на null

Вот это уже совершенно безумные синтаксические сахара пошли.

Атрибуты аргументов (опять как в rust)

Фича времен .NET 2.0 если не старее. Раста еще не было тогда.

На самом деле речь идет о хтонической фиче для захвата параметров в виде строк для автотестов. https://www.infoq.com/news/2019/01/Caller-Expression-Attribute/

Указатели на функцию (неужели до этого не было?):

Были делегаты (Action, Func, Predicate). Из пропозала толком ничего не понятно (кроме того что в отличие от старых делегатов новый будет использовать другой опкод). Ну и судя по всему оно и не принято еще.

В целом алгебраические типы и паттерн матчинг это здорово, а вот с сахарами пора бы им остановиться

Midael ★★★★★ ()

К слову: Саттер общается с Хейлсбергом, и отчасти поэтому фичи из C# иногда перетекают в C++ :D

// Так и не понял, при чем тут раст. Видимо, у ТС он при всём.

anonymous ()
Ответ на: комментарий от vertexua

Софт на Go запросто гоняют в Azure, ему вообще все равно где работать.

Всё равно с докером проще в Линукс. Network=host и прочие в Маках и Вендах барохлят.

anonymous ()