C#
文章平均质量分 93
鹅厂程序小哥
与你一起写程序 | 知乎:鹅厂程序小哥 | 微信公众号:鹅厂程序小哥
展开
-
C# 理解lock
一. 为什么要lock,lock了什么?当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待。但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当对同一个资源进行读写的时候,我们要使该资源在同一时刻只能被一个线程操作,以确保每个操作都是有效即时的,也即保证其操作的原子性。lock是C#中最常用的同步方式,格式为lock(objectA){转载 2015-10-20 15:27:53 · 487 阅读 · 0 评论 -
C# 中的 ConfigurationManager类引用方法
c#添加了Configuration;后,竟然找不到 ConfigurationManager 这个类,虽然引用了using System.Configuration;这个包,但是还是不行的。后来终于找到一个解决方法,就是在解决方案资源管理器里然后右击解决方案,选择“添加引用”,找到System.Configuration把它加上去就OK啦原创 2016-05-03 22:49:03 · 551 阅读 · 0 评论 -
C#反射Assembly 详细说明【1】
什么是Assembly(程序集)?Assembly是一个包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合。在.net框架中通过Assembly类来支持,该类位于System.Reflection下,物理位置位于:mscorlib.dll。Assembly能干什么?我们可以通过Assembly的信息来获取程序的类,实例等编程需要用到的信息。一个简单的转载 2016-05-03 22:58:02 · 390 阅读 · 0 评论 -
C#反射Assembly 详细说明【2】
1、对C#反射机制的理解2、概念理解后,必须找到方法去完成,给出管理的主要语法3、最终给出实用的例子,反射出来dll中的方法反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等程序集内部的信息。使用反射可以看到一个程序集内部的接口、类、方法、字段、属性、特性等等信息。在System.Reflection命名空间内包含多个反射常用的类,下面表格列出了常用的几个类转载 2016-05-03 23:00:56 · 505 阅读 · 0 评论 -
Serializable在C#中的作用.NET 中的对象序列化
简介序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。在面向对象的环境中实现序列化机制时,必须在易用性和灵活性之间进行一些权衡。只要您对此过程有足够的控制能力,就可以使该过程在很大程度上自动进行。例如,简单的二进制序转载 2016-08-17 17:34:21 · 1459 阅读 · 0 评论 -
利用C#的Type.GetProperty实现高效的数据转换
今天在编程程序时,遇到一个使用“|”分割的数据,需要分割数据解析和组装成指定数据类型。先看这个问题需求场景:数据是按如下格式组织的,唯一标示|用户编号|用户名称|…参数代码参数说明primaryKey收费记录的唯一值,以防重复传输。consNo用户编号转载 2017-03-30 14:49:06 · 2508 阅读 · 0 评论 -
BinaryFormatter 序列化及反序列化
.NET框架提供了两种种串行化的方式:1、是使用BinaryFormatter进行串行化;2、使用XmlSerializer进行串行化。第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息,而第二种将数据流格式化为XML存储。 可以使用[Serializable]属性将类标志为可序列化的。如果某个类的元素不想被序列化,1、可以使用[NonSerialized]属转载 2017-03-30 15:36:59 · 510 阅读 · 0 评论 -
[整理]C#反射(Reflection)详解
本人理解:装配件:Assembly(程序集)晚绑定:后期绑定MSDN:反射(C# 编程指南)-----------------原文如下--------1、 什么是反射2、 命名空间与装配件的关系3、 运行期得到类型信息有什么用4、 如何使用反射获取类型5、 如何根据类型来动态创建对象6、 如何获取方法以及动态调用方法7、 动态创建转载 2017-03-30 16:00:52 · 597 阅读 · 0 评论 -
c#范型List的Sort方法详解
.net2005中的范型List类的Sort方法有四种形式,分别是 1,不带有任何参数的Sort方法----Sort(); 2,带有比较器参数的Sort方法 ----Sort(IComparer) 3,带有比较代理方法参数的Sort方法----Sort(Comparison)>)) 4,带有比较起参数,可以指定排序范围的Sort方法----Sort(Int32, Int32转载 2017-03-30 17:09:09 · 305 阅读 · 0 评论 -
C# CSV文件读写
CSV是一种通用的、相对简单的文件格式,最广泛的应用是在程序之间转移表格数据,而这些程序本身是在不兼容的格式上进行操作的。那么,C#如何读取和写入csv格式文件呢?CSV数据格式并没有非常统一的标准 但是为了避免出错 我们在开发的时候统一格式是这样的:"name","pwd","date""张三","123","2015-09-30"接下来代码处理中默认格式都是这样的为什么要用cs转载 2017-03-30 17:10:19 · 868 阅读 · 0 评论 -
.net序列化及反序列化
序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了。比如,一个计数器,数值为2,我们可以用字符串“2”表示。如果有个对象,叫做connter,当前值为2,那么可以序列化成“2”,反向的,也可以从“2”得到值为2的计数器实例。这样,关机时序列化它,开机时反序列化它,每次开机都是延续的。不会都是从头开始。序列化概念的提出转载 2017-03-30 17:33:15 · 218 阅读 · 0 评论 -
C# 中的委托和事件(深入浅出的详解)
C# 中的委托和事件引言委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framewo转载 2017-03-30 18:31:00 · 408 阅读 · 0 评论 -
C#中的委托和事件(续)
C#中的委托和事件(续)引言如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识。但那些远不是委托和事件的全部内容,还有很多的地方没有涉及。本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题,以及事件访问器、异常处理、超时处理和异步方法调用等内容。为什么要使用事件而不是委托变量?在 C#中的委托和事件 中,我提出了两个为什么转载 2017-03-30 19:29:21 · 310 阅读 · 0 评论 -
对象的深度复制
对象的深度复制深度复制就是将引用成员指向的对象也进行复制。实际的过程是创建新的引用成员指向的对象,然后复制对象包含的数据。深度复制可能会变得非常复杂,因为引用成员指向的对象可能包含另一个引用类型成员,最简单的例子就是一个线性链表。如果一个对象的成员包含了对于线性链表结构的一个引用,浅度复制 只复制了对头结点的引用,深度复制 则会复制链表本身,并复制每个结点上的数据。转载 2017-03-30 19:54:08 · 274 阅读 · 0 评论 -
Visual Studio格式化快捷键(Ctrl+E,Ctrl+D)不是命令,不能使用的解决方法
按住ctrl + E + D,在VS中是常用的格式化代码的快捷键,但是经常因为不明情况不好用,网上搜索解决办法是 工具--选项--环境--键盘 然后选择重置,点击确定,快捷键就可以重新使用了。转载 2017-06-02 16:19:00 · 9891 阅读 · 0 评论 -
求解集合内相同元素个数的C#解法
例如有这样一个string类型的数组:{ "A", "B", "C", "B", "A", "B", "C", "B" },求这个集合内相同元素的个数?C#解法:(1)通过linq解答: string arr={ "A", "B", "C", "B", "A", "B", "C", "B" }; var result = from s转载 2017-08-01 15:53:44 · 3147 阅读 · 1 评论 -
求解集合内相同元素个数的C#解法
例如有这样一个string类型的数组:{ "A", "B", "C", "B", "A", "B", "C", "B" },求这个集合内相同元素的个数?C#解法:(1)通过linq解答: string arr={ "A", "B", "C", "B", "A", "B", "C", "B" }; var result转载 2018-01-09 16:29:37 · 1740 阅读 · 0 评论 -
C# 数据类型和字节长度
bool -> System.Boolean (布尔型,其值为 true 或者 false)byte -> System.Byte (字节型,占 1 字节,表示 8 位正整数,范围 0 ~ 255)sbyte -> System.SByte (带符号字节型,占 1 字节,表示 8 位整数,范围 -128 ~ 127)char -> System.Char (字符型,占有两个...转载 2018-03-06 21:28:27 · 5561 阅读 · 0 评论 -
华为软件编程规范和范例
〔一〕=====[排版] ]=======.〔二〕======[注释]=======.〔三〕=====[标识符命名]=======.〔四〕=====[可读性]======.〔五〕=====[变量、结构]=====.〔六〕=====[函数、过程]=====.〔七〕=====[可测性]=====.〔八〕=====[程序效率]=====.〔九〕=====[质量保证]=====.〔十〕=====[代码编辑...转载 2018-03-16 22:31:50 · 1779 阅读 · 0 评论 -
堆栈!堆栈!堆、栈的区别
非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥!基础知识: 堆栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表。允许插入或删除操作的一端称为栈顶,另一端称为栈底,对堆栈的插入和删除操作被称为入栈和出栈。有一组CPU指令可以实现对进程的内存实现堆栈访问。其中,POP指令实现出栈操作,PUSH指令实现入栈操作。CPU的ESP寄存器存放当前线程的栈顶指针,EBP寄存器中保...转载 2018-03-16 22:33:23 · 253 阅读 · 0 评论 -
带你看懂Dictionary的内部实现
了解Dictionary的开发人员都了解,和List相比,字典添加会慢,但是查找会比较快,那么Dictionary是如何实现的呢?Dictionary的构造下面的代码让我们看看Dictionary在构造时都做了什么private void Initialize(int capacity) { int prime = HashHelpers.GetPrime(...转载 2018-03-12 17:39:29 · 1464 阅读 · 0 评论 -
C#数据结构-Dictionary实现
在看过一篇大神写的《带你看懂Dictionary的内部实现》,对Dictionary的内部实现有了一个清晰的了解,但纸上得来终觉浅,作为程序员,还是自己调试一下代码,记忆更深刻,为此专门拷贝出C#的Dictionary源码,因为源码有很多保护级别的代码,不能直接运行。下面贴出我调试没有问题的Dictionary源码(有部分代码没有重写),并附带官方调用实例,方便断点调试。Dictionary源码:...原创 2018-03-12 18:02:31 · 2842 阅读 · 0 评论 -
C#数据结构-最小堆实现
最小堆基本思想:堆对应一棵完全二叉树,且所有非叶结点的值均不大于(或不小于)其子女的值,根结点(堆顶元素)的值是最小(或最大)的,每次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最小(大)堆,依次类推,最终得到排序的序列。堆排序分为大顶堆和小顶堆排序。大顶堆:堆对应一棵完全二叉树,且所有非叶结点的值均不小于其子女的值,根结点(堆顶元素)的值是最大的。而小顶堆正好相反,小顶...原创 2018-03-31 16:47:21 · 1648 阅读 · 0 评论 -
C#数据结构-七大查找算法
阅读目录1. 顺序查找2. 二分查找3. 插值查找4. 斐波那契查找5. 分块查找6. 树表查找7. 哈希查找下面所有的代码,都已经经过vs测试。1.顺序查找基本思想:顺序查找也称为线形查找,属于无序查找算法。C#算法实现:/// <summary> /// 顺序查找 /// </summary> ...原创 2018-03-27 18:14:00 · 6017 阅读 · 2 评论 -
C#数据结构-八大排序算法
阅读目录1. 冒泡排序2. 选择排序3. 插入排序4. 希尔排序5. 快速排序:初始快速排序、三向切分的快速排序(快速排序的优化版)6. 堆排序7. 归并排序:数组版本、List版本8. 桶排序下面所有的代码,都已经经过vs测试。首先,通用的交换函数Swap:private static void Swap(ref int a, ref int b){ i...原创 2018-03-28 15:00:46 · 4101 阅读 · 2 评论 -
C#数据结构-List实现
把C#内部的List<T>手动实现了一遍,实现很多Array开头的方法,比如Array.Copy() , Array.Clear()等,在.NET Framework的内部方法,当然C#内部实现应该更快。同时,拷贝了C#的排序源码,了解了快速排序和内省排序的实现。IList<T>接口实现:namespace StructScript{ public interfa...原创 2018-03-28 16:27:57 · 3630 阅读 · 1 评论 -
C#数据结构-Array.Copy和Buffer.BlockCopy详解
通过对C#文档中Array.Copy()和Buffer.BlockCopy()两个方法的整理,深刻理解其运行原理及实现方式。在理解了Array.Copy()之后,从而对List<T>的拷贝、插入、删除操作实现,有一个更深入的理解。一、Array.Copy的详细文档从给定的索引开始复制数组中的一系列元素,将它们粘贴到另一数组中(从给定的开始复制的索引开始)...原创 2018-03-28 16:53:30 · 25332 阅读 · 1 评论 -
C#数据结构-单链表实现及常见面试题
1. 单链表的插入,删除,搜索2. 反转链表实现思路:表头指向原链表的尾结点 创建一个空的prev指针,指向当前结点,也就是记录下一个结点的上一个结点 修改结点的next指针,指向prev指向的结点,注:头结点的next指向空结点 依次从头结点进行遍历,即可3. 合并两个递增排序的链表实现思路:假设上面虚线内的两个链表,上面的链表为链表1,下面的链表为链表2。...原创 2018-03-28 17:13:44 · 774 阅读 · 0 评论 -
C#数据结构-LinkedList双链表实现
using System;using System.Collections;using System.Collections.Generic;namespace StructScript{ public class LinkedListScript<T> : ICollection<T> { //表头 public...原创 2018-03-28 17:16:22 · 362 阅读 · 0 评论 -
C#数据结构-二叉树实现及常见面试题
二叉查找树二叉排序树,又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。 若它的左子树不为空,则左子树上所有的结点的值均小于根结构的值; 若它的右子树不为空,则右字数上所有结点的值均大于它的根结点的值;1. 前序、中序、后序、层次遍历一般会考查非递归版本的实现,频率很高,在下面的代码递归和非递归版本都有实现。2. 二叉树的镜像具体实现在下面的代...原创 2018-03-28 17:22:03 · 977 阅读 · 0 评论 -
C#数据结构-红黑树实现
在前辈大神的代码基础,完善了删除节点的逻辑,红黑树删除节点时,增加删除节点没有子结点和只有一个子节点的情况处理。同时,对很多实现步骤增加了注释,让代码更加容易理解一些。更详细的介绍,请看C#数据结构-七大查找算法中关于红黑树的介绍倪升武的博客对红黑树有很深的理解,本文的红黑树实现就是在此基础上实现的。简述一下,红黑树的查找和删除的实现原理:红黑树的查找:将要查找的val...原创 2018-03-28 17:25:12 · 3362 阅读 · 12 评论 -
C#数据结构-Queue队列实现
using System;using System.Collections.Generic;using System.Collections;namespace StructScript{ public class QueueScript<T> : IEnumerable<T> { private T[] mArray; ...原创 2018-03-28 17:33:02 · 2284 阅读 · 0 评论 -
C#数据结构-Stack栈实现
using System;using System.Collections.Generic;using System.Collections;namespace StructScript{ public class StackScript<T> : IEnumerable<T> { private T[] mArray; ...原创 2018-03-28 17:37:45 · 435 阅读 · 0 评论 -
C#数据结构-string字符串实现
using System;using System.Collections;using System.Collections.Generic;namespace StructScript{ public sealed class StringScript : IEnumerable<char>, IEnumerable, IEquatable<StringSc...原创 2018-03-28 17:41:48 · 881 阅读 · 0 评论 -
C#数据结构-有限状态机
有限状态机FSM的要点是: 拥有一组状态,并且可以在这组状态之间进行切换。 状态机同时只能在一个状态。 一连串的输入或事件被发送给机器。 每个状态都有一系列的转换,转换与输入和另一状态相关。当输入进来,如果它与当前状态的某个转换匹配,机器转为转换所指的状态。 目前而言,游戏编程中状态机的实现方式,有两种可以选择: 用枚举配合switch case语句。 实...原创 2018-04-05 17:22:18 · 2657 阅读 · 0 评论 -
【最通俗易懂】A*寻路算法C#实现
A*算法其实也不复杂,首先有以下几个概念: 开启的节点表(OpenList) 存放着所有的待检测的节点(坐标),每次都会从其中寻找出符合某个条件的节点。 关闭的节点表(ClosedList) 存放着所有不会被检测的节点(坐标),每次检测都会忽略它们。 首先,我们定义了两个点,分别是起点和终点。整个算法的核心就是启发式的权值比较,分为G和H值。一般我们将按非斜向方...原创 2018-04-05 17:59:24 · 3467 阅读 · 3 评论 -
C#内功修炼(算法)——分治法(一)
分治法(递归的解决问题)分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。可使用分治法求解的一些经典问题(1)二分搜索(2)大整数乘法(3)Strassen矩阵乘法(4)棋盘覆盖(5)合并排序(6)快...转载 2018-04-19 16:46:46 · 591 阅读 · 0 评论 -
C#内功修炼(算法)——树(二 )
树结构树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示。树在计算机领域中也得到广泛应用,如在编译源程序如下时,可用树表示源源程序如下的...转载 2018-04-19 16:49:16 · 178 阅读 · 0 评论 -
C#内功修炼(算法)——堆排序(三 )
堆:堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于等于其左右孩子结点的值,称为小顶堆!堆排序:堆排序算法就是利用堆(小顶堆或者大顶堆)进行排序的方法。将待排序的序列构造成一个大顶堆,此时整个序列的最大值就是根节点。将它移走(跟堆的最后一个元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中...转载 2018-04-19 16:50:04 · 128 阅读 · 0 评论 -
C#内功修炼(算法)——动态规划(四)
动态规划(Dynamic Programming)动态规划算法通常基于一个递推公式及一个或多个初始状态。当前子问题的解将由上一次子问题的解推出。动态规划和分治法相似,都是通过组合子问题的解来求解原问题。分治法将问题划分成互不相交的子问题,递归求解子问题,再将他们的解组合起来,求出原问题的解。与之相反,动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题。在这种情况下,分治算法会做出许多...转载 2018-04-19 16:51:02 · 586 阅读 · 0 评论