nodejs使用 svg-captcha 做驗證碼及驗證
阿新 • • 發佈:2022-03-08
所有列舉從 System.Enum(繼承自 System.ValueType)繼承。 適用於結構的所有規則也適用於列舉。
C# 程式使用 型別宣告 建立新型別。 型別宣告指定新型別的名稱和成員。 使用者可定義以下六種 C# 型別:類型別、結構型別、介面型別、列舉型別、委託型別和元組值型別。 還可以宣告 record 型別( record struct 或
record class )。
記錄型別具有編譯器合成成員。 記錄主要用於儲存值,關聯行為最少。
一.列舉型別
enum E {...} 格式的使用者定義型別。 enum 型別是一種包含已命名常量的獨特型別。 每個
enum 型別都有一個基礎型別(必須是八種整型型別之一)。 enum 型別的值集與基礎型別的值
集相同。
以下示例顯示了前面兩個列舉的宣告:
但是,如果 enumerator 的型別為已密封型別,並且不存在從型別 enumerator 到 IDisposable 或
IAsyncDisposable 的隱式轉換,則 finally 子句擴充套件為一個空白塊:
列舉型別定義了一組常數值。以下enum聲明瞭定義不同根蔬菜的常數:
public enum SomeRootVegetable { HorseRadish, Radish, Turnip }
還可以定義一個 enum 作為標誌組合使用。 以下宣告為四季聲明瞭一組標誌。 可以隨意搭配季節組合,包括 All 值(包含所有季節):
public enum Seasons {
None = 0,
Summer = 1,
Autumn = 2,
Winter = 4,
Spring = 8,
All = Summer | Autumn | Winter | Spring
}
var turnip = SomeRootVegetable.Turnip;foreach 語句可用於列舉任何集合的元素。 以下程式碼從前一個示例中列舉陣列:
var spring = Seasons.Spring;
var startingOnEquinox = Seasons.Spring | Seasons.Autumn;
var theYear = Seasons.All;
foreach (int item in a)可以使用 await foreach 語句來列舉序列:
{
Console.WriteLine(item);
}
await列舉器的釋放方式取決於 enumerator 型別的特徵。 在常規同步情況下, finally 子句擴充套件為:foreach (var number in GenerateSequence())
{
Console.WriteLine(number);
}
finally常規非同步情況擴充套件為:
{
(enumerator as IDisposable)?.Dispose();
}
finally
{
if (enumerator is IAsyncDisposable asyncDisposable)
await asyncDisposable.DisposeAsync();
}
finally { }如果存在從型別 enumerator 到 IDisposable 的隱式轉換,並且 enumerator 是不可為 null 的值型別,則 finally 子句擴充套件為:
finally { ((IDisposable)enumerator).Dispose(); }二.列舉約束 從 C# 7.3 開始,還可指定 System.Enum 型別作為基類約束。 CLR 始終允許此約束,但 C# 語言不允許。 使用 System.Enum 的泛型提供型別安全的程式設計,快取使用 System.Enum 中靜態方法的結果。 以下示例查詢列舉型別 的所有有效的值,然後生成將這些值對映到其字串表示形式的字典。
public static Dictionary<int, string> EnumNamedValues<T>() where T : System.EnumEnum.GetValues 和 Enum.GetName 使用反射,這會對效能產生影響。 可呼叫 EnumNamedValues 來生成可快取和重 用的集合,而不是重複執行需要反射才能實施的呼叫。 如以下示例所示,可使用它來建立列舉並生成其值和名稱的字典:
{
var result = new Dictionary<int, string>();
var values = Enum.GetValues(typeof(T));
foreach (int item in values)
result.Add(item, Enum.GetName(typeof(T), item));
return result;
}
enum Rainbow列舉型別 是由基礎整型數值型別的一組命名常量定義的值型別。 若要定義列舉型別,請使用 enum 關鍵字並指 定列舉成員 的名稱:
{ Red, Orange, Yellow, Green, Blue, Indigo, Violet }
var map = EnumNamedValues<Rainbow>();
foreach (var pair in map)
Console.WriteLine($"{pair.Key}:\t{pair.Value}");
enum Season { Spring, Summer, Autumn, Winter }
預設情況下,列舉成員的關聯常數值為型別 int ;它們從零開始,並按定義文字順序遞增 1。 可以顯式指定任何
其他整數數值型別作為列舉型別的基礎型別。 還可以顯式指定關聯的常數值,如下面的示例所示:
enum ErrorCode : ushort不能在列舉型別的定義內定義方法。 若要向列舉型別新增功能,請建立擴充套件方法。 列舉型別 E 的預設值是由表示式 (E)0 生成的值,即使零沒有相應的列舉成員也是如此。 可以使用列舉型別,通過一組互斥值或選項組合來表示選項。 若要表示選項組合,請將列舉型別定義為位標誌。 三.轉換 對於任何列舉型別,列舉型別與其基礎整型型別之間存在顯式轉換。 如果將列舉值轉換為其基礎型別,則結果為 列舉成員的關聯整數值。
{
None = 0, Unknown = 1, ConnectionLost = 100, OutlierReading = 200
}
public enum Season { Spring, Summer, Autumn, Winter }使用 Enum.IsDefined 方法來確定列舉型別是否包含具有特定關聯值的列舉成員。 對於任何列舉型別,都存在分別與 System.Enum 型別的裝箱和取消裝箱相互轉換。 四.列舉值和操作 每個列舉型別都定義了一個不同的型別;顯式 列舉轉換 () 需要在列舉型別和整型之間進行轉換,或在兩個列舉類 型之間進行轉換。 列舉型別可以採用的值集不受其列舉成員限制。 特別是,列舉的基礎型別的任何值都可以轉 換為列舉型別,並且是該列舉型別的非重複有效值。 列舉成員具有其包含列舉型別的型別 (除了其他列舉成員初始值設定項中:請參閱 列舉成員) 。 使用關聯值在枚 舉型別中宣告的列舉成員的值 E v 為 (E)v 。 可以在列舉型別的值上使用以下運算子: == 、 != 、、 < 、 > <= 、 >= (列舉比較運算子) 、binary + (加 法運算子) 、二進位制 - (減法運算子) 、、 ( ^ & | 列舉邏輯運算子) 、 ( ~ 按位求補運算子) 以及 ++ ( -- 字尾增量和減量運算子以及字首增量和減量運算子) 。 每個列舉型別都自動派生自類 System.Enum (後者反過來派生自 System.ValueType 和 object ) 。 因此,此類的繼 承方法和屬性可用於列舉型別的值。 五.列舉邏輯舉運算子 每個列舉型別都 E 隱式提供以下預定義的邏輯運算子:
public class EnumConversionExample {
public static void Main()
{
Season a = Season.Autumn;
Console.WriteLine($"Integral value of {a} is {(int)a}");
// output: Integral value of Autumn is 2
var b = (Season)1;
Console.WriteLine(b);
// output: Summer
var c = (Season)4;
Console.WriteLine(c);
// output: 4
}
}
E operator &(E x, E y); E operator |(E x, E y); E operator ^(E x, E y);計算結果 x op y (其中 x 和 y 是具有基礎型別的列舉型別的表示式 E U ), op 是一個邏輯運算子,與計 算完全相同 (E)((U)x op (U)y) 。 換言之,列舉型別邏輯運算子只對兩個運算元的基礎型別執行邏輯運算。