
C#
文章平均质量分 93
mango_love
习而简之,简而精之
展开
-
C#中的i++和++i
刚刚学习C#的时候,难免会遇到一些麻烦,而我觉得最有意思的是i++和++i。先介绍下它们吧!!i++ 俗称后加加:在处理运算的时候先不做运算,等输出的时候再加,这是我个人的理解。++i 俗称先加加:在处理运算的时候先加。然后做相应的运算下面来看几个例子:(1)int i = 1;i++;Console.WriteLine(i);...原创 2015-08-03 23:54:21 · 5727 阅读 · 1 评论 -
C#重写和覆盖
在研究重写和覆盖之前我们先来研究下继承关系中构造函数和方法的执行顺序问题。继承关系中的构造函数和方法执行顺序:class A{ public A() { Console.WriteLine("这是a构造函数"); } public void a() { Console.WriteLine("这是a方法"); ...原创 2019-03-07 14:43:56 · 2222 阅读 · 1 评论 -
泛型
泛型准确的来说是通用类型,通常作为一个方法模板和类型的模板,泛型类和泛型方法兼具可重用性、类型安全性和效率,这是非泛型类和非泛型方法无法实现的。泛型表示:List<T>,T是一个占位符,我们在Dynamic介绍过动态类型一般在执行的时候知道他的数据类型,那么T在编译的时候他就确定了它的类型。命名空间 :System.Collections.Generic我们经常在一个项目框...原创 2019-03-25 15:53:24 · 538 阅读 · 1 评论 -
C#数据结构-Dictionary
我们熟悉的XX字典,首先是他的一个字根和拼音的目录,后面一部分就是字的解读内容,我们会发现字典的排列并不是无序的,拼音相同的字展示在一个分类里面。字典存储结构是键值存储,查找十分的快速,那么它内部是如何实现的呢?我们从c#开源代码中找到实现字典插入的一段代码来做分析,源码地址点击// buckets是哈希表,用来存放Key的Hash值 // entries用来存放元素...原创 2019-03-27 11:21:06 · 14116 阅读 · 0 评论 -
线程锁
通过上篇文章介绍了多线程的作用,多线程的执行效率还是很显著的,但是在多线程执行的时候会有资源抢占的情况,下面我们来看看例子:class Test{ public int number = 10; public void ThisRemove(string name) { for (int i = 0; i < numb...原创 2019-04-04 19:06:54 · 461 阅读 · 0 评论 -
I/O线程
CLR线程池分为工作者线程(workerThreads)与I/O线程(completionPortThreads)两种:工作者线程是主要用作管理CLR内部对象的运作,通常用于计算密集的任务。 I/O(Input/Output)线程主要用于与外部系统交互信息,如输入输出,CPU仅需在任务开始的时候,将任务的参数传递给设备,然后启动硬件设备即可。等任务完成的时候,CPU收到一个通知,一般来说是一...原创 2019-04-10 12:53:45 · 4225 阅读 · 0 评论 -
反射(Reflection)
反射是一种动态分析程序集、模块、类型及字段等目标对象的机制,它的实现依托于元数据。元数据,就是描述数据的数据。在CLR中,元数据就是对一个模块定义或引用的所有东西的描述系统。程序集的加载JIT编译器器将IL代码编译成本地代码时, 会查看IL代码中引用了哪些类型。在运行过程中, JIT编译器利用程序集的TypeRef和AssemblyRef元数据表来确定哪一个程序集定义了所引用 的类...原创 2019-04-12 16:39:27 · 504 阅读 · 0 评论 -
多线程基础
进程:(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源,进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式),,Windows系统就是利用进程把工作划分为多个独立的区域的。进程可以理解为一个程序的基本边界。线程(Thread):线程是操作系统分配处理器时间的基本单元,一个进程可以包含多个线程。在.Net程序中都是以Main函数...原创 2019-04-02 17:06:49 · 355 阅读 · 0 评论 -
线程池
我们通过Thread创建多线程工作,用完后回去销毁这个线程然后回收资源,有的时候会创建很多个线程,如果使用Thread创建线程的话会带来资源的浪费和性能的损耗,所以针对这样频繁的创建和销毁线程net提供了线程池,执行一个任务只需要在线程池中拿出一个线程去执行这个任务,任务完成后这个线程会自动回到线程池中,这样不用重复创建、销毁线程了使用线程池//线程池中10个线程,10 I/O线程Th...原创 2019-04-08 16:15:20 · 676 阅读 · 0 评论 -
预处理器指令
预处理器指令指导编译器在实际编译开始之前对信息进行预处理。所有的预处理器指令都是以 # 开始。且在一行上,只有空白字符可以出现在预处理器指令之前。预处理器指令不是语句,所以它们不以分号(;)结束。C# 编译器没有一个单独的预处理器,但是,指令被处理时就像是有一个单独的预处理器一样。在 C# 中,预处理器指令用于在条件编译中起作用。与 C 和 C++ 不同的是,它们不是用来创建宏。一个预处理...原创 2019-04-12 16:39:34 · 1496 阅读 · 0 评论 -
C#T4模板
T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎。在 Visual Studio 中,“T4 文本模板”是由一些文本块和控制逻辑组成的混合模板,它可以生成文本文件。 在 Visual C# 或 Visual Basic 中,控制逻辑编写为程序代码的片段。生成的文件可以是任何类型的文本,例如网页、资...原创 2019-05-05 18:40:04 · 4030 阅读 · 0 评论 -
.Net字符暂存池(String Intern Pool)
字符串在.Net中既有值类型的特点又有引用类型的特点,字符类型也称作为不可变对象类型,字符串类型在使用上可以说占很大的比例,每次使用的时候都要重新开辟一个新的空间,这样会大量消耗内存,所以微软给我们一个名为String Intern Pool的字符暂存池,我在重复使用这个字符串的时候不需要重新开辟一个新的空间,只需要从这个池子里面获取即可。我们在新建一个字符的时候,首先去暂存池获取有没有这...原创 2019-07-16 17:12:43 · 8663 阅读 · 0 评论 -
LINQPad工具-linq、sql、IL优化和转换
今天给大家介绍一个非常强大的linq转换和优化工具,它包含linq、sql、il、表达式树的转换,支持现在的主流数据库,甚至包括nosql(需要下载插件,下文介绍)下载地址百度云盘(不能下载私聊或者留言):链接: https://pan.baidu.com/s/1NT-eqmKtM6TnXi3zuaMWdQ 提取码: te25安装双击这个exe接下来就是下一步下一步的...原创 2019-07-17 11:44:06 · 1608 阅读 · 1 评论 -
C#反射破坏单例
单例大家都不陌生,程序从开启到死亡过程中只能存在一个实例,即存在不可创建,今天给大家介绍一种打破这种模式的方法,在程序运行中创建无数个单例实例对象。关于单例模式模糊或者不懂的可以参考C#单例模式上文我们讲到了反射的基本操作,实例化对象、属性、方法、特性等操作,可以参考C#反射咱们切入正题,单例有两种,一种是程序加载时创建,一种是使用时创建,我们这里主要是创建一个加载时创建的单例。我们...原创 2019-07-20 10:34:55 · 10312 阅读 · 0 评论 -
Dynamic动态类型
什么是动态类型了解什么是动态类型首先我们了解静态类型,在我们平时定义一个int i=1就是静态类型,静态类型就是我们在没有编译的时候已经明确的知道他是一个int类型,动态语言是我们在运行时才会知道的类型。所以我们在编写动态类型的时候是无法使用vs的智能提示,因为编译器也不知道他是一个什么类型。dynamic i = 1;Console.WriteLine(i.GetType());d...原创 2019-03-05 13:06:47 · 2810 阅读 · 0 评论 -
Linq语言集成查询
Linq就是Language Integrated Query的缩写,即语言集成查询,是微软在.Net 3.5中提出的 一项新技术, Linq主要包含4个组件——Linq To Objects、Linq To XML、Linq To DataSet 和Linq To SQL。我们操作linq一般来说有两种方式,一种是lamdba表达式+扩展方法,还有一种就是表达式,表达式方式跟sql差不多,...原创 2019-01-23 10:10:35 · 575 阅读 · 0 评论 -
扩展方法
扩展方法,就是对存在的方法的添加或者称作补充,他不属于重载,不需要重新创建派生类型、重新编译等其他修改原有类型。扩展方法也是一种方法,只不过是一种特殊的方法,只能是静态类型的方法。扩展方法的规则:1、定义包含扩展方法的静态类,此类必须对客户端代码可见。2、将扩展方法实现为静态方法,并且使其可见性至少与所在类的可见性相同。3、此方法的第一个参数指定方法所操作的类型;此参数前面必须加上...原创 2019-01-20 00:30:11 · 1466 阅读 · 0 评论 -
事件和观察者模式
这篇文章主要是用观察者模式去理解事件首先得清楚几个基础:1.委托相当于c里面的指针2.委托能够动态传递方法3.委托可以引用实例和静态方法4.委托的实质是类5.事件是委托的集合封装(这个就是经常有人说的事件就是多播委托,不违背面向对象的封装特性)观察者模式(这里讲非常经典的例子:猫叫老鼠跑)的问题1.观察者:老鼠。观察的目标:猫2.猫发出叫声,老鼠原创 2016-09-11 14:15:08 · 3062 阅读 · 0 评论 -
C#深入解析数据类型
首先本文将会说到的知识点:1.值类型和引用类型的原理2.线程栈和托管堆3.装箱和拆箱4.类型判等基本类型原理:c#的基本类型是按照数据在计算机内存是如何被分配来划分,一种是值类型(Value Type)基础类型是结构,使用中内存保存在栈中,一种是引用类型(Reference Type)基础类型是类,使用中内存保存在堆中常用关键字new创造空间。还有一种特殊类型,这里称之为简单类型,string类型...原创 2017-12-24 11:20:28 · 6721 阅读 · 0 评论 -
深入解析浅复制和深复制
通过c#类型基础了解到变量在内存中的状态,那么我现在想把一个变量传递给另一个变量,对值和对象进行复制。实际上浅度复制是把栈中的数据复制下来,深度复制是把堆上的值进行复制。那么什么时候使用深复制什么时候来使用浅复制呢,假如我请求一次数据库获取到这个对象,再创建新对象的时候可能会用复制的方式来创建这个对象,而不是再去请求一次数据库。浅复制:先看一段代码,class Program { ...原创 2017-12-30 07:34:24 · 2646 阅读 · 0 评论 -
深入解析委托
先来到一个场景,小明、欧阳轰、王麻子是一个寝室的,有一天小明去吃午饭,欧阳轰说:帮我带一瓶饮料呗。这里,可以看出一个小小的委托关系,小明是欧阳轰的被委托人(经纪人),欧阳轰不用自己去做,请一个人代替他去做。这个时候王麻子也不想下楼了说:随便帮我带一个饭,还来一瓶饮料吧,我不挑食。这里的被委托人可以接受不同的委托人委托的事情,也可以是多件不同的事情。下面我们用代码实现,这里呢用两种方式调用...原创 2018-04-22 19:52:04 · 5812 阅读 · 0 评论 -
跨域调用WebService
WebService使用还是比较广泛的,这里我们来介绍两种跨域请求调用WebService的方法。首先我们来介绍下什么是WebService,Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过U...原创 2018-05-20 00:15:05 · 1512 阅读 · 0 评论 -
上传大文件:在 System.Web.HttpRequest.GetEntireRawContent()
我们在使用上传文件控件上传大型视频、文件等会出现这样的情况其原因是因为我们webconfig配置文件里面配置默认为4MB,所以不管你在控件里面怎么加大上传空间也是上传不了的。我们在配置文件里面找到httpRuntime这个节点<httpRuntime requestValidationMode="2.0" targetFramework="4.5" maxRequestLength="102...原创 2018-05-08 15:32:24 · 1115 阅读 · 2 评论 -
ITextSharp生成PDF
ITextSharp就不多介绍了,下面就把遇到的坑一一记录下来,希望能够帮助到正在使用它的开发者们。操作pdf的方法都被作者封装好了,只是没有注释和说明,不过大部分的方法属性还是能看懂的,看不懂的可以反编译一下。gethub下载dll地址:https://github.com/itext/itextsharp/tags1.输入文字不显示中文,文字换行2.文字加颜色、字体大小、加粗、斜体...原创 2018-06-07 11:46:46 · 8623 阅读 · 1 评论 -
SqlBulkCopy批量插入数据库
今天发现了一个超级快速插入大量数据到数据库的方法SqlBulkCopy,由于我这里是读Excel文件,所以我这里会提及到处理空行的方法和读取Excel的方法。下面我们会通过数据库跟踪器跟踪数据库发生了什么。我们开始创建一个模型public class TBModel { public string name { get; set; } public...原创 2018-06-08 14:47:24 · 2359 阅读 · 0 评论 -
C#中的?和?? 可空类型和空值判断
我们先看一个例子,在数据库里面有些数据比如说int类型datetime类型是非必填的,所以有的时候这个类型不需要给它一个初始值,直接是null,那么对应c#里面的数据类型如果是int类型我们需要它是一个null怎么办呢?int i;Console.Write(i);//提示这个i没有赋值不可以使用i = null;//提示无法把这个null转换成int类型上面这两种方式都不可以实现...原创 2018-11-27 01:39:01 · 5160 阅读 · 1 评论 -
匿名方法
什么是匿名方法匿名方法字面意思就是没有名字的方法,其实编译器帮我们生成了一个方法名,匿名方法是c#2.0提出来的,也是在委托的基础上上面演变出来的,在3.0之后,微软推出了lambda表达式,取代了匿名方法,在之后的文章里会详细介绍lambda表达式下面我们来试试delegate void DelegateTest(string values);static void Main(s...原创 2018-12-12 10:58:51 · 726 阅读 · 0 评论 -
迭代器的实现与原理
说起迭代器我们对它的印象大概就是能够使用foreach关键字来遍历一个集合,还必须实现IEnumerable或IEnumerable<T>接口,实现里面的GetEnumerator方法。那么具体是怎样的呢?其实迭代器跟数据库的游标非常相似,读取方式就是一直往下读,直到读完为止。下面我们来介绍C#是如何实现这个迭代器的步骤:首先,我们要找到这个对象然后,打开这个迭代器(Get...原创 2018-12-24 12:17:24 · 2922 阅读 · 0 评论 -
Lambda表达式
lambda表达式的写法符号是“=>”,简称为:goes to,如:x=>x+x、x=>{1+1},左边是参数,右边是一个方法体,只是省去了发括号,lambda表达式可以创建委托、表达式树的匿名函数,使用起来比匿名函数更加简洁。lambda表达式符号是一个右结合运算,与“=”有相同等级的优先级。下面我们来试试//定义一个委托delegate bool D();cla...原创 2019-01-17 18:05:28 · 1250 阅读 · 0 评论 -
CS0656 缺少编译器要求的成员“Microsoft.CSharp..........
严重性 代码 说明 项目 文件 行 禁止显示状态错误 CS0656 缺少编译器要求的成员“Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create”问题出现原因:在net core使用动态类型dynamic,在编译的时候提示错误信息如上。解决方案:1.不用dynamic类型2.在使用的地方添加一个dll,Microsoft...原创 2019-01-08 10:25:22 · 20218 阅读 · 5 评论 -
表达式目录树(Expression)
表达式目录树什么是表达式目录树呢?用于表示Lambda表达式逻辑的一种数据结构,表达式树也可以称作表达式目录树,它 将代码表示成一个对象树,而不是可执行的代码。这个跟汇编原理一样,我们找到关键字,把这些语句翻译成机器码,我们这里的关键字就是表达式树里面的节点,然后分析语法词法,最后变成机器可识别的指令。表达式目录树有什么作用呢?我们在使用ef框架的时候经常使用linq,使用linq to ...原创 2019-07-28 16:33:05 · 10518 阅读 · 0 评论