文章目录

  • 介绍
  • 具体案例
    • 指定枚举的基础类型
    • 常量的标识位运算(Enum)
    • 获取枚举中常量的名称
    • 检查枚举实例中是否包含某个标志位
    • 在运行阶段检索特性实例
  • 总结

介绍

随着.net core越来越流行,对.net core 基础知识的了解,实际应用等相关的知识也应该有所了解。所以就有了这篇文章,案例都是来自阅读的书籍,或者实际工作中感觉比较有用的应用。分享亦总结。

本文主要介绍 .net core 相关的面向对象编程案例。

具体案例

指定枚举的基础类型

【导语】

在声明枚举类型的时候,如果不指定其基础类型,则其常量值默认为 int 类型。在有特殊需求的情况下,可以明确指定枚举中常量值的基础类型。必须使用整数值的基础类型,如intbyteuintlongulong等,不能使用非整性的类型,如 double

【操作流程】

步骤1:新建控制台应用程序项目。

步骤2:声明一个枚举类型,指定其常量值基于 byte 类型。

public enum ReadMode : byte
{NewFile = 1,OpenCurrent = 2,Saved = 3
}

步骤3:再声明一个枚举类型,常量类型为 uint

public enum PictureQt : uint
{HQ = 4,LQ = 12,MQ = 7
}

指定枚举常量的基础类型使用半角冒号来表示,和类之间的基础相似。

常量的标识位运算(Enum)

【导语】

因为枚举类型的基础类型是整数类型,因此,枚举的常量值之间也可以进行为运算。即按位“与”(And)、按位“或”(Or),以及取反(Not)、异或(Xor)等。

支持安危运算的枚举类型在声明时需要应用 FlagsAttribute,例如以下形式。

[FlagsAttribute]
enum MultiHue : short
{None = 0,Black = 1,Red = 2,Blue = 4,Green = 8
}

如果希望枚举类型的值支持位运算,不仅要在类型定义时使用FlagsAttribute,还必须注意每个常量值的合理安排。一般来说,常量值是以 2 位底数的幂运算结果。例如 2、4、8、16、32 等。每个常量值只有作为标志的二进制位才为 1,其他位都为 0

例如上面举例的 MultiHue 枚举,None 值的常量值为 0,转换为二进制为 0000Black 值的常量值转换为二进制为 0001;Red值的常量值转换为二进制为0010;Blue 值的常量值转换为二进制为 0100Green 值的常量值转换为二进制为 1000

如果将 BlackRed 两个值组合,得到的结果为 0011,如果将 BlueGreen 两个值进行组合,得到的结果为 1100。如果将 MultiHue 枚举的所有值都进行组合,得到的结果为 1111

【操作流程】

步骤1:新建控制台应用程序项目。

步骤2:声明一个枚举类型,并应用 FlagsAttribute,使其支持按位运算。

[Flags]
enum TrackItem
{Track1 = 1,Track2 = 2,Track3 = 4,Track4 = 8,Track5 = 16
}

注意:虽然在不应用 FlagsAttribute 的情况下,枚举的常量值仍然能够进行按位运算,但是当调用枚举实例的 ToString 方法时,是无法正确返回常量值的名称的。如果应用了 FlagsAttribute,调用 ToString 方法可以得到已经组合的常量名称列表,并以半角逗号隔开。

步骤3:在项目模板生成的 Program 类中声明一个静态方法,用于在屏幕上输出经过组合运算后的枚举实例的常量名称以及常量的二进制值。

static void OutputInfo(TrackItem t)
{string p1 = t.ToString();string p2 = Convert.ToString((int)t, 2).PadLeft(5, '0');Console.WriteLine($"{p2,-4} -- {p1}");
}

步骤4:在 Main 方法中,声明几个枚举变量,并赋予经过组合后的枚举值,然后调用 OutputInfo 方法进行测试。

