自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(78)
  • 收藏
  • 关注

原创 理解协变与逆变

概述协变与逆变属于类型可变范畴,.net为了支持更广泛的隐式类型转换而存在,通过协变和逆变实现了不具有继承关系的两个对象之间的隐式转换,从效果上看,延伸了继承与多态。定义泛型接口 :IObject<T>基类:Father子类:Son 派生自 Father类协变:支持将IObject<Son>子类的泛型接口赋值给 IObject<Father> 父类的泛型接口,这里可以看到IObject<Son> 和 IObject<Father&

2020-08-30 23:59:08 392

原创 对象相等判断

概述Object 类型中于相等有关的方法:public virtual bool Equals(Object obj);public static bool ReferenceEquals(Object objA, Object objB);public static bool Equals(Object objA, Object objB);public virtual int GetHashCode();还有个 == 运算符这多有点乱,一个个看public.

2020-08-30 15:16:03 284

原创 C#中的using

using这个关键字在C#中共用三个用法:1、用在命名空间里如:usingSystem;这个谁都知道,为了不用写类的全名(可以把System.Console写成 Console)2、可以用来对一个类进行重命名,也是为了使用方便,如: usingSystem; usinghahaha = System.Co

2020-08-30 00:12:25 363

原创 readonly和Const注意一点

概述Const:要求编译时常量,所以不能跟new,其实也是static的;可以定义字段和局部变量Static Readonly :运行时常量,可在静态构造中进行赋值;只能字段一个坑: Const 常量,在编译时写入元数据中,如果定义在另一个dll中常量,一旦改变则必须更新被引用dll,且重新编译当前dll。在使用Enum类型是也是具有该问题。示例:private static readonly string _rdA;private const flo...

2020-08-29 23:57:24 83

原创 DataTable 创建

