解读经典《C#高级编程》第七版 Page45-50.核心C#.Chapter2

前言

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

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

原文地址:https://www.cnblogs.com/holyknight17/p/10215981.html

时间: 2024-10-20 13:49:40

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

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

第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用System.Console执行控制台I/O 使用内部注释和文档编制功能 预处理器指令 C#编程的推荐规则和约定 2.1 第一个c#程序 2.1.1 代码 using System; namespace Wrox { Public class MyFirstClass { static void Ma

随笔C#高级编程(第七版)

一.对象   和   类型 结构和类的区别在于它们的存储方式.访问方式(类存储在堆(heap)上的引用类型,而结构是存储在栈(stack)上的值类型 ) ps:区别  引用类型  和  值类型  ,请回忆(两个孩子手上的棒棒糖)   和   (两个孩子抢遥控器看电视)的例子 ref 参数迫使变量通过  引用传递的方式参与方法,当然调用该方法时也需要添加 ref 关键字 out 关键字 使得函数可以有多个返回 C#  方法重载的一些小限制: 两个方法不能仅在返回类型上有区别 两个方法不能仅根据参数

《C#高级编程第七版》多线程之Events

按照范例,将代码稍加变动,打出来了,如下所示 using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Text; namespace Demo2 { class Program { static void Main(string[] args) { const int taskcount

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

第三章 对象和类型 本章的内容: 类和结构的区别 类成员 按值和按引用传送参数 方法重载 构造函数和静态构造函数 只读字段 部分类 静态类 Object类,其他类型都从该类派生而来 3.1 类和结构 类和结构都是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法 结构和类的区别是他们在内存中的存储方式.访问方式(类是存储在堆上的引用类型,而结构是存储在栈上的值类型)和他们的一些特征(如结构不支持继承).较小的数据类型使用结构可提高性能.但在语法上,结构和类非常相似,主要的区别是使用

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

System命名空间包含了最常用的.NET类型.对应前面第一章的.NET基类.可以这样理解:.NET类提供了大部分的功能,而C#语言本身是提供了规则. pseudo-code,哈哈,秀逗code.伪代码. 必须初始化变量才能编译,否则报错.有些情况下,没有显示初始化,会被编译器默认为0去编译. 实例化一个对象需要用new关键字. 类型推断使用var 关键字. var i= 0: 系统会推断出 i 为C#的int类型,为.NET的System.Int32类型. for while或类似语句中声明的

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

<UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison-Wesley Professional Computing Series) 原出版社: Addison-Wesley Professional 作者: (美)W. Richard Stevens    Stephen A. Rago 译者: 戚正伟 张亚英 尤晋元 出版社:人民邮电出版社 ISBN:9787

《Python高级编程(第2版)》中文版PDF+英文版PDF+源代码

下载:https://pan.baidu.com/s/1W11Takw5zNYknzbGL_DZcw更多分享:https://pan.baidu.com/s/1yBmXcivRHZhepu2R1Ol11Q <Python高级编程(第2版)>中文版PDF+英文版PDF+源代码中文版PDF,421页,带书签目录:英文版PDF,536页,带书签目录:配套源代码.经典书籍,讲解详细. 基于Python 3.5版本进行讲解,通过13章的内容,深度揭示了Python编程的高级技巧.从Python语言及其社

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

Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebook.com/code3e.html 2. 安装依赖库:sudo apt-get install libbsd-dev  3. 进入下载目录make 4. 复制头文件和动态链接库 sudo cp ./include/apue.h /usr/include/ sudo cp ./lib/libapue

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

原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此,我要感谢网易的一个工程师朋友和室友,没有他们,我不会开始真正的学习这本书,希望大家以后开始慢慢进步.废话少说,直接上课后习题了. UNIX高级编程第一章习题答案: 1.1在系统上验证,除根目录外,目录l和l l是不同的. 答:这个验证有很多方法可使用命令ls .cd.vim等,目录.指向当前目录,目录..指

中文版C#高级编程第8版中的翻译错误

第180页,倒数第三行. 英文原文: If you overload == and !=, you must also override the Equals() and GetHashCode() methods inherited from System.Object; 中文译文: 在重载"=="和"!="时,还必须重载(应该是:重写)从System.Object中继承的Equals()和GetHashCode()方法. 中文版C#高级编程第8版中的翻译错误,布