对 Enum.GetValues() 的 return 值感到困惑
Confusion about return value of Enum.GetValues()
我正在看一本书中关于枚举的内容,给出了以下代码示例:
namespace FunWithEnums
{
enum EmpType : byte
{
Manager = 10,
Grunt = 1,
Contractor = 100,
VicePresident = 9
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("**** Fun with Enums *****");
EmpType emp = EmpType.Contractor;
EvaluateEnum(emp);
Console.ReadLine();
}
static void EvaluateEnum(System.Enum e)
{
Array enumData = Enum.GetValues(e.GetType());
for (int i =0; i < enumData.Length; i++)
{
Console.WriteLine("Name: {0}, Value: {0:D}", enumData.GetValue(i));
}
Console.WriteLine();
}
}
我对 forloop 中打印的内容感到很困惑。
输出是
Name: Grunt, Value: 1
Name: VicePresident, Value: 9
Name: Manager, Value: 10
Name: Contractor, Value: 100
但是它如何获得每个枚举元素的名称和值呢?根据 Microsoft 文档,Array enumData = Enum.GetValues(e.GetType());
应该只是 return “指定枚举中常量值的数组。”我假设通过常数,它指的是 "Manager"、"Grunt"、"Contractor"、"VicePresident",而不是 10、1、100 和 9。那么为什么它是 return计算每一对而不只是员工类型的名称?此外,以下代码的输出 Console.WriteLine(enumData.GetValue(1));
return 只是一个值,即 "VicePresident" 而不是像 forloop 中那样 return 数字 9。这是为什么?
Console.WriteLine(String, Object)
uses the "Composite Formatting" features of .NET, and when you provide it an enum value, it applies the "Enumeration Format Strings":
G or g
Displays the enumeration entry as a string value, if
possible, and otherwise displays the integer value of the current
instance.
因此您可以在字符串中嵌入 {0:G}
来替换枚举 name。尽管没有提到,{0:G}
等同于 {0}
,这是您在使用 Console.WriteLine("Name: {0},...
.
的示例中观察到的
D or d
Displays the enumeration entry as an integer value in the shortest
representation possible.
因此您可以在字符串中嵌入 {0:D}
来替换枚举 值 。
代码显式打印了两次值
Console.WriteLine("Name: {0}, Value: {0:D}", enumData.GetValue(i));
第一个 {0}
仅打印原始值,第二个具有指定的格式 (D
)
GetValue returns 一个枚举值 object。此对象属于 class(枚举 class),它将使用其名称转换为字符串,或使用其值转换为整数。因此,当字符串格式需要一个字符串时,它就会得到那个。当它要求小数(格式说明符 D)时,枚举值为其提供默认的基础值,即 Int32,它很容易转换为小数。
正在按给定格式打印这些值。尝试删除 {0:D},并只使用 {0}。与在创建的列表中一样,为列表指定类型:
Array enumData = Enum.GetValues(e.GetType());
我正在看一本书中关于枚举的内容,给出了以下代码示例:
namespace FunWithEnums
{
enum EmpType : byte
{
Manager = 10,
Grunt = 1,
Contractor = 100,
VicePresident = 9
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("**** Fun with Enums *****");
EmpType emp = EmpType.Contractor;
EvaluateEnum(emp);
Console.ReadLine();
}
static void EvaluateEnum(System.Enum e)
{
Array enumData = Enum.GetValues(e.GetType());
for (int i =0; i < enumData.Length; i++)
{
Console.WriteLine("Name: {0}, Value: {0:D}", enumData.GetValue(i));
}
Console.WriteLine();
}
}
我对 forloop 中打印的内容感到很困惑。 输出是
Name: Grunt, Value: 1
Name: VicePresident, Value: 9
Name: Manager, Value: 10
Name: Contractor, Value: 100
但是它如何获得每个枚举元素的名称和值呢?根据 Microsoft 文档,Array enumData = Enum.GetValues(e.GetType());
应该只是 return “指定枚举中常量值的数组。”我假设通过常数,它指的是 "Manager"、"Grunt"、"Contractor"、"VicePresident",而不是 10、1、100 和 9。那么为什么它是 return计算每一对而不只是员工类型的名称?此外,以下代码的输出 Console.WriteLine(enumData.GetValue(1));
return 只是一个值,即 "VicePresident" 而不是像 forloop 中那样 return 数字 9。这是为什么?
Console.WriteLine(String, Object)
uses the "Composite Formatting" features of .NET, and when you provide it an enum value, it applies the "Enumeration Format Strings":
G or g
Displays the enumeration entry as a string value, if possible, and otherwise displays the integer value of the current instance.
因此您可以在字符串中嵌入 {0:G}
来替换枚举 name。尽管没有提到,{0:G}
等同于 {0}
,这是您在使用 Console.WriteLine("Name: {0},...
.
D or d
Displays the enumeration entry as an integer value in the shortest representation possible.
因此您可以在字符串中嵌入 {0:D}
来替换枚举 值 。
代码显式打印了两次值
Console.WriteLine("Name: {0}, Value: {0:D}", enumData.GetValue(i));
第一个 {0}
仅打印原始值,第二个具有指定的格式 (D
)
GetValue returns 一个枚举值 object。此对象属于 class(枚举 class),它将使用其名称转换为字符串,或使用其值转换为整数。因此,当字符串格式需要一个字符串时,它就会得到那个。当它要求小数(格式说明符 D)时,枚举值为其提供默认的基础值,即 Int32,它很容易转换为小数。
正在按给定格式打印这些值。尝试删除 {0:D},并只使用 {0}。与在创建的列表中一样,为列表指定类型:
Array enumData = Enum.GetValues(e.GetType());