Я предполагаю, что вы, вероятно, уже известно, что структура обеспечивает Color
-структуру. Я предполагаю, что вы создаете класс Color
только для практики.
Вы выразили неуверенность в значении ключевого слова static
, хотя вы его правильно использовали.Когда static
применяется к члену класса или структуры, это означает, что этот член принадлежит классу в целом и не применяется к отдельным экземплярам. Статические члены данных (поля) создаются только один раз; экземпляры не получают своих собственных копий. Статические функции (методы и свойства) вызывается без ссылки на экземпляр.
Что касается использования памяти, я бы не стал слишком беспокоиться об этом в вашем случае. Ваш класс Color
не должен использовать более нескольких байтов на экземпляр (например, структура Color
структуры хранит красный, зеленый, синий и альфа в одном 32-битном int
.). Если ваш Color
действительно является class
вместо struct
, тогда у вас будет еще несколько байтов в служебных данных (каждый экземпляр будет иметь дополнительный 32-разрядный указатель v-table/typeinfo, а каждая ссылка - дополнительные 32-разрядные), но даже в этом случае вы говорите о 12 байтах или около того на один экземпляр. Если у вас есть предопределенные 100 различных цветов, вы будете использовать < = 1200 байт. На самом деле ничего особенного.
Есть причины для ленивой инстанцирования. Есть классы, в которых do используют много памяти, и те, которые занимают ограниченные системные ресурсы, и те, которые занимают много времени, чтобы построить себя и т. Д. Для этих классов иногда лучше использовать шаблон, например:
class Heavy{
static Heavy first;
static Heavy second;
public static Heavy First{
get{
if(first == null)
first = new Heavy();
return first;
}
}
public static Heavy Second{
get{
if(second == null)
second = new Heavy();
return second;
}
}
}
Еще одно соображение - изменчивость. Является ли ваш класс Color
изменчивым или неизменным? Другими словами, могут ли экземпляры вашего класса изменить их значение, или они всегда, после создания, представляют одно и то же значение?
Если ваш Color
изменен, то единственным правильным способом иметь статический «красный» аксессуар будет ваш второй пример, когда вы создаете новый доступ к каждому доступу. Таким образом, кто-то не может сделать что-то вроде:
Color.Red.G = 255;
и создать единый общий экземпляр Color.Red, фактически, вместо этого представляет собой желтый цвет.
Но также иметь в виду, что в таком случае, как:
for(int y = 0; y < bmp.Height; y++)
for(int x = 0; x < bmp.Width; x++)
if(bmp.GetPixel(x, y) == Color.Red))
MessageBox.Show("Found a red pixel!");
много экземпляров вашего Color
класса будет создан. Разумеется, они будут собирать мусор позже, но это все еще аргумент аргумента для вашей первой конструкции выше (или «Тяжелый» пример, который я дал).
Теперь, если ваш Color
на самом деле является структурой, то это немного разная история. Нет никакого распределения кучи, когда вы создаете структуру, и нет указателя v-таблицы или указателя ссылки, поэтому реальное соображение заключается в том, сколько времени займет ваш конструктор.
Отличный ответ! Удаление шахты, ее поддержание. – Shog9
Это был действительно информативный ответ, который помог мне понять идею использования статики намного больше. Благодаря! –