[英]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.colour
是Colour
類型的,只能使用三個值之一。 將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.