【问题标题】:when to use the "new" keyword with structs in c#何时在 c# 中对结构使用“new”关键字
【发布时间】:2018-09-01 08:56:14
【问题描述】:

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

 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。

【问题讨论】:

  • new Color() 发生在 Color.FromArgb() 内部,这是您要问的吗?
  • 是的,我不明白如何在不调用构造函数的情况下使用 Color
  • FromArgb 是静态方法,没有实例方法
  • 是的,就是我以前不知道这个,谢谢
  • @Ahmed.Marzouk 请你能非常明确地说明什么是“冲突”吗?如果您澄清您的实际问题/疑虑,我们可以提供更多帮助。

标签: c# .net struct gdi+


【解决方案1】:

这里发生的只是有趣的构造函数是非公开的,您必须通过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 值。有些颜色是“已知的”(来自预定义的命名列表);有些颜色是临时的(来自 ARGB 数据)。获取颜色的方式决定了这些附加值。

【讨论】:

    【解决方案2】:

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

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

    至于 cmets,现在问题很明确了:这些方法和属性是 static,这意味着您不会在实例 (new Color().White) 上调用它们,而是在 type 上调用它们> (Color.White)。

    【讨论】:

      【解决方案3】:

      从它的行为来看,方法

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

      很可能会打电话

      new Color()
      

      在其实现中,即它使用 new 运算符声明结构 Color 的一个实例。

      【讨论】:

        【解决方案4】:

        两种实现是相同的,但是

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

        更短。在这种情况下我宁愿使用 shorter

          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 
          }
        

        【讨论】:

          猜你喜欢
          • 2012-03-01
          • 2015-04-15
          • 1970-01-01
          • 2016-04-05
          • 1970-01-01
          • 2019-07-26
          相关资源
          最近更新 更多