何时在c#中使用带有结构的“new”关键字

时间:2014-10-28 11:42:13

标签: c# .net struct gdi+

我正在使用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。

4 个答案:

答案 0 :(得分:2)

System.Drawing.Color类型的构造函数是privateinternal,这意味着您无法从代码中调用它们。

您需要通过其中包含的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的情况下:前者。请注意,structclass类型都属于这种情况 - 这不是区别因素。

Color的情况下,实际上有比你直接看到的更多的字段;例如,knownColornamestate - 分别到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"  

请注意,BrushIDisposable,这就是为什么你似乎已经把它放了

  using (Brush B1 = new SolidBrush(Color.Red)) {
    ... // Working with brush 
  }