簡體   English   中英

在類構造函數中初始化枚舉的正確方法

[英]Correct way to initialize Enums inside a class constructor

我可能以錯誤的方式看待枚舉,但想確保自己在使用方法方面有正確的理論。

假設我們有一個名為Colour的枚舉。

enum Colour { Red, Green, Blue };

紅色綠色和藍色由0-255值表示。 我正在嘗試在類形狀中初始化該枚舉,但我不確定如何執行此操作。

public class Shape
{

    Colour colour;

    public Shape(Colour c)
    {
         //Some attempts at initialization.


         //Treating It like an object
         this.colour = 
            c{
                255,255,255
            };

         //Again
         this.colour.Red = c.Red
         this.colour.Blue = c.Blue
         this.colour.Green = c.Green

         Colour.red = c.red?


         }
    }
}

就我如何考慮枚舉而言,我可能還有一段距離。 誰能給我一些指導?

在這種情況下,您可能希望Color是struct而不是枚舉。 在C#中,枚舉是單值構造,但是您有三個值(紅色,綠色和藍色)。 這是我可能要做的:

public struct Colour 
{
    private byte red;
    private byte green;
    private byte blue;

    public Colour(byte r, byte g, byte b) 
    {
        this.red = r;
        this.green = g;
        this.blue = b;
    }
}

public class Shape
{
    public Colour Colour { get; private set; }

    public Shape(Colour c)
    {
        this.Colour = c;
    }
}

然后在創建形狀對象時:

var shape = new Shape(new Colour(203, 211, 48));

編輯 :正如克里斯在評論中指出的那樣,您可以簡單地使用框架提供的System.Drawing.Color結構。 上面的示例將簡化為:

using System.Drawing;

public class Shape
{
    public Color Colour { get; private set; }

    public Shape(Color c)
    {
        this.Colour = c;
    }
}

var shape = new Shape(Color.FromArgb(203, 211, 48));

枚舉非常類似於關系數據庫中的類型(或關聯)表。 這是一組選項列表,因此您可以約束一個值。 如果您不太熟悉關系數據庫,則可以將枚舉視為“選擇列表”。 枚舉為我們提供了一個很小的變量選擇列表,而基礎類型(int,byte等)要大得多。

完成您要嘗試的操作的正常方法是測試枚舉值,然后設置對象:

switch(c)
{
   case Colour.Red:
        //Set up red shape here
        break;
   //etc ...
}
this.colour = Colour.Red; // or Colour.Green or whatever

this.colourColour類型的,只能使用三個值之一。 Colour視為類似於Integer的類型,但它只能采用三個值之一,而Integer可以采用Integer.MIN_VALUE..Integer.MAX_VALUE范圍內的任何值。

如果您試圖用它構造RGB顏色,那么這不是正確的方法。 在這種情況下,您正在尋找一個名為Colour的類,該類的red, green and blue分量具有不同的值。

枚舉Colour不具有定義的每個枚舉值的屬性。 值Red,Green和Blue是您的枚舉可能是的值。

您想要執行以下操作: this.colour = Colour.Red ,將您的colour變量設置為red的值。 然后,在代碼的后面,如果您只想根據值是否為紅色來觸發一些代碼,則可以執行以下操作:

if(this.colour == Colour.Red)
{
// Do red specific logic
}

最好使用不可變的結構:

public struct Colour
{
    private readonly byte red;

    private readonly byte green;

    private readonly byte blue;

    public Colour(byte red, byte green, byte blue)
    {
        this.red = red;
        this.green = green;
        this.blue = blue;
    }

    public byte Red
    {
        get
        {
            return this.red;
        }
    }

    public byte Green
    {
        get
        {
            return this.green;
        }
    }

    public byte Blue
    {
        get
        {
            return this.blue;
        }
    }
}

您可以這樣初始化它:

Shape shape = new Shape(new Colour(104, 255, 67));

您可能正在尋找類型安全的枚舉。 它們允許標准枚舉更豐富的行為。

public sealed class Colour
{
  public int RedComponent { get; private set;}
  public int GreenComponent { get; private set;}
  public int BlueComponent { get; private set;}

  public static readonly Colour Red = new Colour(255,0,0);

  private Colour(int red, int green, int blue)
  {
    RedComponent = red;
    GreenComponent = green;
    BlueComponent = blue;
  }
}

然后,您可以使用方法Foo(Colour c){//Do something with c.RedComponent etc.}然后調用Foo(Colour.Red)

您甚至可以按照常規枚舉比較值:

Bar(Colour c)
{
  return c == Colour.Red;
}

如果color是您的枚舉,那么您在構造函數中所需要做的就是說:

this.colour = c;

但是,我對您對“紅色綠色和藍色由0-255值表示”的評論感到有些困惑和擔心。 大多數顏色的紅色,綠色和藍色都有一個值,因此您不只需要枚舉。

類似於下拉框,最容易想到枚舉。 有一組固定值,您必須選擇一個固定值,而不能選擇其他任何一個。 下拉菜單后面可能有一個值,但是通常您會想知道下拉菜單是否顯示“紅色”,而不是它后面的值。 原因是通常使用Enums時會說“ If(colour = Colour.Red)then ....”。

您正在做的事情聽起來更像是.NET類顏色(由美國人命名,這可能就是為什么您沒有找到它的原因)。 它具有R,G,B的屬性以及一堆Static屬性,這些屬性將返回Color類的預定義實例(例如Color.Red),並將返回具有適當RGB集的Color實例。

因此,我認為您可能對Enums的了解不對,並且可能想要的是Color類。

您可能想要的最后一件事是擁有某種類似於以下內容的Factory類:

public Color CreateColor(Colour colEnum)
{
    switch(colEnum)
    case Colour.Red:
    return Color.Red;
    etc.
}

(為混淆名稱以及使用顏色和顏色而道歉)

這樣可以確保您獲得基於枚舉的顏色,並且只能以這種方式創建枚舉中定義的顏色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM