前言

本篇讲述枚举和名称空间。

01

枚举

首先需要明确枚举的概念:枚举是用户定义的整数类型。使用枚举的目标是,使用一组容易记忆的名称,来使得代码更容易编写和维护。

我们对比枚举的定义和类的定义,会发现它们有像的地方,有不像的地方,这不同之处体现了枚举的特性。我们按下图举例:

  1. C#中,一般习惯于一个文件定义一个类。而一个项目中可能有大量枚举,一般建议将多个枚举定义在一个文件中。
  2. 很多书中对于枚举只有一个称谓“枚举”,但是,如上图,到底是OrgType1是枚举,还是Vendor是枚举?实际上准确的说,OrgType1是枚举,Vendor是枚举值,或者叫枚举成员。枚举的枚举成员和类的成员本质上是一样的,都可以通过反射获得成员的定义。枚举值本质是System.Enum,是一个结构(struct)。
  3. 枚举值可以强制指定,比如OrgType2。不指定时默认从0开始计数,比如OrgType1。OrgType1和OrgType2的枚举值是一样的,都是0和1。而OrgType3的枚举值是100和101。枚举值也就可以强制转换成int

int value = (int)OrgType1.Vendor;

枚举值被设计成简单的整数,也是可以理解的,这使得在语言层面上枚举的实现是简约的,高效的。

  1. 枚举的一个常用功能是将字符串转换为枚举值

var enumTemp = (OrgType1)Enum.Parse(typeof(OrgType1), “Vendor”);

从语言层面上看,枚举定义的可谓非常完美。因为语言层面上,实际上我们只需要使用枚举值(name)就行了,完全不需要关注枚举值背后的int值。但是,当我们要将枚举值序列化时,就出现问题了。

所谓序列化,也就是将枚举数据存储起来,一个常用的应用场景就是存储到数据库的某个字段中。在序列化时,枚举特别适合表示数据库表的状态列,而存储在数据库中的状态列有两种,一种是字符串状态值,一种是int状态值,也可能两者混合。比如:

我们发现,如果要把上述两种状态值都用枚举表示,前者要使用枚举值的表面量(name)来表示,后者要用int值来表示。比如以上两种定义方式,对应的枚举会定义为:

而它们的序列化和反序列化的方式,也各不相同:

针对不同的枚举定义,需要使用不同的序列化和反序列化方式,会使编程变得繁琐,有没有将两者统一的方法呢?我的做法是,使用特性。

如上图,不管是什么样的枚举定义方式,都使用特性EnumItemValue来描述。进行一定的封装之后,枚举的序列化和反序列化就统一为一种模式了:

bill.Status = EnumChangeBillStatus.Data1.GetEnumItemValue();

实现代码:

02

名称空间

名称空间

名称空间就是namespace定义。特别重要的是,名称空间是一种逻辑组合,而不是物理组合。

类似的,在Visual Studio中,也有类似“名称空间”或者“路径”,分别属于“逻辑组合”或者“物理组合”。

解决方案目录:解决方案目录属于逻辑组合,它并不对应磁盘中的实际目录,而只是解决方案文件中的一个逻辑位置定义。

项目中的目录:项目中的目录对应磁盘上实际的文件夹目录,是一个物理位置。

名称空间可以嵌套,比如下图中,上面的嵌套声明方式和下面的声明方式,效果是等同的。不过我们一般不会用上面这种方式,而用下面的方式:

Using

引入类之前一般需要通过using引入类所在的名称空间,从而方便类的引用。如:

using System;

using MJ = BL.Test.ConsoleTest.CSharp高级编程.枚举;

如上的例子上,还用到了别名MJ。一般在碰到在不同的namespace下有两个同名类时,会使用别名。访问别名下的类,使用别名修饰符 ::

var value1 = (int)MJ.OrgType1.Vendor;

var value2 = (int)MJ::OrgType1.Vendor;

我发现,使用::和.都能访问别名下的类,那为什么C#要特别设计“别名修饰符”呢?暂时不能理解。

下一篇将完成第二章的解读。会讲一些细小的特性和功能:Main方法,控制台,注释,预处理指令,编程规范等。

觉得文章有意义的话,请动动手指,分享给朋友一起来共同学习进步。

欢迎关注本人微信公众号,更及时的关注最新文章(每周三篇原创文章,以及多篇专题文章):

附文:

(转)C# Enum,Int,String的互相转换 枚举转换

