我正在使用GDI +,需要创建一个Brush或Pen。在大多数情况下,我应该使用"颜色Struct"。搜索我看到两种不同的风格:一种是这样的:
Brush B1 = new SolidBrush(Color.FromArgb(255, 0, 0));
另一个是:
Color myColor;
myColor = Color.FromArgb(255,0,0);
Brush B2 = new SolidBrush(myColor);
任何人都可以描述我们如何在不使用调用默认构造函数的new运算符声明Struct实例的情况下使用Color。
答案 0 :(得分:2)
System.Drawing.Color
类型的构造函数是private
和internal
,这意味着您无法从代码中调用它们。
您需要通过其中包含的given static methods and properties实例化颜色,例如Color.FromArgb()
或Color.White
。
至于评论,现在问题清楚:这些方法和属性是static,这意味着你不会在实例(new Color().White
)上调用它们,而是在< em> type (Color.White
)。
答案 1 :(得分:2)
这里发生的一切是有趣的构造函数是非公共的,您必须通过static
实用程序方法创建值。您可以在自己的代码中轻松实现相同的目标:
struct Indirect
{
private readonly int value;
private Indirect(int value)
{
this.value = value;
}
public static Indirect Create(int value)
{
return new Indirect(value);
}
}
struct Direct
{
private readonly int value;
public Direct(int value)
{
this.value = value;
}
}
class Program
{
static void Main()
{
var x = Indirect.Create(42);
var y = new Direct(42);
}
}
有时预期的用法是调用者使用new
;有时预期的用法是调用者从辅助方法获取值。在Color
的情况下:后者。在SolidBrush
的情况下:前者。请注意,struct
和class
类型都属于这种情况 - 这不是区别因素。
在Color
的情况下,实际上有比你直接看到的更多的字段;例如,knownColor
,name
,state
- 分别到ARGB值。一些颜色是“已知的”(来自预定义的命名列表);某些颜色是ad-hoc(来自ARGB数据)。获得颜色的方式决定了这些附加值。
答案 2 :(得分:0)
从行为来看,方法
Color.FromArgb(int red, int green, int blue)
最有可能打电话
new Color()
在其实现中,即它使用new运算符声明struct Color的实例。
答案 3 :(得分:0)
两种实现方式相同,但是
Brush B1 = new SolidBrush(Color.FromArgb(255, 0, 0));
更短。在
的情况下,我宁愿使用更短的 Brush B1 = new SolidBrush(Color.Red); // R = 255, G = 0, B = 0 is just "Red"
请注意,Brush
是IDisposable
,这就是为什么你似乎已经把它放了
using (Brush B1 = new SolidBrush(Color.Red)) {
... // Working with brush
}