记录下new一个Tableprivate DataTable CreateTreeListTable() { DataTable dt = new DataTable(); DataColumn dcOID = new DataColumn("KeyFieldName", Type.GetType("System.Int32")); DataColumn dcParentOID = new DataColumn(

2020-08-29 23:42:37 91

原创 “混乱的”Stream

概述流,stream,总是记不住,每次使用的时候都要去搜索,并且心里还没有底,到底该怎么组合使用,也是比较混乱的,主要还是没有理清楚这么多流之间的关系以及功能分配。这里梳理下基本的常用的流。一个一个看,理清楚他们之间的区别于关系File直接操作文件其中类Stream为抽象类。MemoryStream:对内存进行读取与写入,对标FileStreamBufferedStream:对缓冲器进行读取/写入,装饰Stream,增加缓冲FileStream:对文件执行读取与写入TextRea...

2020-08-29 19:29:56 84

原创 WeakRefence

概述弱引用在适当的时候,是一种有效的提升性能手段。弱引用的对象既可以被GC回收,又可以被引用程序访问的机制。在创建胖对象是可以考虑采用弱引用。示例:public class Program { static void Main(string[] args) { DataBag dataBag = new DataBag(); WeakReference<DataBag> weakReferenc

2020-08-23 17:50:17 107

原创 非托管资源的清理

概述首先需要理解GC垃圾回收基本规则,理解代的概念,理解托管资源非托管资源,堆、栈内存模型等相关知识。常见包装了非托管资源的例如:ManualResetEvent、Mutex、FileStream,通常都支持终结器和IDisposable接口。CLR的垃圾回收可以自动的处理托管资源,但是对于非托管资源,需要用户手动显示的释放,否则会造成资源泄漏。允许对象在判定为垃圾之后,在对象内存被回收之前执行清理代码。Object基类中Finalize虚方法,在自定义类中通过终结器。特殊语法终结器即是对Fin

2020-08-23 17:22:34 126

原创 .net闭包

概述.net也有闭包,理解下面的就可以。截自CLR via C# 4.0。实际编译后,编译器做了手脚。编译器生成了以下的类,private修饰,将用到的局部变量,转换为对象实例字段:

2020-08-22 22:38:28 141

原创 Ioc和DI

概述通过Ioc消除组件或者模块之间的直接依赖,增加一定配置的灵活性。Ioc + 反射机制,可以将部分依赖移出到配置文件中,减少项目之间的引用依赖性,也是一种解耦方式。所谓控制反转可以理解为对象的创建交由容器根据配置信息,灵活动态的创建对象,而非通过new对象的方式硬编码。DI依赖注入:在Ioc时,具体的业务对象之间的关联,通过注入的方式赋值。主要方式有:构造器注入,属性赋值,接口赋值,特性。Ioc是一种思想,目的是解耦;DI则是在Ioc解耦情况时,业务之间需要有的耦合,通过注入实现,依然不需

2020-08-22 21:44:39 76

原创 基础设计原则(3.里氏替换、接口隔离、依赖倒置)

概述合理应用基础的设计,使项目代码结构清晰,保持低耦合高内聚,能够快速的梳理类之间的关系,忽略细节因素,提升对项目整体的认知,减少团队沟通成本,交接成本。时长思考这些,从这些简单的做起,同时有助于看懂他人代码。五大原则3. 里氏替换原则LSP(Liskov Substitution Principle):依赖于接口或者抽象类,而非具体类。通常如果出现运行时类型识别,则是否违反了历史替换原则。4.接口隔离原则:使用多个小的职能专一的接口,而不是一个大的总接口。保证了开闭原则。5

2020-08-22 14:49:27 268

原创 基础设计原则(2.开闭原则OCP)

概述合理应用基础的设计,使项目代码结构清晰,保持低耦合高内聚,能够快速的梳理类之间的关系,忽略细节因素,提升对项目整体的认知,减少团队沟通成本,交接成本。时长思考这些,从这些简单的做起,同时有助于看懂他人代码。五大原则2.开闭原则OCP(Open Close Principle):在适当的场景,如系统的后续具有很多的功能扩展,则应重视开闭原则。对修改关闭,对扩展开放。通常结合里氏替换原则、聚合复用原则。通常将接口拆分为更小的接口,每个实现只完成特定功能,这样再新加入功能时,则垂直的加入接

2020-08-09 14:08:34 109

原创 基础设计原则(1. 单一职责原则)

概述合理应用基础的设计,使项目代码结构清晰,保持低耦合高内聚,能够快速的梳理类之间的关系,忽略细节因素,提升对项目整体的认知,减少团队沟通成本,交接成本。时长思考这些,从这些简单的做起,同时有助于看懂他人代码。五大原则单一职责原则SRP(Simple Responsibility Principle):一个类,最好只做一件事,只有一个引起它变化的原因。如果一个类具有了多个职责,则之间就可能产生状态依赖。依据实际情况,此时就可以考虑重构此类。见示例:定义接口:public int

2020-08-09 13:24:55 160

原创 类层次设计时的灵活处理

概述多态设计时候的一些小技巧,通过加入一层抽象类,减少后续的改动,如在抽象基类或者接口中加入新的method,此时并不需要在所有的实现类中去实现,只需要在需要实现的类中去实现处理,在抽象类中提供默认的实现,当然出现此种情况接口可能设计的时候存在一定的不合理,但是在实际的情况确实会出现不合理。看下面的例子:public interface IFile { bool Open(); }public abstract class AbstractFile : I...

2020-08-09 00:05:00 107

原创 Windows内核情景分析-内存管理2

内核对于物理页面的管理物理内存的管理和使用是以页面为单位的,所以物理内存的管理实际上是对物理页面的管理。 在系统初始化过程中,内核构建一个PHYSICAL_PAGE结构的数组,并使全局变量MmPageArray指向这个数组,系统存在多少物理页面,该数组就有多大。页面号(Pfn)为下标,物理地址与Pfn有着固定的对应关系,物理地址右移12bit得到的值,即为对应的物理页面。结构如下:...

2018-08-13 17:51:01 619

原创 Windows内核情景分析-内存管理1

简述现代意义上的操作系统,就必须提供对内核的保护、对不同用户程序之间的隔离,并允许软件的装入位置浮动。提供这些功能,需要由单独的内存管理来支持。 上图ALU将程序中的地址计算转换为虚拟地址(线性地址),然后通过MMU将虚拟地址转换为实际的物理地址。这些过程对于应用程序而言是透明的。虚拟地址通过段选择子内容结合偏移地址得到,虚拟地址通过MMU映射机制,通常以页为单位进行映射,建立对应...

2018-08-11 22:06:08 209

原创 Windows内核情景分析-系统调用4

接上,快速系统调用sysenter的调用过程通过硬件支持,增加了指令sysenter和sysexist,且增加了三个MSR寄存器,用于支撑该指令,旨在实现轻便高效的系统调用。这样只要预先设置好三个寄存器中的内容,CPU在执行sysenter指令时候就可以进入系统空间且从指定地址开始执行,同时使用系统空间堆栈。 但此时,CPU不像在执行int 0x2e自陷时那样,自动把用户空间的堆栈...

2018-08-11 15:49:25 293

原创 Windows内核情景分析-系统调用3

系统调用1和系统调用2说了这么多,还未进入int 0x2e所对应的系统服务函数KiSystemService(),这里来看下这个函数内部的处理;通过0x2e和IDTR从IDT中 查询获取对应的方法KiSystemService()。所以这里 int 0x2e  对应  KiSystemService 入口 sysenter 对应的是 KiFastCallEntry 入口,这里不要被这些函数给...

2018-08-09 00:31:51 495

原创 Windows内核情景分析-系统调用2

x86后来加入的快速系统调用硬件支持,windows则也跟着做了改动,此时如果cpu支持sysenter,则会采用快速系统调用的系统调用形式。 快速系统调用 sysenter 形式的系统调用实例此时工具生成的NtReadFile为:此时与int 0x2e指令上是等价的,堆栈这里pub ebp ,导致esp的值加4, 这里  call[ecx]将返回地址压入,esp的值也...

2018-08-07 23:28:53 164

原创 Windows内核情景分析-系统调用1

通常有三种方式使CPU从用户空间转入系统空间。 中断、异常、自陷(这三条非常重要所以列一下)中断当中断到来时,CPU就换转入系统空间,并从某个预定的地址开始执行指令,CPU无法预知何时中断到来;中断发生在两条指令之间,因而不会使正在执行的指令半途而废。异常不管用户空间还是系统空间,指令执行失败,则会引发一次异常,CPU转入系统空间,从某个预定的地址开始执行指令;异常发生在执行一...

2018-08-07 22:07:49 250

原创 Windows内核情景分析-概述

现在的Windows现在的windows内核包含了两大部分,一部分是本来意面上的操作系统内核,另一部分则是移到了内核中的视窗服务,前者对应ntoskrnl.exe后者win32k.sys;后者部分为了保证效率。windows操作系统包含多个子系统,最常用就是windows子系统;貌似现在的windows10提供了linux子系统,所以在windows上可以运行linux的程序。现代意...

2018-08-06 22:47:18 3692

原创 Windows内核情景分析-概述

概述windows内核情景分析使用的是ReactOS作为源码来讲解windows的内部机制,最近抽时间开始阅读本书,最直接的感受就是很难,虽然学过操作系统,计算机组成原理等课程,而且在学校的时候也使用windows api做过一些练习,但是读起本书还是有很多的困难,最常见的原因就是迷失方向,跟着作者走很多细节东西容易让人分神,然后就是一头雾水,这个可能与我本人的读书习惯有关系,有些细节忽略的话...

2018-08-06 19:50:54 366

原创 Razor常用语法示例

Razor语法1.   Razor通过理解标记的结构来实现代码和标记之间尽可能顺畅的转换。2.   [email protected] itemsRzaor可以知道表达式后面的空格字符不是一个有效的标识符,所以它可以顺畅的转回到标记语言。3. Theitem name is one. 切换到MarkDown编辑器Razor在点字符向后窥看,看到一个尖括号,因此知道这不是一

2017-05-03 20:30:47 417

转载 C#流

1. 什么是流数据流(Stream)是对串行传输数据的一种抽象表示,是对输入/输出的一种抽象。数据有来源和目的地,衔接两者的就是串流对象。用比喻的方式来说或,数据就好比水,串流对象就好比水管,通过水管的衔接,水由一端流向另一端,如下图所示:从应用程序的角度来说,如果将数据从来源取出,可以试用输入(读)串流,把数据储存在内存缓冲区;如果将数据写入目的地,可以使用输出(写)串流

2017-05-03 10:54:37 415

转载 Json.net对于导航属性的处理(解决对象循环引用)

摘自:http://www.cnblogs.com/ecollab/p/6159914.html对于两张表A、B多对多的关系中,A的导航属性中有B,B的导航属性中有A,这样Json.net对A或者B对象序列化时会形成死循环所以对于导航属性要加标签首先在A、B实体类工程(Model)中引用Json.ne然后对导航属性加不序列化标签([JsonIgnore])

2017-04-20 10:41:35 838

转载 在C#中,Json的序列化和反序列化的几种方式

摘自:http://www.cnblogs.com/caofangsheng/p/5687994.html在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象。什么是JSON?JSON (JavaScript Object Notation) is a lightweight data-interchange for

2017-04-20 09:20:01 3842 1

转载 NuGet控制台为项目添加第三方程序集引用

摘自:http://www.cnblogs.com/wych/p/4380320.html在有些情况下,有些操作使用程序包管理窗口不能达到目的,只能使用控制台命令才能实现,比如说,安装特定版本的程序包。控制台命令窗口在安装有NuGet插件的VS上打开NuGet命令窗口的过程如下:依次选择菜单Tools(工具)->Library Package Manager(库

2017-04-20 09:09:23 2640

原创 SQL事务

事务--原子性-隔离性-一致性-持久性BEGIN TRANSACTIONDECLARE @errorSum INTSET @errorSum=0 --初始化为0,即无错误UPDATE bank SET currentMoney = currentMoney-1000 WHERE customerName = '张三'SET @errorSum = @errorSum +

2016-03-31 21:38:36 265

原创 Sql类型转换、select、set赋值区别

declare @Name varchar(12),@Id intselect @Name = 'smf',@Id = 1set @Name = 'sun' set @Id = 2print @Nameprint @Id----------------------------declare @Name varchar(20)set @Name = 'smf'set

2016-03-31 20:57:23 330

原创 SqlServer部分内置函数

--常见字符串操作函数select charindex('server','Sqlserver2008',2)  --sql索引从1开始,这里结果为4select charindex('ser','Sqlserver2008')select LEN('Sqlserver2008')select LEFT('SqlServer2008',charindex('ser','Sqlser

2016-03-31 00:18:40 1012

原创 创建数据库、文件组、删除数据库

--1.创建数据库use mastergocreate database db_Teston primary(Name = 'DB_Test',FileName = 'F:\测试文件夹\DB_Test_data.mdf',Size = 10MB,MaxSize = 100MB,FileGrowth = 10%)Log on(Name = 'D

2016-03-29 21:05:04 940

原创 ADO.NET:连接层

1.ADO.NET类库有三种不同的方式来实现数据访问:连接式、断开式、通过Entity框架(EF)2.使用连接式,代码需要显示连接或者断开基层数据源,用这中方式使用ADO.NET时,通常会用到连接对象、命令对象、和数据读取器对象来实现数据交互。3.数据提供程序是一组定义在用于和特定数据源类型进行通信的命名空间内的一组类型。每种提供程序都有一系列类来提供核心功能。

2016-03-20 11:27:05 284

原创 对象序列化

1.序列化描述了持久化(可能包括传输)一个对象的状态到流(如文件流、内存流)的过程。被持久化的数据包括所有以后需要用来重建(反序列化)对象状态所必须的信息。2.通过人工保存对象的每个字段数据,并且在需要的时候人工的读取每个值,重新生成一个新的对象。但是若为该类添加[Serializable]特性,该类将自动具备序列化功能。.net序列化保存对象的幕后调用非常复杂,当一个对象被持久化到流时,

2016-03-19 21:44:18 276

原创 CLR线程池

1.当使用委托类型(BeginInvoke调用)进行异步方法调用的时候,CLR并不会创建新的线程。委托的BeginInvoke()方法创建了由运行时维护的工作者线程。2.System.Threading命名空间中的ThreadPool类型可以与这些线程交互。

2016-03-17 22:04:49 290

原创 Timer

1.定期的执行指定的任务,调用指定的方法。如状态栏显示时间;定期的调用方法处理后台任务等。可以使用System.Threading.Timer类和相关的TimerCallback委托。2.示例:class Program    {        static void Main(string[] args)        {            TimerCall

2016-03-17 19:53:05 195

原创 多线程

1.获取对当前线程的引用,只需要调用静态属性Thread.CurrentThread; Thread.GetDomain();//获取当前线程所在的应用程序域;Thread.CurrentContext;获取当前操作操作线程的上下文。2.几乎无法控制底层系统和CLR对线程的调度。3.原子性操作在多线程环境下总是线程安全的。通常的操作都不是原子操作,包括++i,赋值操作等。

2016-03-17 19:40:58 200

原创 进程、应用程序域、对象上下文

1.进程可以承载一组相关的.net程序集,应用程序域(AppDomain)是对该进程的逻辑细分,一个应用程序域进一步被细分为多个上下文边界;使用上下文的概念,CLR能够确保恰当的控制那些带特殊运行时要求的对象。2.每一个windows进程都恰好包含一个用作程序入口点(entry point)的主线程,线程是进程中的基本的执行单元,进程的入口点创建的第一个线程被成为主线程。主线程可以次线

2016-03-16 23:16:46 351

原创 动态类型dynamic和动态语言运行时DLR

1.动态类型与隐式申明的类型或者通过System.Object引用声明的类型有着巨大的不同,动态类型不是强类型的,对于C#编译器通过dynamic关键字声明的数据点可以分配任意初始值,而且可以在声明周期内重新分配任何新的值。public void Func3()        {            dynamic t = 1;            t = "hello";

2016-03-16 22:39:29 520

原创 .net特性

1..net平台允许程序员使用特性把更多的元数据嵌入到程序集中。特性是用于类型(类、接口、结构等)、成员(属性、方法等)、程序集或模块的代码注解。.net特性是扩展了抽象的System.Attribute基类的类类型。所有.net特性都将加上Attribute标记的后缀。 [ServiceContract]   -->[ServiceContractAttribute] 2.当

2016-03-15 22:32:08 687

原创 反射和晚期绑定

1.使用元数据完整的描述类型(接口、类、结构、委托、枚举)的能力是.net平台的一个关键要素。2.反射:是一个运行库类型发现的过程通过反射可以得到一个给定的*.dll获取*.exe程序集所包含的所有类型的列表,这个列表包含给定类型定义的方法、字段、属性和事件。主要在System.Reflection命名空间。3.System.Type类System.Type类定义了

2016-03-15 21:30:40 638

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除