枚举的独特强大之处

枚举

  枚举类型声明为一组相关的符号常数定义了一个类型名称。枚举用于“多项选择”场合,就是程序运行时从编译时已经设定的固定数目的“选择”中做出决定。

  枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。例如,假设您必须定义一个变量,该变量的值表示一周中的一天。该变量只能存储七个有意义的值。若要定义这些值,可以使用枚举类型。枚举类型是使用 enum 关键字声明的。

enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };

 默认情况下,枚举中每个元素的基础类型是 int。可以使用冒号指定另一种整数值类型。
  如果不为枚举数列表中的元素指定值,则它们的值将以 1 为增量自动递增。在前面的示例中,Days.Sunday 的值为 0,Days.Monday 的值为 1,依此类推。创建新的 Days 对象时,如果不显式为其赋值,则它将具有默认值 Days.Sunday (0)。创建枚举时,应选择最合理的默认值并赋给它一个零值。这便使得只要在创建枚举时未为其显式赋值,则所创建的全部枚举都将具有该默认值。枚举中大小写敏感,但是建议不要这样。

  注意:System.Enum 类型是所有枚举类型的抽象基类(它是一种与枚举类型的基础类型不同的独特类型),并且从 System.Enum 继承的成员在任何枚举类型中都可用。存在从任何枚举类型到System.Enum 的装箱转换,并且存在从 System.Enum 到任何枚举类型的取消装箱转换。System.Enum 本身不是枚举类型。相反,它是一个类类型,所有枚举类型都是从它派生的。类型 System.Enum 从类型 System.ValueType派生,而后者又从类型 object 派生。在运行时,类型 System.Enum 的值可以是 null 或是对任何枚举类型的装了箱的值的引用。

枚举的优点:
1、枚举可以使代码更易于维护,有助于确保给变量指定合法的、期望的值。
2、枚举使代码更清晰,允许用描述性的名称表示整数值,而不是用含义模糊的数来表示。
3、枚举使代码更易于键入。在给枚举类型的实例赋值时,VS.NET IDE会通过IntelliSense弹出一个包含可接受值的列表框,减少了按键次数,并能够让我们回忆起可能的值

枚举实例

  声明:

public enum TimeOfDay
{
    Moning = 0,
    Afternoon = 1,
    Evening = 2,
};

使用:

  public string getTimeOfDay(TimeOfDay time)
    {
        string result = string.Empty;
        switch (time)
        {
            case TimeOfDay.Moning:
                result = "上午";
                break;
            case TimeOfDay.Afternoon:
                result = "下午";
                break;
            case TimeOfDay.Evening:
                result = "晚上";
                break;
            default:
                result = "未知";
                break;
        }
        return result;
    }

枚举方法

1、获取枚举字符串

TimeOfDay time = TimeOfDay.Afternoon;

Console.WriteLine(time.ToString());//输出:Afternoon

2、Enum.Parse()方法。这个方法带3个参数,第一个参数是要使用的枚举类型。其语法是关键字typeof后跟放在括号中的枚举类名。typeof运算符将在第5章详细论述。第二个参数是要转换的字符串,第三个参数是一个bool,指定在进行转换时是否忽略大小写。最后,注意Enum.Parse()方法实际上返回一个对象引用——我们需要把这个字符串显式转换为需要的枚举类型(这是一个取消装箱操作的例子)。对于上面的代码,将返回1,作为一个对象,对应于TimeOfDay.Afternoon的枚举值。在显式转换为int时,会再次生成1。

TimeOfDay time2 = (TimeOfDay) Enum.Parse(typeof(TimeOfDay), "afternoon", true);

Console.WriteLine((int)time2);//输出1

3、得到枚举的某一值对应的名称

lbOne.Text = Enum.GetName(typeof(TimeOfDay), 0);

lbOne.Text = ((TimeOfDay)0).ToString();//返回:Morning

两种方法都能实现,但是当其值越界(不是枚举所列出的值),就有一定的区别了。大家可以根据自己的需求不同,选择合适的方法。

lbCon.Text = ((TimeOfDay)5).ToString(); //返回:5,如果越界返回原值

this.lbGetName.Text = Enum.GetName(typeof(TimeOfDay), 5); //返回:空字符串,如果越界返回空字符串

4、得到枚举的所有的值

foreach (int i in Enum.GetValues(typeof(TimeOfDay)))
            lbValues.Text += i.ToString();

5、枚举所有的名称

foreach(string temp in Enum.GetNames(typeof(TimeOfDay)))
            lbNames.Text+=temp;

枚举和常量

  优先考虑枚举。

  在C#中,枚举的真正强大之处是它们在后台会实例化为派生于基类System.Enum的结构。这表示可以对它们调用方法,执行有用的任务。注意因为.NET Framework的执行方式,在语法上把枚举当做结构是不会有性能损失的。实际上,一旦代码编译好,枚举就成为基本类型,与int和float类似。

  但是在实际应用中,你也许会发现,我们经常用英语定义枚举类型,因为开发工具本来就是英文开发的,美国人用起来,就直接能够明白枚举类型的含义。其实,我们在开发的时候就多了一步操作,需要对枚举类型进行翻译。没办法,谁让编程语言是英语写的,如果是汉语写的,那我们也就不用翻译了,用起枚举变得很方便了。举个简单的例子,TimeOfDay.Morning一看到Morning,美国人就知道是上午,但是对于中国的使用者来说,可能有很多人就看不懂,这就需要我们进行翻译、解释,就向上面的getTimeOfDay()的方法,其实就是做了翻译工作。所以,在使用枚举的时候,感觉到并不是很方便,有的时候我们还是比较乐意创建常量,然后在类中,声明一个集合来容纳常量和其意义。

  使用常量定义:这种方法固然可行,但是不能保证传入的参数day就是实际限定的。