// 将 Track1 与 Track2 组合
TrackItem t1 = TrackItem.Track1 | TrackItem.Track2;
OutputInfo(t1);
// 将 Track3、Track4、Track5 进行组合
TrackItem t2 = TrackItem.Track3 | TrackItem.Track4 | TrackItem.Track5;
OutputInfo(t2);
// 将枚举中所有值都进行组合
TrackItem t3 = TrackItem.Track1 | TrackItem.Track2 | TrackItem.Track3 | TrackItemTrack4 | TrackItem.Track5;
OutputInfo(t3);

步骤5:运行应用程序项目,输出如下。

步骤6:在声明枚举类型的时候,是允许使用表达式的计算记过来给常量赋值的。可以在上面的 TrackItem 枚举中添加一个 AllTracks 常量,然后它的值就是前面 5 个常量的值的组合。

[Flags]
enum TrackItem
{Track1 = 1,Track2 = 2,Track3 = 4,Track4 = 8,Track5 = 16,AllTracks = Track1 | Track2 | Track3 | Track4 | Track5
}

获取枚举中常量的名称

【导语】

.NET 类库中有一个 Enum 类,它是枚举类型的隐式基类。在代码中声明枚举类型时无需要继承 Enum 类。Enum 类提供一系列方法(包含实例方法和静态方法),可以对枚举类型进行各种处理。例如,本实例需要获取枚举类型中常量的名称,在 Enum 类中有两个静态方法可以完成此功能。

其中,GetName 方法只能获取枚举类型中单个常量的名称, 因此调用该方法时需要提供一个具体的常量;而GetNames方法可以获取枚举类型中所有已经定义的常量的名称,以字符串数组的形式返回。

【操作流程】

步骤1:新建控制台应用程序项目。

步骤2:在 System 命名空间下有一个 DayOfWeek 枚举,它定义了一周七天的名称(从星期天到星期六)。可以使用 Enum 类的 GetNames 方法获取 DayOfWeek 枚举中所有的常量的名称。

string[] days = Enum.GetNames(typeof(DayOfWeek));

步骤3:使用foreach循环把字符串数组中的元素输出到屏幕上。

foreach(string d in days)
{Console.WriteLine(d);
}

步骤4:运行应用程序项目,输出如下。

检查枚举实例中是否包含某个标志位

【导语】

枚举类型的常量值可以组合起来使用,在实际开发中,经常需要检查枚举实例中是否包含指定的标志位。例如,枚举类型 Demo 中定义了三个常量,分别命名为 A、B、C,假设声明了一个变量 k,并在赋值时将 AB 组合。

Demo k = Demo.A | Deom.B;

在代码中有两种方法可以检查变量 k 的值中有没有包含 A。一种方法就是把变量 kDemo.A 的值进行按位“与”运算。由于“与”运算时只有两个标志位同时为 1 时才能得到结果 1,因此,把变量 kDemo.A 的值进行按位“与”运算后,如果变量 k 中包含 A 的标志位,那么运算结果就所示 Demo.A,因为其他标志位在运算后都是 0;如果变量 k 中没有包含 A 的标志位,那么跟 Demo.A 进行按位“与”运算后的结果就是 0。还有一种方法,可以调用枚举类型实例的 HasFlag 方法,通过参数传递要被检查的常量值,如果变量中包含指定的标志位,HasFlag 方法返回 true,否则返回 false

【操作流程】

步骤1:新建控制台应用程序项目。

步骤2:声明一个枚举类型 Test,并在其上面应用 FlagsAttribute,表示它支持组合使用。

[Flags]
enum Test
{Mode1, Mode2, Mode3
}

步骤3:声明一个枚举类型的变量,并将 Mode2Mode3 两个常量组合赋值。

Test t = Test.Mode2 | Test.Mode3;

步骤4:使用 HasFlag 方法检查变量中是否包含了 Mode3 标志位。

bool b = t.HasFlag(Test.Mode3);

步骤5:在声明一个变量,并将 Mode1Mode2Mode3 三个常量组合赋值。

