var typeToFunc = new Dictionary<Type, AddFunc>() {{typeof(int), IntAdd}, {typeof(Vector2), Vector2Add}};
var left = 123;
var right = 14455;
var result = Add(left, right);
Console.WriteLine($"Результат сложения {left} и {right} = {result}");
var leftVector = new Vector2(123, 55);
var rightVector = new Vector2(55, 111);
var resultVector = Add(leftVector, rightVector);
Console.WriteLine($"Результат сложения {leftVector} и {rightVector} = {resultVector}");
T Add<T>(T left, T right)
{
return ( T ) typeToFunc[typeof(T)](left, right);
}
object Vector2Add(object left, object right)
{
return ( Vector2 ) left + ( Vector2 ) right;
}
object IntAdd(object left, object right)
{
return (int) left + (int) right;
}
delegate object AddFunc(object left, object right);
var number = NumberOrVector2<int>.FromNumber(123);
var newNumber = number.Add(() => 23, () => throw new InvalidOperationException("хранится число"));
if (newNumber.TryGetNumber(out var result))
{
Console.WriteLine($"Получился результат: {result}");
}
else
{
Console.WriteLine($"Ошибка - хранился вектор");
}
public readonly struct NumberOrVector2<TNumber> where TNumber: unmanaged, INumber<TNumber>
{
private readonly TNumber _number;
private readonly Vector2? _vector;
private NumberOrVector2(TNumber number, Vector2? vector)
{
_number = number;
_vector = vector;
}
public bool TryGetNumber(out TNumber number)
{
number = _number;
return !_vector.HasValue;
}
public bool TryGetVector(out Vector2 vector)
{
vector = _vector.GetValueOrDefault();
return _vector.HasValue;
}
public NumberOrVector2<TNumber> Add(Func<TNumber> numberAdd, Func<Vector2> vectorAdd)
{
if (_vector is {} vector)
{
return new NumberOrVector2<TNumber>(_number, vector + vectorAdd());
}
return new NumberOrVector2<TNumber>(_number + numberAdd(), null);
}
public static NumberOrVector2<TNumber> FromNumber(TNumber number)
{
return new NumberOrVector2<TNumber>(number, null);
}
public static NumberOrVector2<TNumber> FromVector(Vector2 vector)
{
return new NumberOrVector2<TNumber>(default, vector);
}
}
Main()
генерируется компилятором, но преимущество - можно не заморачиваться над сигнатурой (например, можно влепить async/await и не менять void
на async Task
) Как обрабатывать информацию, чтобы она не оседала в голове ворохом пусть даже и знаний, а укладывалась в систему?
Какие есть методы, что почитать? В первую очередь применительно к изучению IT-технологий.
Создают ли эти логи нагрузку на диск и сервер в целом?
нужно ли отключать access логин для nginx
Connect()
возвращается, когда установлено соединение, но само соединение все еще может находиться в очереди - то, что здесь и происходит.const int maxPartySize = 2;
var party = new List<TcpClient>();
var locker = new object();
var ip = IPAddress.Loopback;
var port = 50000;
var server = new TcpListener(ip, port);
server.Start(128);
Console.WriteLine("Сервер запущен..");
while (true)
{
var client = await server.AcceptTcpClientAsync();
_ = ProcessClientAsync(client);
Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} подключен. Текущий размер группы: {party.Count}");
}
async Task ProcessClientAsync(TcpClient client)
{
await Task.Yield();
bool added;
lock (locker)
{
if (added = party.Count < maxPartySize)
{
party.Add(client);
}
}
if (added)
{
Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} добавлен в группу");
}
else
{
Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} НЕ добавлен в группу");
}
client.Close();
}
using TcpClient client = ...
иначе клиент закроется до начала его обработки 1с
1с * (кол-во потоков / 2)
Мне кажется что данная модель памяти подойдет для машины заточенной под ООП (привет java)
для машины с защитой памяти так как из reference выйти не получиться,то есть мы не сможем повредить память другого reference
Собственно полезна ли данная модель памяти
если для операций над памятью буду использоваться load/store
а алоцирование кусочков будет проводиться чем-то похожем на new