[C#基语法]之C#命名空间(namespace)

上一篇:解读经典《C#高级编程》第七版 Page38-45.核心C#.Chapter2

解读经典《C#高级编程》第七版 Page45-50.核心C#.Chapter2的更多相关文章

  1. c#高级编程第七版 学习笔记 第一章 .NET体系结构

    第一章      .NET体系结构 本章内容: 编译和运行面向.NET的代码 Microsoft中间语言(Microsoft Intermediate Language,MSIL或简称IL)的优点 值 ...

  2. c#高级编程第七版 学习笔记 第二章 核心c#

    第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用S ...

  3. c#高级编程第七版 学习笔记 第三章 对象和类型

    第三章 对象和类型 本章的内容: 类和结构的区别 类成员 按值和按引用传送参数 方法重载 构造函数和静态构造函数 只读字段 部分类 静态类 Object类,其他类型都从该类派生而来 3.1 类和结构 ...

  4. C#高级编程第9版 第二章 核心C# 读后笔记

    System命名空间包含了最常用的.NET类型.对应前面第一章的.NET基类.可以这样理解:.NET类提供了大部分的功能,而C#语言本身是提供了规则. pseudo-code,哈哈,秀逗code.伪代 ...

  5. ASP.NET MVC 4高级编程(第4版)

    <ASP.NET MVC 4高级编程(第4版)> 基本信息 作者: (美)Jon Galloway    Phil Haack    Brad Wilson    K. Scott All ...

  6. 《UNIX环境高级编程(第3版)》

    <UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ...

  7. 【转】apue《UNIX环境高级编程第三版》第一章答案详解

    原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此 ...

  8. Linux - Unix环境高级编程(第三版) 代码编译

    Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebo ...

  9. Unix环境高级编程第三版中实例代码如何在自己的linux上运行的问题

    学习Linux已经有2个月了,最近被期末考试把进度耽误了,前几天把Unix环境高级编程看了两章,感觉对Linux的整体有了一些思路,今天尝试着对第一章涉及到的一个简单的交互式shell编译运行一下,结 ...

  10. C#高级编程笔记之第二章:核心C#

    变量的初始化和作用域 C#的预定义数据类型 流控制 枚举 名称空间 预处理命令 C#编程的推荐规则和约定 变量的初始化和作用域 初始化 C#有两个方法可以一确保变量在使用前进行了初始化: 变量是字段, ...

随机推荐

  1. mysql 循环写入数据库

    测试过程经常用到插入数据 我们首先建一个函数: delimiter # create procedure test_double() begin declare i int default 0; de ...

  2. [已解决]Cannot find one or more components.Please reinstall the application

    Microsoft SQL Server Management Studio 17,一段时间未用出现Cannot find one or more components.Please reinstal ...

  3. MFC常见问题总结

    1. c++中的函数前面加个LRESULT是什么意思啊?在微软vc提供的头文件中有定义在winnt.h中typedef long LONG;在windef.h中typedef LONG LRESULT ...

  4. 【设计经验】4、SERDES关键技术总结

    一.SERDES介绍 随着大数据的兴起以及信息技术的快速发展,数据传输对总线带宽的要求越来越高,并行传输技术的发展受到了时序同步困难.信号偏移严重,抗干扰能力弱以及设计复杂度高等一系列问题的阻碍.与并 ...

  5. 安全圈玩起了直播,"学霸”带你玩转CTF

    [i春秋]安全圈玩起了直播,"学霸”带你玩转CTF 跟着学霸(汪神)打CTF,摸清CTF套路 汪神,是浙江大学电气工程系的“风云人物”,曾因首度破解特斯拉汽车安全系统而名声大噪.本套题目是自 ...

  6. 2016 安全圈玩起了直播,“学霸”带你玩转CTF_i春秋学院

    2016安全圈玩起了直播,“学霸”带你玩转CTF_i春秋学院 从小就很羡慕学霸的脑子,总有很简单很便捷的方法解出难题来,所以对于他们的笔记总会疯狂地想占有和copy.那么,对CTF大神自己总结出来的赛 ...

  7. Android JNI 学习(三):JNI 数据类型和数据结构

    本文我们来讨论一下JNI如何将Java类型映射到本机C类型. 一.基本数据类型 如下图表整理了Java基本类型和native对应的关系: Java类型 Native类型 描述 boolean jboo ...

  8. Chart 图表开源项目总结

    在Android开发中,我们不免会遇到图表展示的需求,以下是本人之前star的悬浮窗的开源项目,供大家参考: 1. WilliamChart:创建图表的Android库 2. HelloCharts: ...

  9. MySQL InnoDB 行记录格式(ROW_FORMAT)

    MySQL InnoDB 行记录格式(ROW_FORMAT) 一.行记录格式的分类和介绍 在早期的InnoDB版本中,由于文件格式只有一种,因此不需要为此文件格式命名.随着InnoDB引擎的发展,开发 ...

  10. Javascript高级编程学习笔记(76)—— 表单(4)选择文本

    文本框脚本 在HTML中文本框有两种实现方式: <input> <textarea> 这两种实现方式虽然在多数情况下表现一致,但是两者之间仍存在许多重要区别 对于<inp ...