Attribute特性简介
Attribute 特性特性简介特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。 特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net 框架提供了两种类型的特性:预定义特性和自定义特性。 与注释的区别: 注释仅在 IDE 环境中使用,特性可以影响编译器或程序运行,可以在不破坏类型封装的前提下,为对象增加额外的信息,执行额外的行为。 特性语法12[attribute(positional_parameters, name_parameter = value, ...)] element 特性(Attribute)的名称和值是在方括号内规定的,放置在它所应用的元素之前。positional_parameters 规定必需的信息,name_parameter 规定可选的信息。 预定义特性AttributeUsage预定义特性 AttributeUsa...
正则表达式总结
正则表达式正则表达式作为一个强大的字符串处理方案,一直受到广大程序员的青睐。其不但使用灵活,而且字符串处理的速度也基本被各种编程语言优化到极致,在字符串匹配、提取、替换、分割等一直是首选的方案。 最近有一个前端妹子突然问了一个非常简单的正则表达式应该怎么写,我诧异于她不会写正则表达式的同时,思考了一下好像身边同事,真会使用正则表达式的也没有几个。 恰好最近在读《JavaScript面向对象编程指南》这本书的RegExp(JavaScript中的正则表达式对象)这一章,那就趁此机会总结一下平时工作学习中使用正则表达式的场景,同时整理一下这部分的基本知识。 本文代码均使用 C# 编写,后面有空会针对不同的编程语言,介绍各自的正则表达式对象怎么使用。 校验正则我们使用最多就是校验了,也就是对一个字符串进行匹配,确认一个字符串是否符合要求,例如判断一个IP是否合法、用户名是否符合系统要求、邮箱输入合法、输入内容是否是数字等。 从用户名校验开始经常能看到一些网站或系统中,设计用户名规则为:“只能使用数字或英文,并且首字母必须是字母,长度限制在6-32以内”。 如果没有正则表达式,代码的...
SecurityHelper 加密解密帮助类
SecurityHelper 帮助类该帮助类主要实现了 MD5 算法的 加密,DES、3DES、RSA 算法的 加密 与 解密,内部简单实现了一个混淆算法。 MD5 加密算法MD5 消息摘要算法:全称是 Message-Digest Algorithm,一种被广泛使用的密码散列函数,可以产生出一个 128位(16字节)的 散列值(hash value),用于确保信息传输完整一致。。 MD5主要用途: 对一段信息生成信息摘要,该摘要对该信息具有唯一性,可以作为数字签名 用于验证文件的有效性(是否有丢失或损坏的数据) 对用户密码的加密 在哈希函数中计算散列值 从上边的主要用途中我们看到,由于算法的某些不可逆特征,在加密应用上有较好的安全性。通过使用 MD5 加密算法,我们输入一个任意长度的字节串,都会生成一个128位 的整数。所以根据这一点 MD5 被广泛的用作密码加密。 SecurityHelper 中调用的方法: 1string str = SecurityHelper.EncryptByMD5("测试"); DES 与 3DES 加密算法DES 全称为...
创建支持多个dotnet版本的类库项目
如何创建支持支持多个 dotnet 版本的类库项目开发中,经常会遇到需要所开发的类库同时支持 net40 、 net451 、 netstandart2.0 等版本。 随意打开一些常用的开源项目比如“Dapper”就会发现,项目并不会针对不同的 dotnet 版本,创建不同分支,而是一套代码支持了多个不同的 dotnet 版本。 而针对不同版本的语言特性,只需要使用 #if 预处理指令进行处理即可,可以节约了我们的开发成本,方便我们统一的管理项目源码。 以下部分的内容是基于 Visual Studio 2017 进行的实践,建议安装最新的VS版本。 项目文件 *.csproj创建项目**注意:**创建的项目类型必须是 .NET Standard 。 编辑 *.csproj 文件在项目上右键,右键菜单中便有 编辑 *.csproj 的选项: 如果是新建的 类库(.NET Standard) 项目,*.csproj 文件内容大概是: 1234567<Project Sdk="Microsoft.NET.Sdk"> <PropertyGrou...
线程与线程池
Thread Thread 是前台线程,启动后需要执行完成后才会退出。但是可以通过 IsBackground 将其设置为后台线程,程序退出该线程也会立即退出。 如果希望等待线程执行完成后再继续执行,可以使用 Join() 方法。 Thread 没有回调,也没有返回值。 ThreadPoolCLR线程池:管理线程开销最好的方式: 尽量少的创建线程并且能将线程反复利用(线程池初始化时没有线程,有程序请求线程则创建线程); 最好不要销毁而是挂起线程达到避免性能损失(线程池创建的线程完成任务后以挂起状态回到线程池中,等待下次请求); 通过一个技术达到让应用程序一个个执行工作,类似于一个队列(多个应用程序请求线程池,线程池会将各个应用程序排队处理); 如果某一线程长时间挂起而不工作的话,需要彻底销毁并且释放资源(线程池自动监控长时间不工作的线程,自动销毁); 如果线程不够用的话能够创建线程,并且用户可以自己定制最大线程创建的数量(当队列过长,线程池里的线程不够用时,线程池不会坐视不理); 实现: C#2.0 时支持,实现为享元模式、单例模式。 CLR线程池并不会在CLR初始化时立即...
异步多线程
基本概念进程首先打开任务管理器,可以查看电脑当前运行的进程。 从任务管理器里面可以看到当前所有正在运行的进程。 那么究竟什么是进程呢? 进程( Process )是 Windows 系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。 线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代码。进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行, Windows 系统就是利用进程把工作划分为多个独立的区域的。 进程可以理解为一个程序的基本边界。是应用程序的一个运行例程,是应用程序的一次动态执行过程。 线程在任务管理器, 性能 -> CPU 中可以查看当前电脑当前运行的线程数量。 线程( Thread )是进程中的基本执行单元,是操作系统分配 CPU 时间的基本单位,一个进程可以包含若干个线程,在进程入口执行的第一个线程被视为这个进程的主线程。 在 .NET 应用程序中,都是以 Main...
面向对象知识点回顾
封装访问修饰符 public :完全公开 private :只有类内部能够访问 internal :同项目中能够访问 protected :类和派生类可以访问 protected internal :internal和protected二者的结合 封装封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。 意义封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。 封装提供了一个有效的途径来保护数据不被意外的破坏。相比我们将数据(用域来实现)在程序中定义为公用的( public )我们将它们( fields )定义为私有的( privat )在很多方面会更好。私有的数据可以用两种方式来间接的控制。 第一种方法,我们使用传统的存、取方法。第二种方法我们用属性(property)。使用属性不仅可以控制存取数据的合法性,同时也提供了“读写”、“只读”、“只写”灵活的操作方法。继承:继承...
常见序列化器
常见序列化器二进制序列化器命名空间 System.Runtime.Serialization.Formatters.Binary; 1234567891011121314151617//序列化using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.ReadWrite)){ BinaryFormatter binaryFormatter = new BinaryFormatter();//创建二进制序列化器 binaryFormatter.Serialize(fileStream, ListPersons);}//反序列化using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)){ BinaryFormatter binaryFormatter = new BinaryFormatter();//创建二进制序列化器...
C#中的文件操作
文件夹/文件 操作文件夹/文件检查主要是 Directory / File / DirectoryInfo / FileInfo 几个类来操作检查。 注:Path是路径字符串的拼接、剪切、检查操作类,并不会执行IO操作。 文件夹/文件新增123Directory.CreateDirectory(path);//新增File.Create(path);//新增或覆盖File.AppendText(path);//新增或追加 文件夹新增时,dotnet会自动逐层创建,例如“C:\test1\test2”,“test1”文件夹不存在会先创建“test1”文件夹。 文件夹/文件复制12//文件夹无法复制File.Copy(path1, path2); 文件夹/文件移动12Directory.Move(path1, path2);File.Move(path1, path2); 文件夹/文件删除12Directory.Delete(path, true);//第二个参数是指定是否删除目录内文...
匿名类型、扩展方法、var、dynamic
匿名类型C#在3.0版本以后,允许使用new关键字直接创造对象,方便我们在临时使用一特定类型时,无需单独的创建一个类: 1234567object user = new{ Id = 1, Name = "Kangkang", Age = 12};//Console.WriteLine(user.Id);//无法获取 因为是object类型 该问题可以使用var关键字解决 var 关键字在方法范围内声明的变量可以具有隐式“类型” var。 隐式类型本地变量为强类型,就像用户已经自行声明该类型,但编译器决定类型一样(语法糖)。 声明现有类型编译器会自行推断左侧变量的类型,如下代码编译器会识别为int类型: 1var i = 1; 声明匿名类型创建的匿名类型我们并不知道编译器为我们生成的类型名称,但是我们可以使用var关键字让编译器自己根据编译的结果来推断: 1234567var user = new{ Id = 1, Name = "Kangkang", Age = 12...