Test t2 = Test.Mode1 | Test.Mode2 | Test.Mode3;

步骤6:通过进行按位“与”运算来检查变量中是偶发包含 Mode1 标志位。

bool b2 = (t2 & Test.Mode1) == Test.Mode1;

在运行阶段检索特性实例

【导语】

特性类的作用是为了代码对象应用一些辅助的信息,因此在应用程序运行阶段,可以检查特性类实例的相关数据,对数据进行验证。

要实现在运行阶段检索特性,需要用到反射技术,即在运行时获取类型以及其成员相关的信息,然后在检查出已应用特性的对象。

通过 Type 类可以得到各种代码对象(类、方法、属性、字段等)的信息,它们的共同基类是 MemberInfo 类,通过 GetCustomAttribute 扩展方法(在 CustomAttributeExtensions 类中定义)可以直接检索到已应用的特性实例。

【操作流程】

步骤1:新建控制台应用程序项目。

步骤2:声明一个特性类,并指定它只能应用于属性成员。

[AttributeUsage(AttributeTargets.Property)]
public class MyAttribute : Attribute
{public char StartChar { get; set; }public int MaxLen { get; set; }
}

StartChar 属性用于指定一个字符,即规定目标属性值开头的第一个字符;MaxLen 属性用于设置属性值的最大字符串长度。

步骤3:声明一个测试类,并把 MyAttribute 用到 RawName 属性上。

public class Test
{[My(StartChar = 'k', MaxLen = 7)]public string RawName { get; set; }
}

RawName 属性应用 MyAttribute 后,必须一字符“k”开头限制它的值,并且长度不能大于 7

步骤4:在 Program 类中声明一个静态方法,在运行阶段验证 Test 对象的属性值是否满足 MyAttribute 实例中所设定的限制。

static bool CheckTest(Test t, string property)
{// 获取类型信息Type type = t.GetType();// 查找属性成员PropertyInfo prop = type.GetProperty(property, BindingFlags.Public | BindingFlags.Instance);if (prop == null){return false;}// 获取特性MyAttribute att = prop.GetCustomAttribute<MyAttribute>();// 获取实例的属性值string value = prop.GetValue(t) as string;if (string.IsNullOrEmpty(value))return false;// 进行验证if (value.StartsWith(att.StartChar) == false)return false;if (value.Length > att.MaxLen)return false;return true;
}

PropertyInfo 类表示与属性有关的信息,调用它的 GetValue 方法可以获取属性的当前值。将属性的当前值与 MyAttribute 实例中指定的值进行比较,可以检验属性值是否符合要求。

步骤5:在 Main 方法中实例化 Test 对象,为 RawName 属性设置一个测试值。

Test v = new Test { RawName = "k003d6ex915f" };

步骤6:调用 CheckTest 方法对以上 Test 实例的 RawName 属性进行验证。

bool b = CheckTest(v, nameof(Test.RawName));
if (b)Console.WriteLine("验证通过。");
elseConsole.WriteLine("验证失败。");

虽然 Test 对象的 RawName 数学系是以字符“k”开头,但是其长度已经超过 7,因此验证失败。

总结

本文到这里就结束了,下一篇将介绍字符串处理的知识案例。

