Все самое полезное для C#-разработчика в одном канале.
Наши курсы: https://clc.to/y3LDtw
По рекламе: @tproger_sales_bot
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Post #6635
3.74K
БИ @csharpproglib
Showing posts older than #6636 · Back to latest
TimeZoneInfo, Microsoft прямо пишет, что для новой разработки лучше TimeZoneInfo вместо старого TimeZone.var nowUtc = DateTimeOffset.UtcNow;
var moscow = TimeZoneInfo.FindSystemTimeZoneById("Europe/Moscow");
var nowMoscow = TimeZoneInfo.ConvertTime(nowUtc, moscow);
Console.WriteLine(nowUtc);
Console.WriteLine(nowMoscow);
TimeZoneInfo умеет переводить время между часовыми поясами, а DateTimeOffset делает момент переносимым между машинами и окружениями.DateOnly для календарной даты без времени, например отпуск или дата рождения. TimeOnly для времени без даты, например расписание.var vacation = new DateOnly(2026, 1, 10);
var standup = new TimeOnly(10, 30);
Console.WriteLine(vacation);
Console.WriteLine(standup);
DateOnly и TimeOnly заменяют костыли с DateTime и TimeSpan, когда вам не нужен момент времени.orderItem.setQuantity(-1000). Объект становится некорректным, а баги проявятся позже.public void ChangeQuantity(string itemId, int newQuantity) {
if (newQuantity < 0) throw new ArgumentException("Количество не может быть отрицательным");
var item = items.FirstOrDefault(i => i.Id == itemId);
if (item != null) {
item.Quantity = newQuantity;
RecalculateTotal();
}
} ToList() или Select() и радуются новому списку. Но в C# это ловушка.var copy = original.ToList() создаёт новый List, но все элементы внутри — те же самые объекты. Меняете свойство через copy, и оригинал тоже меняется. 

public IActionResult OldPage()
{
return RedirectPermanent("/new-page");
}
Redirect в статусе ответа. Redirect (302) говорит «временно перемещено», браузер каждый раз проверяет старый URL. RedirectPermanent (301) фиксирует «навсегда», что экономит трафик и улучшает SEO.
n8n как мощного визуального оркестратора процессов;MCP от Anthropic для надёжной связи;RAG для работы с Big Data.

[PersistentState] // 1. Абсолютный путь
return Redirect("https://example.com");
// 2. Относительный путь
return Redirect("/admin/dashboard");
// 3. Действие контроллера
return RedirectToAction("Edit", "User", new { id = model.Id });
// 4. URL с параметрами
return Redirect($"/products?category={categoryId}");

store покажет все команды. Работает из коробки на Windows 11 версии preview v22511.1401.5.0.store search vlc
store search "notepad++"
store search powertoys
store similar vlc
store install vlc
store install 9NBLGGH4NNS1 # ProductId
store installed
store updates
store upgrade vlc
store upgrade --all
public class User
{
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
public DateTime Created { get; set; }
// Базовая инициализация
public User()
{
Created = DateTime.Now;
Name = "Гость";
Email = "guest@example.com";
}
public User(string name)
{
Created = DateTime.Now; // Дублируем!
Name = name;
Email = "guest@example.com";
}
public User(string name, string email)
{
Created = DateTime.Now; // Снова дублируем!
Name = name;
Email = email;
}
}
: this(параметры):public class User
{
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
public DateTime Created { get; set; }
// Главный конструктор - вся логика здесь
public User(string name, string email, int age = 0)
{
Created = DateTime.Now;
Name = name ?? "Гость";
Email = email ?? "guest@example.com";
Age = age;
}
// Цепочка к главному
public User() : this("Гость", "guest@example.com") { }
public User(string name) : this(name, "guest@example.com") { }
public User(string name, string email) : this(name, email, 0) { }
}
var user1 = new User(); // Гость, guest, 0
var user2 = new User("Иван"); // Иван, guest, 0
var user3 = new User("Иван", "i@example"); // Иван, i@example, 0
var user4 = new User("Анна", "a@ex", 25); // Анна, a@ex, 25
Created = Now автоматическиpublic User(string name) : this(name, "default") // OK
{
// Дополнительная логика
}
public User() : this("a") : base() // Ошибка!
var key = $"{userId}:{tenantId. Каждый вызов порождает новый string и новый массив char.string.Format("{0}-{1}", a, b); работает по той же схеме создаёт новый объект и буфер под символы.ToString()request.Headers["X-Id"].ToString(); при каждом запросе снова строит строку из заголовка.logger.LogInformation("User {UserId} logged in", userId);ILogger не формирует строку когда соответствующий уровень логов отключён, а значения попадают в структурированные поля записи.ToString() без необходимостиSpan и ValueStringBuilder
using Cysharp.AI;
var users = new User[]
{
new (1, "Alice", "admin"),
new (2, "Bob", "user"),
};
string toon = ToonEncoder.Encode(users);
Console.WriteLine(toon);
string toon2 = ToonEncoder.EncodeAsTabularArray(users);
Console.WriteLine(toon2);
Console.WriteLine(toon == toon2); // same result
public record User(int Id, string Name, string Role);

C# и заставить его работать идеально. Мы знаем, что у тебя есть секретные приёмы, которыми пора поделиться с комьюнити..NET и может сравнить её с Java или Go;yield return код возвращает значение и сохраняет состояние для следующей итерации в foreach или LINQ. Компилятор генерирует класс, реализующий IEnumerable<T>, с MoveNext() для продолжения.IEnumerable<int> EvenNumbers(int max) {
for (int i = 0; i <= max; i += 2) {
yield return i;
}
}0, 2, 4... лениво, только при запросе.
public IEnumerable<OrderDto> GetOrders() и думают что это ленивый возврат данных. На деле фреймворк вынужден сначала полностью пройти по IEnumerable, собрать коллекцию, а уже потом целиком сериализовать ее в JSON и отправить в сеть.IAsyncEnumerable<T>. В этом случае ASP.NET может сериализовать элементы по мере их появления и выводить их в ответ потоком вместо полной буферизации результата. Results.Stream и JsonSerializer.SerializeAsync(stream, data) чтобы отдать JSON как поток байтов и держать в памяти лишь небольшой кусок данных.