public record struct CellPos(int X, int Y); //record struct, тк объект маленький и очень похож на value-object
using System.Threading;
var data = new int[1]; // Какие-то данные
var thread = new Thread(() => {
var result = data.Length; // Какие-то ужасно сложные вычисления
HandleResult(result); // Это можно передать как параметр-делегат, но тут мы будем конкретный метод использовать
});
thread.Start(); // Стартуем
// Какие-то дела
thread.Join(); // Всё равно надо по-хорошему дождаться окончания работы потока
void HandleResult(int value) {
Console.WriteLine(value);
}
using System.Threading;
var data = new int[1]; // Какие-то данные
var result = 0; // Какой-то результат (инициализируем значением по-умолчанию)
var thread = new Thread(() => {
result = data.Length; // Какие-то ужасно сложные вычисления
});
thread.Start(); // Стартуем
// Какая-то работа
thread.Join(); // Дожидаемся окончания работы потока
Console.WriteLine(result); // Используем результат работы
без кастов
private IEvent<Handler, Argument> thisEvent => this;
// ...
thisEvent.Create(argument);
public class Player {
public Coins coins; // Как-то нужно присвоить ему значение, иначе будет NRE
public void SomeMethod() {
var total = coins.coinsAmount; // Вот мы и обратились
}
}
Как решить такой трабл явно не приводя массив к нужному типу ?
var classes = objects.Select(ConvertObjectToClass).ToArray();
var classes = objects.Cast<Class>().ToArray();
var classes = System.Runtime.CompilerServices.Unsafe.As<Class[]>(objects);
using System.Runtime.CompilerServices;
var objects = new object[] { new A { x = 1 }, new B { y = 2, z = 3 } };
var something = Unsafe.As<A[]>(objects);
Console.WriteLine(something[0].x); // 1
Console.WriteLine(something[1].x); // 2
var something2 = Unsafe.As<B[]>(objects);
Console.WriteLine($"{something2[0].y} {something2[0].z}"); // 1 0
Console.WriteLine($"{something2[1].y} {something2[1].z}"); // 2 3
class A
{
public int x;
}
class B
{
public int y;
public int z;
}
зачем делать Singleton with double check locking
сказали что lock это одна из самых дешевых оперций по синхронизации.
get { lock (Loker) { // only one check and everything is fine :) if (_instance == null) { _instance = new Singleton1(); } } return _instance; }
- cars
- cars_bigs
- force: 500
weight: 1000
- force: 1000
weight: 4000
- cars_smaller
# и так далее
class CarsResult {
public CarItem[] Cars { get; set; }
}
class CarItem {
// К сожалению, нельзя на уровне системы типов выразить "Объект, у которого есть либо поле А либо поле Б"
// Так что придётся указать оба поля
// И нельзя это разрулить на уровне настроек сериализатора, если не придумывать кастомный сериализатор (не знаю, можно ли кастомизировать юнитивский)
public Car[] BigCars { get; set; }
public Car[] SmallCars { get; set; }
}
class Car {
public int Force { get; set; }
public int Weight { get; set; }
}
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
GlobalConfig.Instance = app.Configuration;
app.MapGet("/", () => $"I can use configuration w/o DI! AllowedHosts={GlobalConfig.Instance.GetValue<string>("AllowedHosts")}");
app.Run();
public static class GlobalConfig
{
public static IConfiguration Instance { get; set; }
}