using System;
using System.Collections.Generic;

public class TimesOfDay
{
    public const int Morning = 0;
    public const int Afternoon = 1;
    public const int Evening = 2;
    public static Dictionary<int, string> list;
    /// <summary>
    /// 获得星期几
    /// </summary>
    /// <param name="day"></param>
    /// <returns></returns>
    public static string getTimeNameOfDay(int time)
    {
        if (list == null || list.Count <= 0)
        {
            list = new Dictionary<int, string>();
            list.Add(Morning, "上午");
            list.Add(Afternoon, "下午");
            list.Add(Evening, "晚上");
        }

        return list[time];
    }
}
时间: 2024-12-28 18:06:15

枚举的独特强大之处的相关文章

linux find命令强大之处

find命令 find pathname -options [-print -exec -ok ...] -print: find命令将匹配的文件输出到标准输出. -exec: find命令对匹配的文件执行该参数所给出的shell命令.相应命令的形式为'command' { } \;,注意{ }和\:之间的空格. -ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行. 例子: $ find /et

JavaScript-//FOR/IN循环。当使用for/in循环遍历关联数组时,就可以清晰地体会到for/in的强大之处。

<script> //FOR/IN循环.当使用for/in循环遍历关联数组时,就可以清晰地体会到for/in的强大之处. function getvalue(portfolio){ var total=2.0; for(stock in portfolio){ //遍历portfolio中的每只股票 var shares=portfolio[stock]; //得到每只股票的份额 var proce=getQuery(stock); //查找股票价格 getQuery()查询部分 total+

EMACS的强大之处

很多人不理解为什么 Emacs 的用户那么多,他们是如此的热爱Emacs,甚至有的人把它当成了"信仰".虽然我没有这个信仰,但是它的确很好,我很喜欢用它编辑各种文件,现在来看看 Emacs 能做什么. 据我所知,Emacs 的能力包括 编辑文本 Emacs 编辑文本的能力是非常强的.它的其它很多功能都是依赖于强大的编辑能力.Emacs 是人性化的设计,它非常可靠,不会莫名其妙弄坏你的文件,用它编辑重要的文本信心有保障. 可能你开头觉得它的键绑定用起来非常不顺手.它有很多长长的"

7种面向对象设计的强大之处

凭什么要用面向对象来编程,不用是否可以?今天我们通过讲这么几个设计原则来说明为什么要用面向对象,它的好处在哪里. 一.单一职责原则: 全称:“Single-Responsibility Principle”面向对象设计 说明:就一个类而言,应该只专注于做一件事和仅有一个引起它变化的原因.所谓职责,我们可以理解他为功能,就是设计的这个类功能应该只有一个,而不是两个或更多.也可以理解为引用变化的原因,当你发现有两个变化会要求我们修改这个类,那么你就要考虑撤分这个类了.因为职责是变化的一个轴线,当需求

Swift之map函数的强大之处

CollectionType Map 在CollectionType的extension中map方法的定义: extension CollectionType { /// Return an `Array` containing the results of mapping `transform` /// over `self`. /// /// - Complexity: O(N). @warn_unused_result @rethrows public func map<T>(@noes

简单工厂模式的强大之处

工厂模式专门负责将大量有共同接口的类实例化.工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类.工厂模式有以下几种形态: 简单工厂(Simple Factory)模式 工厂方法(Factory Method)模式 抽象工厂(Abstract Factory)模式 一. 简单工厂(Simple Factory)模式 Simple Factory模式根据提供给它的数据,返回几个可能类中的一个类的实例.通常它返回的类都有一个公共的父类和公共的方法. Simple Factory模式

jq siblings()的强大之处

在事件处理的方法里 经常遇到自己做什么效果 其他节点就做反之效果 如果用判断 可处理 但代码太啰嗦不够简单 siblings()就可以解决这一切的麻烦 意思就是 除啦我之外的其他兄弟节点 这样可以做2个不同的效果用法:$(this).toggle().siblings().hide();this是显示或者隐藏的 除啦this之外 其他都隐藏 非常好用

python爬虫学习日历2【基于ubuntu系统】beautifulsoup的强大之处

前一篇小文中就提到了python的requests库可以获取网络编码中的所有内容,我们获取了自然就必须对它进行加工处理,就像我们学习一样,一本书,我们可以轻易的获取,但是它究竟是在讲哲学还是讲历史呢还是其他云云,需要我们认真分析,取其精华去其糟粕.而在python当然也有做这个工作的'人',就是我们需要安装库中的'beautifulsoup' 我本来是想继续用昨天的网址来说明的,不过效果不佳,我一会这这篇小文的最后会附上源代码,供各位朋友或者自己再次的学习 html_doc = ""&

java比c++强大之处jvm垃圾收集算法

java可以自动进行垃圾收集,c++需要手动释放内存,这个功能将程序员解放出来,能将更多的注意力放在需要实现的业务上,这也是java相对c++的一个巨大优势,jvm有哪些垃圾收集算法呢? 标记清除算法:算法分为标记和清除两个阶段,首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象 从图中可以看出这种算法的缺点在于,垃圾被回收以后造成了大量不连续的内存碎片.碎片太多可能会导致以后需要分配较大对象时,无法找到连续的足够内存从而频繁触发垃圾收集,降低系统效率. 复制算法:为了解决"标记