P>Чаще всего такие баги появляются при использовании замены по тексту.
И ему компилятор и IDE выдает ворнинги и подчеркивает код как кривой. Но он настолько конченый кретин, что не обращает на них внимание.
P>34 года кодить и не встречаться с тривиальными кейсами — объясняет почему Немерле никак не приживется.
Ты мне найди хоть один пример бага вызванный этим мифом, обсудим. А пока что я вижу легко внушаемого человека повторяющего глупые мифы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Pauel, Вы писали:
IT>>Такие баги лично у меня студия мгновенно подсвечивает как код с кривым форматированием. Думаю, можно на это дело настроить аналайзер, который вообще будет выдавать ошибку. P>Очевидно, что багу сделает тот, у кого студия не настроена или кто пользуется обычным редактором "а я мелочевку отсюда правлю"
Почему кто-то должен пользоваться обычным редактором? Вообще-то сегодня компиляторы современных ЯП специально проектируются под работу в продвинутых IDE. Или вы и на работу всё ещё на телегах ездите?
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Почему кто-то должен пользоваться обычным редактором? Вообще-то сегодня компиляторы современных ЯП специально проектируются под работу в продвинутых IDE. Или вы и на работу всё ещё на телегах ездите?
Вы тут рядом плачетесь, что вам нового компилятора не дают.
Редакторы разные люди настраивают по разному. Далеко не факт, что у всех будет подсвечено то же, что и у вас.
А если в проекте больше одного языка, далеко не факт, что тот самый файл из вижлы будет правиться.
Здравствуйте, Pauel, Вы писали:
IT>>Почему кто-то должен пользоваться обычным редактором? Вообще-то сегодня компиляторы современных ЯП специально проектируются под работу в продвинутых IDE. Или вы и на работу всё ещё на телегах ездите? P>Вы тут рядом плачетесь, что вам нового компилятора не дают.
Компилятор у меня новый. Мне банковская инфраструктура не даёт использовать последнюю версию языка.
P>Редакторы разные люди настраивают по разному. Далеко не факт, что у всех будет подсвечено то же, что и у вас.
Очевидно, что багу сделает тот, у кого студия не настроена или кто пользуется обычным редактором
Выделенное — это про что? Про ненастроенную студию или notepad?
P>А если в проекте больше одного языка, далеко не факт, что тот самый файл из вижлы будет правиться.
Чего?
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
P>>Вы тут рядом плачетесь, что вам нового компилятора не дают.
IT>Компилятор у меня новый. Мне банковская инфраструктура не даёт использовать последнюю версию языка.
Вам не дают не только последнюю версию, но и своевременно докидывать внятные инструменты, типа анализаторов всевозможных.
Потому вы и мечтаете о решении для 'if(' посредством макросов, а компенсируете настройками собственной вижлы
Можно как угодно настроить свою вижлу, но другой человек может сидеть в vs code безо всяких плагинов.
P>>Редакторы разные люди настраивают по разному. Далеко не факт, что у всех будет подсвечено то же, что и у вас.
IT>
Очевидно, что багу сделает тот, у кого студия не настроена или кто пользуется обычным редактором
IT>Выделенное — это про что? Про ненастроенную студию или notepad?
vs code и подобные вещи
P>>А если в проекте больше одного языка, далеко не факт, что тот самый файл из вижлы будет правиться.
IT>Чего?
Сейчас модный подход в разработке — открыть просто фолдер, где десяток другой репозиториев, и работать, как есть, что бы там ни было, го, питон, шарп, джава, итд.
Здравствуйте, VladD2, Вы писали:
P>>Чаще всего такие баги появляются при использовании замены по тексту.
VD>И ему компилятор и IDE выдает ворнинги и подчеркивает код как кривой. Но он настолько конченый кретин, что не обращает на них внимание.
Крайне странно ожидать что у всех ИДЕ будет настроена так же, как и у вас
И не совсем ясно, как быть с заменой по тексту. Предложите ей не пользоваться?
P>>34 года кодить и не встречаться с тривиальными кейсами — объясняет почему Немерле никак не приживется.
VD>Ты мне найди хоть один пример бага вызванный этим мифом, обсудим. А пока что я вижу легко внушаемого человека повторяющего глупые мифы.
Я вам именно это и показал. Или вам дать доступ к репозиториям за все годы работы?
Если вам мало, то вот еще одино — отвалились некоторые клиенты, в т.ч. health check, отладчики, мониторы итд
Причем судя по коду, сначала добавили логирование, потом отформатировал, потом прикрутили линтер, и скобками закрыли невалидный вариант. Я это обнаружил, когда искал, куда же делись некоторые реквесты.
Здравствуйте, Разраб, Вы писали:
Р>Здравствуйте, Serginio1, Вы писали:
S>>Our Vision for .NET 9 S>> Делается ставка на Native AOT,ИИ. Р>Получается Native все же круче JIT как ни крути?
Ну с точки зрения производительности и скорости запуска да. Там же компилятор С++ и время компиляции большое.
А вот отсутствие динамической компиляции уже меньше крути, но они добавили интерпретатор для деревьев выражений Compile
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, Разраб, Вы писали:
Р>>Получается Native все же круче JIT как ни крути?
V>Однозначного ответа нет. V>В теории, JIT может использовать особенности рантайм-процессора. V>А на практике, оптимизация требует времени.
Заметил, свежие апдейты NET8 существенно ускорили время запуска.
Младший брат java взрослеет)) или это уже клон FX ))
Здравствуйте, Разраб, Вы писали:
Р>Заметил, свежие апдейты NET8 существенно ускорили время запуска.
Это потому что оптимизация JIT теперь выполняется не сразу, а только у того кода, который часто вызывается.
Но это тоже не бесплатно, бо надо дёргать диагностику, тратить на это лишние тики проца.
Р>Младший брат java взрослеет
Это если только говорить о об Андроидной жабке.
Вот там всё по-взрослому уже — AOT-компиляция выполняется для конкретного проца.
Т.е., этот момент автоматизирован.
Но в дроиде целая подсистема, которая отслеживает жизненный цикл приложения, а голому дотнетному фреймворку не за что зацепиться, бо он таким вещами не оперирует.
Кароч, надо изобретать инфраструктуру более высокого порядка вокруг AOT.
Refactoring example✨
.NET provides many templates, and if you’ve ever created a Worker Service, you’ve likely seen the following Worker class template code:
namespace Example.Worker.Service
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
if (_logger.IsEnabled(LogLevel.Information))
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
}
await Task.Delay(1000, stoppingToken);
}
}
}
}
The preceding code is a simple Worker service that logs a message every second. Currently, the Worker class has a constructor that requires an ILogger<Worker> instance as a parameter and assigns it to a readonly field of the same type. This type information is in two places, in the definition of the constructor, but also on the field itself. This is a common pattern in C# code, but it can be simplified with primary constructors.
It’s worth mentioning that the refactoring tooling for this specific feature isn’t available in Visual Studio Code, but you can still refactor to primary constructors manually. To refactor this code using primary constructors in Visual Studio, you can use the Use primary constructor (and remove fields) refactoring option. Right-click on the Worker constructor, select Quick Actions and Refactorings... (or press Ctrl + .), and choose Use primary constructor (and remove fields).
Consider the following video demonstrating Use primary constructor refactoring functionality:
The resulting code now resembles the following C# code:
namespace Example.Worker.Service
{
public class Worker(ILogger<Worker> logger) : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
if (logger.IsEnabled(LogLevel.Information))
{
logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
}
await Task.Delay(1000, stoppingToken);
}
}
}
}
That’s it, you’ve successfully refactored the Worker class to use a primary constructor! The ILogger<Worker> field has been removed, and the constructor has been replaced with a primary constructor. This makes the code more concise and easier to read. The logger instance is now available throughout the class (as it’s in scope), without the need for a separate field declaration.
Additional considerations 🤔
Primary constructors can remove your hand-written field declarations that were assigned in the constructor, but with a caveat. They’re not entirely functionally equivalent if you have defined your fields as readonly because primary constructor parameters for non-record types are mutable. So, when you’re using this refactoring approach, be aware that you’re changing the semantics of your code. If you want to maintain the readonly behavior, use a field declaration in place and assign the field using the primary constructor parameter:
namespace Example.Worker.Service;
public class Worker(ILogger<Worker> logger) : BackgroundService
{
private readonly ILogger<Worker> _logger = logger;
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
if (_logger.IsEnabled(LogLevel.Information))
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
}
await Task.Delay(1000, stoppingToken);
}
}
}
Additional constructors 🆕
When you define a primary constructor, you can still define additional constructors. These constructors are required, however; to call the primary constructor. Calling the primary constructor ensures that the primary constructor parameters are initialized everywhere in the class declaration. If you need to define additional constructors, you must call the primary constructor using the this keyword.
namespace Example.Worker.Service
{
// Primary constructorpublic class Worker(ILogger<Worker> logger) : BackgroundService
{
private readonly int _delayDuration = 1_000;
// Secondary constructor, calling the primary constructorpublic Worker(ILogger<Worker> logger, int delayDuration) : this(logger)
{
_delayDuration = delayDuration;
}
// Omitted for brevity...
}
}
и солнце б утром не вставало, когда бы не было меня