Исключение переполнения стека при добавлении класса экземпляра внутри статического класса из конструктора по умолчанию - PullRequest
0 голосов
/ 24 апреля 2019
public class Form
{
    internal static Dictionary<string, Form> Cache = new 
     Dictionary<string, Form>();
    public string FormID{get;set;} = string.Empty;

    public Form()
    {
        if (!Cache.ContainsKey(FormID))
            Cache.Add(FormID, new Form());

       // exception here because new Form() is always called again
    }
}

Я хочу создать экземпляр объекта класса Form внутри Cache. если Cache содержит свойство FormID, то со статическим словарем Cache ничего не произойдет.

Кэш должен содержать один экземпляр для каждого экземпляра из формы с уникальным FormID. это означает, что каждый экземпляр Form имеет экземпляр внутри Cache с тем же FormID. поэтому создание новых экземпляров из клонирования кеша будет быстрым. вот что мне нужно сделать.

Камило Теревинто хорошо ответил ниже.

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Этот код не имеет смысла:

if (!Cache.ContainsKey(FormID))
    Cache.Add(FormID, new Form());

Вы всегда будете проверять / добавлять значение по умолчанию FormId.При этом в этом словаре у вас будет только одна пара ключ / значение, поэтому использование словаря будет пустой тратой.

Для этого следует использовать фабричный метод и оставить конструктор по умолчанию в одиночку:

private Form()
{
}

public static Form BuildForm(string formId)
{
    if (!Cache.ContainsKey(formId))
    {
        Cache.Add(formId, new Form());
    }

    return Cache[formId].DeepClone();  // using DeepCloner extension
}
0 голосов
/ 24 апреля 2019

Вы можете добавить this в Cache:

public class Form
{
    internal static Dictionary<string, Form> Cache = new
        Dictionary<string, Form>();

    public string FormID { get; private set; }

    public Form(string formID)
    {
        this.FormID = formID;
        if (!Cache.ContainsKey(formID))
            Cache.Add(formID, this); // <--- this instead of new Form();
    }
}

this относится к текущему Form созданному экземпляру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...