我猜你可能已经知道框架提供了一个Color
结构。我猜你正在创建一个Color
只是为了练习的课程。
static
尽管您使用正确,但您对关键字的含义表示不确定。当static
应用于类或结构的成员时,意味着该成员作为一个整体属于该类,而不适用于单个实例。静态数据成员(字段)只创建一次;实例没有自己的副本。静态函数(方法和属性)在没有实例引用的情况下被调用。
就内存使用而言,在您的情况下我不会太担心。您的Color
类在每个实例中使用的字节数不应超过几个字节(例如,框架的Color
结构将红色、绿色、蓝色和 alpha 存储在一个 32 位的int
.)中。如果你Color
真的是 aclass
而不是 a struct
,那么你会有更多的字节开销(每个实例都有一个额外的 32 位 v-table/typeinfo 指针,每个引用都是一个额外的 32 位),但是即便如此,您说的是每个实例大约 12 个字节。如果您预定义了 100 种不同的颜色,您将使用 <= 1200 字节。真的没什么大不了的。
不过,延迟实例化是有原因的。有些类确实会使用大量内存,有些类会占用有限的系统资源,有些类需要很长时间才能构建自己,等等。对于这些类,有时最好使用如下模式:
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
实际上是一个结构,那么这是一个略有不同的故事。当你是一个结构时没有堆分配new
,也没有 v-table 或引用指针,所以真正的考虑是你的构造函数需要多长时间。