阅读本文大概需要 1.5 分钟. 大家好,这是极客精神[C#.NET 拾遗补漏]专辑的第 5 篇文章,今天要讲的内容是操作符. 操作符的英文是 Operator,在数值计算中习惯性的被叫作运算符,所以在中文的概念中,运算符是操作符的一个子集. 操作符是很基础的知识了,基础归基础,我们来回顾一下 C# 操作符那些比较骚的操作,能想到的不多,请大家补充. 操作符的重载 操作符重载大部分语言都没有,而 C# 有.C# 允许用户定义类型对操作符进行重载,方式是使用 operate 关键字把操作符写成公开…
大家好,这是[C#.NET 拾遗补漏]专辑的第 06 篇文章.今天讲讲大家熟悉的单例模式. 单例模式大概是所有设计模式中最简单的一种,如果在面试时被问及熟悉哪些设计模式,你可能第一个答的就是单例模式. 单例模式的实现分为两种:饿汉式和懒汉式.前者是在静态构造函数执行时就立即实例化,后者是在程序执行过程中第一次需要时再实例化.两者有各自适用的场景,实现方式也都很简单,唯一在设计时要考虑的一个问题就是:实例化时需要保证线程安全. 饿汉式 饿汉式实现很简单,在静态构造函数中立即进行实例化: publi…
大家好,这是 [C#.NET 拾遗补漏] 系列的第 07 篇文章. 在 C# 中,大多数方法都是通过 return 语句立即把程序的控制权交回给调用者,同时也会把方法内的本地资源释放掉.而包含 yield 语句的方法则允许在依次返回多个值给调用者的期间保留本地资源,等所有值都返回结束时再释放掉本来资源,这些返回的值形成一组序列被调用者使用.在 C# 中,这种包含 yield 语句的方法.属性或索引器就是迭代器. 迭代器中的 yield 语句分为两种: yeild return,把程序控制权交回调…
大家好,这是 [C#.NET 拾遗补漏] 系列的第 08 篇文章,今天讲 C# 强大的 LINQ 查询.LINQ 是我最喜欢的 C# 语言特性之一. LINQ 是 Language INtegrated Query 单词的首字母缩写,翻译过来是语言集成查询.它为查询跨各种数据源和格式的数据提供了一致的模型,所以叫集成查询.由于这种查询并没有制造新的语言而只是在现有的语言基础上来实现,所以叫语言集成查询. 一些基础 在 C# 中,从功能上 LINQ 可分为两类:LINQ to Object 和 L…
字符串操作在任意编程语言的日常编程中都随处可见,今天来汇总一下 C# 中关于字符串的一些你可能遗忘或遗漏的知识点. 逐字字符串 在普通字符串中,反斜杠字符是转义字符.而在逐字字符串(Verbatim Strings)中,字符将被编程器按照原义进行解释.使用逐字字符串只需在字符串前面加上 @ 符号. // 逐字字符串:转义符var filename = @"c:\temp\newfile.txt";Console.WriteLine(filenaame); // 逐字字符串:多行文本va…
阅读本文大概需要 1.5 分钟. 数组本身相对来说比较简单,能想到的可写的东西不多.但还是有一些知识点值得总结和知晓一  下.有的知识点,知不知道不重要,工作中用的时候搜索一下就可以了,毕竟实现一个功能代码的写法有很多种,再牛的人也不可能完全熟悉一门语言的每个细节.当然了,偶然地知道了一些小知识或小技巧也是一种小小的收获.在你看这篇小文时,或许这种偶然的事情就正在发生.我们先从数组的初始化开始吧. 数组的定义和初始化 定义和初始化一个数组有好几种方式,随着 C# 版本升级,方式也越来越简单: i…
阅读本文大概需要 1.2 分钟. 随着 C# 的升级,C# 在语法上对对象的初始化做了不少简化,来看看有没有你不知道的. 数组的初始化 在上一篇罗列数组的小知识的时候,其中也提到了数组的初始化,这时直接引用过来. int[] arr = new int[3] {1, 2, 3}; // 正儿八经的初始化int[] arr = new [] {1, 2, 3}; // 简化掉了 int 和数组容量声明int[] arr = {1, 2, 3}; // 终极简化 字典的两种初始化方式 第二种是 C#…
阅读本文大概需要 3 分钟. 通常,反射用于动态获取对象的类型.属性和方法等信息.今天带你玩转反射,来汇总一下反射的各种常见操作,捡漏看看有没有你不知道的. 获取类型的成员 Type 类的 GetMembers 方法用来获取该类型的所有成员,包括方法和属性,可通过 BindingFlags 标志来筛选这些成员. using System; using System.Reflection; using System.Linq; public class Program { public stati…
数据标注(Data Annotation)是类或类成员添加上下文信息的一种方式,在 C# 通常用特性(Attribute)类来描述.它的用途主要可以分为下面这三类: 验证 Validation:向数据添加验证规则 显示 Display:指定数据如何呈现给用户 模型 Modelling:添加关于用法和与其它类的关系信息 下面是一个用来验证和展现用户信息的一个 Model: class Kid { [Range(0, 18)] // 年龄不能超过18岁,不能为负数 public int Age {…
要理解 C# 中的 volatile 关键字,就要先知道编译器背后的一个基本优化原理.比如对于下面这段代码: public class Example { public int x; public void DoWork() { x = 5; var y = x + 10; Debug.WriteLine("x = " +x + ", y = " +y); } } 在 Release 模式下,编译器读取 x = 5 后紧接着读取 y = x + 10,在单线程思维模…