Я даже не уверен, как мне сформулировать этот вопрос. Я передаю некоторые объекты CustomStruct в качестве параметров методу класса и сохраняю их в списке. Мне интересно, возможно ли и более эффективно добавить несколько ссылок на конкретный экземпляр CustomStruct, если найден эквивалентный экземпляр.
Это фиктивная / примерная структура:
public struct CustomStruct
{
readonly int _x;
readonly int _y;
readonly int _w;
readonly int _h;
readonly Enum _e;
}
Используя приведенный ниже метод, вы можете передать один, два или три объекта CustomStruct в качестве параметров. В последнем методе (который принимает три параметра) может быть так, что 3-й и, возможно, 2-й будут иметь то же значение, что и первый.
List<CustomStruct> _list;
public void AddBackground(CustomStruct normal)
{
AddBackground(normal, normal, normal);
}
public void AddBackground(CustomStruct normal, CustomStruct hover)
{
AddBackground(normal, hover, hover);
}
public void AddBackground(CustomStruct normal, CustomStruct hover, CustomStruct active)
{
_list = new List<CustomStruct>(3);
_list.Add(normal);
_list.Add(hover);
_list.Add(active);
}
Поскольку метод стоит сейчас, я считаю, что он создаст новые экземпляры объектов CustomStruct, а затем добавит ссылку на каждый из них в список.
Насколько я понимаю, если я вместо этого проверю на равенство между normal и hover и (если равен) вставьте normal снова вместо hover , когда метод завершится, hover потеряет все ссылки и в конечном итоге будет собирать мусор, тогда как normal будет иметь две ссылки в списке. То же самое можно сделать для active .
Это было бы лучше, верно? CustomStruct является ValueType, и поэтому один экземпляр останется в стеке, а три ссылки на List будут просто указывать на него. Общий размер списка определяется не типом объекта, а его емкостью. Удаляя «дубликаты» объектов CustomStuct, вы разрешаете их очищать.
Когда объекты CustomStruct передаются этим методам, новые экземпляры создаются каждый раз. Когда структуры добавляются в список, создается ли еще одна копия? Например, если я передаю только один CustomStruct, AddBackground (normal) создает копию исходной переменной и затем передает ее три раза в Addbackground (normal, hover, active). В этом методе три копии сделаны из оригинальной копии. Когда три локальные переменные добавляются в список с помощью Add (), создаются ли дополнительные копии внутри Add (), и это противоречит цели любых проверок на равенство, как упоминалось ранее?
Есть ли лучший способ справиться с этим? Должны ли структуры передаваться как ссылки на методы, чтобы обойти это?
Я что-то здесь упускаю?