Проверка существования объекта класса
Допустим есть гипотетический класс Class с полями feature1 и feature2.
Где-то в коде создается экземпляр данного класса
Class thatclass = new Class(1, 2);
Есть ли в C# способ проверки существования именно данного экземпляра с полями 1 и 2? То есть некий метод, которому на вход подается 1 и 2 и он возвращает true, а если подать другие значения, false?
Ответы (2 шт):
Изначально такой возможности нет.
Но никто не запрещает вам сделать свой вариант решения.
Создаем статичный класс и называем его, например, Classes.
Описываем его примерно так:
static class Classes
{
private static List<Class> classes = new List<Class>();
public static void Add(Class @class)
{
classes.Add(@class);
}
public static bool Contains(int x, int y)
{
return classes.Any(c => c.X == x && c.Y == y);
}
}
Где Class -
class Class
{
public int X { get; set; }
public int Y { get; set; }
public Class(int x, int y)
{
Classes.Add(this);
X = x;
Y = y;
}
}
И пробуем проверить существование нужных нам экземпляров:
Class class1 = new Class(1, 2);
Class class2 = new Class(2, 3);
Console.WriteLine(Classes.Contains(5, 10)); //FALSE
Console.WriteLine(Classes.Contains(2, 3)); //TRUE
Есть, но зачем? Ну да ладно.
Dictionary<SomeState, SomeClass> objs;
public bool TryGet(int a, double b, [MaybeNullWhen(false)] out SomeClass obj) => objs.TryGetValue(new SomeState(a, b), out obj));
struct SomeState : IEquitable<SomeState> // !!!ВАЖНО!!!
{
internal int A;
internal double B;
// ...
}
Ну или так:
Dictionary<SomeState, SomeClass> objs;
[ThreadStatic]
SomeState state = new SomeState();
public bool TryGet(/*...*/)
{
state.A = a;
state.B = b;
return objs.TryGetValue(state, out obj);
}
class SomeState : IEquitable<SomeState>
{
// ...
}
Тут мы не копируем потенциально большое (в плане размера) состояние при передаче в Equals(SomeState, SomeState), а используем mutable объект.