.net core精彩实例分享 -- 面向对象编程相关推荐

  1. .net core精彩实例分享 -- 网络编程

    文章目录 介绍 具体案例 从Web服务器上下载图片 使用HttpClient类向Web服务器提交数据 总结 介绍 随着.net core越来越流行,对.net core 基础知识的了解,实际应用等相关 ...

  2. .net core精彩实例分享 -- 异步和并行

    文章目录 介绍 具体案例 等待线程信号--ManualResetEvent 等待线程信号--AutoResetEvent 多个线程同时写一个文件 串联并行任务 使用Parallel类执行并行操作 为每 ...

  3. .net core精彩实例分享 -- 基础篇

    文章目录 介绍 具体案例 使用 using static 指令 在 case 语句中使用 when 子句 总结 介绍 随着.net core越来越流行,对.net core 基础知识的了解,实际应用等 ...

  4. .net core精彩实例分享 -- 应用配置和数据库访问

    文章目录 介绍 具体案例 自定义环境变量的命名前缀 自定义命令行参数映射 使用JSON文件来配置选项类 在应用程序运行期间创建SQLite数据库 总结 介绍 随着.net core越来越流行,对.ne ...

  5. .net core精彩实例分享 -- 依赖注入和中间件

    文章目录 介绍 具体案例 临时访问服务 以委托形式定义中间件 带参数中间件 IMiddleware中间件的用途 让 HTTP 管道"短路" 中间件的分支映射 文件服务 总结 介绍 ...

  6. .net core精彩实例分享 -- 应用启动

    文章目录 介绍 具体案例 配置Web服务器的URL 配置Web项目的调试方案 基于方法约定的Startup类 使用非预定义环境 总结 介绍 随着.net core越来越流行,对.net core 基础 ...

  7. .net core精彩实例分享 -- 反射与Composition

    文章目录 介绍 具体案例 用Activator类创建类型实例 检查类型上所应用的自定义Attribute 通过协定来约束导出类型 导入多个类型 封装元数据 总结 介绍 随着.net core越来越流行 ...

  8. .net core精彩实例分享 -- 序列化

    文章目录 介绍 具体案例 将类型实例序列号危机JSON格式 将数据协定序列化为JSON格式 总结 介绍 随着.net core越来越流行,对.net core 基础知识的了解,实际应用等相关的知识也应 ...

  9. .net core精彩实例分享 -- 文件与I/O

    文章目录 介绍 具体案例 创建Zip压缩文件 使用GZipStream类压缩文件 实现本地进程之间的通信 单向管道通信 总结 介绍 随着.net core越来越流行,对.net core 基础知识的了 ...

最新文章

  1. 详解 RestTemplate 操作
  2. c#扩展方法奇思妙用变态篇四:string 的翻身革命
  3. rake -T 列出所有RAKE 命令.
  4. 分析遇到非正态数据该怎么办?
  5. OWASPTop10安全风险与防护
  6. tcp udp区别优缺点_一文搞懂TCP与UDP的区别
  7. Linux 操作memcache命令行
  8. matlab随机数函数小结
  9. python如何上传文件_python请求文件上传
  10. 【概率论与数理统计】目录
  11. MATLAB之GUI界面介绍与搭建
  12. 获取瑞星注册的序列号和用户ID的小程序[原创]【已失效】
  13. Python 利用 BeautifulSoup 爬取网站获取新闻流
  14. windows10双系统删除linux,双系统删除教程详解:Windows(linux)双系统,教你如何删除其中一个!...
  15. uncode ansi详解
  16. Java工程师工作描述写作要点该怎么写?
  17. 全桥逆变电路部分分析
  18. 如何解决DMS的个人数据隐私问题?ToF技术路线在路上
  19. 数模电路基础知识 —— 2. 常见电路符号说明 (导线、电源、接地、变压器与保险丝)
  20. sam格式的结构和意义_SAMtools: SAM格式的处理利器

热门文章

  1. c# webclient 保存会话信息_会话保持机制cookie和session
  2. linux查看系统版本_Win8系统查看directx版本的操作方法是什么?
  3. 山东外贸职业学院王彩霞老师网上考试系统及c语言考试题库》,2019年山东外贸职业学院单独招生考试测试内容及安排...
  4. 锤子t1重置后怎么显示无服务器,解决锤子手机smartisanT1关机后无法正常开机(附带刷机教程图文)...
  5. 不同类型的官网应该如何设计?
  6. 作品上传设计师交流社区,从而获得很好的传播效果
  7. 设计师社区|你和设计大咖一起沟通的平台--集设
  8. PSD分层模板|电商促销海报设计技巧
  9. C++类模板 简单示例
  10. Windows函数:PtrToUlong作用