Проверка существования объекта класса

Допустим есть гипотетический класс Class с полями feature1 и feature2.

Где-то в коде создается экземпляр данного класса

Class thatclass = new Class(1, 2);

Есть ли в C# способ проверки существования именно данного экземпляра с полями 1 и 2? То есть некий метод, которому на вход подается 1 и 2 и он возвращает true, а если подать другие значения, false?


Ответы (2 шт):

Автор решения: LiptonDev

Изначально такой возможности нет.
Но никто не запрещает вам сделать свой вариант решения.
Создаем статичный класс и называем его, например, 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
→ Ссылка
Автор решения: return

Есть, но зачем? Ну да ладно.

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 объект.

→ Ссылка