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

问题描述 投票:0回答:4

我正在使用GDI +并需要创建一个Brush或Pen。在大多数情况下,我应该使用“颜色结构”。搜索我看到两种不同的风格:一种是这样的:

 Brush B1 = new SolidBrush(Color.FromArgb(255, 0, 0));

另一个是:

Color myColor;
myColor = Color.FromArgb(255,0,0);
Brush B2 = new SolidBrush(myColor);

任何人都可以描述我们如何使用Color而不使用调用默认构造函数的new运算符声明Struct的实例。

c# .net struct gdi+
4个回答
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
投票

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

你需要通过它包含的given static methods and properties实例化一种颜色,比如Color.FromArgb()Color.White

至于评论,现在使问题清楚:那些方法和属性是static,这意味着你不在实例(new Color().White)上调用它们,而是在类型(Color.White)上调用它们。


0
投票

从它的行为来看,这个方法

Color.FromArgb(int red, int green, int blue)

最有可能打电话

new Color()

在它的实现中,即它使用new运算符声明struct Color的实例。


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 
  }
© www.soinside.com 2019 - 2024. All rights reserved.