随笔分类 -  C#

摘要:之前有个电话面试,其中一道题就是:用非递归的方式实现文件夹遍历?在电面的时候没有答出来,过后分分钟就想到了答案,因为之前自己实现过按层序的方式打印一棵树,用的也是非递归的方式,现在遍历文件夹不就是遍历这颗树吗!怎么就没想出来呢!在这里简单的记录下,用了C#和C++两个版本实现。 我这里的实现的功能是 阅读全文
posted @ 2014-05-30 12:14 啊汉 阅读(8391) 评论(19) 推荐(4) 编辑
摘要:最近看了一下吴军的数学之美。书很好,废话我就不多少了。看了第9章图论和网络爬虫,一直都觉得网络爬虫很牛B,搜索引擎不就是用爬虫爬网页的吗,于是想写一个简单的爬虫来爬网页试试,最先想到的就是给自己的博客建一个目录,够小够简单了吧,于是就有了这篇文章,简单的分享一下,先申明我的实现很简单没有技术含量,在看下文之前可以先看看 我的博客目录。 源码必共享简单介绍一下网络爬虫的原理:给你一个网页地址,先把这个网页下载下来,然后分析这个网页的内容,得到这个网页中的所有链接,然后下载这些网页,继续分析下载。这样就能下载互联网上的很多网页。原理就这么简单,实现起来就不那么容易了。由于深入不了只能说简单的。构造 阅读全文
posted @ 2013-02-20 15:38 啊汉 阅读(3250) 评论(12) 推荐(11) 编辑
摘要:1:多余的存储引用导致性能降低;2:利用局部性提高程序性能;先来说说引用是怎么降低程序性能,个人认为降低程序性能主要有两个原因,一是数据结构选择不合理,二是多层嵌套循环导致部分代码被多余重复执行。在第二种情况下我们一般都是优化循环最里层的代码,能提出来的尽量往外层提,实在不行的就优化它的运行速度。1:多余的存储引用导致性能降低。先来看一个关于引用导致性能降低的问题。下面两个方法哪个更快。 static void Test2(ref int sum) { for (int i = 1; i <= timer; i++) { ... 阅读全文
posted @ 2013-01-13 17:14 啊汉 阅读(3109) 评论(15) 推荐(10) 编辑
摘要:本周四同事分享了一个思维训练的PPT,里面有一个关于翻牌的题目,题目大致是:拿出从A到10的10张扑克牌,背面朝上摞在一起。首先把最上面的一张挪到下面,掀开新出现的一张牌是A,取出,再挪一张牌到下面,翻一张是2,依次类推,可以有顺序地翻出A到10的牌来。请问这10张牌最初是怎么排列的?看完这个题目,我当时说可以用一个算法实现。第二天6点多醒来就一直在想这个问题,开始的时候想用递归实现,最后发现有点复杂,自己实现不了,然后想用数组实现,想法大致是这样的,先将这N个数存到数组中,然后将第一张插到最后面,第二张为A,以此类推,将每张牌经过的索引都记下来,因为每张牌最后是几是知道的,然后反推出1~N张 阅读全文
posted @ 2012-09-16 12:16 啊汉 阅读(3760) 评论(9) 推荐(3) 编辑
摘要:StringBuilder竟然是基于链表而不是数组的集合,它不是2被的增加容量,而是新增一个StringBuilder节点,容量为int num = Math.Max(minBlockCharCount, Math.Min(this.Length, 8000));minBlockCharCount:填满上个节点后剩余的字符个数;this.Length:上两个节点的容量之和新增的数据往里面填,基本上每个节点的最大容量就是8000个字符,满了之后再新增节点,不会拷贝以前的数据。StringBuilder有一个名为m_ChunkPrevious的字段,指向上一个节点。不知道这是新的实现方式还是以前就 阅读全文
posted @ 2012-08-22 19:05 啊汉 阅读(1744) 评论(9) 推荐(0) 编辑
摘要:不知不觉毕业两年工作三年了,回忆记录一下。大学。话还得从大学开始说起,高考两次顺利考上了武汉的一个著名专科学校,以极度郁闷的心情开始了我的大学生涯。大一上半年基本上是浑浑噩噩的过来的,印象最深刻的是和几个死党打牌,没有任何精神寄托,下半年开始学习C语言,听说是个很牛B的编程语言,就很想学习,差不多用了1个月的时间把高数课本看完了,以后上高数课我就拿出一本从同学那里借来的C语言看啊看,期末考试高数还考了98分,专科高数考得浅吗!C语言就没有那么好学了,到现在为止还是觉得要是哪天我能成为一名C语言程序员该多好。只学JAVA。自从开了JAVA这门课程,我就再也没有学习学校的任何课程,小学的一篇课文《 阅读全文
posted @ 2012-06-17 10:27 啊汉 阅读(10892) 评论(47) 推荐(13) 编辑
摘要:1:银联充值1:环境部署安装NetPay4NTSetup.exe,将MerPrk.key和PgPubk.key两个文件放到C:\WINDOWS目录下,环境部署完成了。2:程序中要注意的问题最容易导致问题的就是生成加密串,这个加密功能是由银联提共的,调用Interop.CHINAPAYLib.dll中类CHINAPAYLib.NetPayClientClass的sign方法,由于这是对字符串进行加密,不同的字符串加密后的串是不一样的,所以要注意被加密字符前后是否有多余的空格,支付金额的位数,如果加密串生成有误,到银联那边肯定报参数有误的。充值成功后就是回调解密,解密调用的是CHINAPAYLib 阅读全文
posted @ 2012-05-29 11:29 啊汉 阅读(4072) 评论(27) 推荐(10) 编辑
摘要:1:JIT(即时编译)。一个方法在第一次调用时JIT会把改方法的IL代码转换成CPU指令,再次调用该方法时就只需执行对应的指令。方法第一次被调用的过程大致是:1获得方法的IL代码;2:分配内存;3:将IL代码转换成CPU指令存在2分配的内存中;4:将方法表中对应该方法的指针指向2分配的内存;5:跳转到2分配的内存执行其中的指令,即该方法的CPU指令。2:as的性能高于is。Is的作用是判断当前类型与目标类型是否兼容,即是否是同一类型或者目标类型是当前类型的父类型。强制类型转换也要判断类型的兼容性,如果不兼容就抛出一个类型转换异常,如果你的代码类型转换用Is+强制类型转换就做了两次兼容性判断,而 阅读全文
posted @ 2012-05-18 11:33 啊汉 阅读(2975) 评论(14) 推荐(2) 编辑
摘要:C#成员的初始化顺序你真的非常清楚吗,我发现有点坑爹,坑到爹突然有点搞不清楚什么状况。下面咱们开始分析,先看3个简单类。 public abstract class Base { public Base() { SetValue(); } public abstract void SetValue(); } public class Sub : Base { public string value; public Sub() { ... 阅读全文
posted @ 2012-04-19 13:25 啊汉 阅读(9637) 评论(82) 推荐(3) 编辑
摘要:垃圾回收还得从根说起,就像生儿育女一样。根:根是一个位置,存放一个指针,该指针指向托管堆中的一个对象,或是一个空指针不指向任何对象,即为null。根存在线程栈或托管堆中,大部分的跟都在线程栈上,因为定义的变量就存在线程栈上,类型对象指针存在托管堆中,因为实例化一个对象要额外分配两个字段“类型对象指针”和“同步块索引”。类型对象指针的作用。实例化一个对象并没有为其方法分配内存,类型的静态字段分配内存,而实例要向调用属于类型的一些东西,就必须通过类型对象指针。如对象的实例是共用类型的方法,实例只需要通过类型对象指针调用类型的方法,更多关于方法的调用请看我的这篇博客。同步块索引的作用。1:用于loc 阅读全文
posted @ 2012-04-12 12:21 啊汉 阅读(8264) 评论(27) 推荐(3) 编辑
摘要:我们都知道Dictionary<TKey, TValue>查找元素非常快,其实现原理是:将你TKey的值散列到数组的指定位置,将TValue的值存入对应的位置,由于取和存用的是同一个算法,所以就很容易定位到TValue的位置,花费的时间基本上就是实现散列算法的时间,跟其中元素的个数没有关系,故取值的时间复杂度为O(1)。 集合无非都是基于最基础语法的数组[],先欲分配,然后向其中添加元素,容量不够就创建一个2倍容量的数组,将之前的元素赋值过来,将之前的数组回收,但基于散列算法的集合这点上有点不同,他并不是每次创建一个2倍容量的数组,为了让元素均匀的分布到数组上,数组的容量是这么增长 阅读全文
posted @ 2012-03-15 10:17 啊汉 阅读(2115) 评论(9) 推荐(3) 编辑
摘要:一直对搜索、过滤很好奇,觉得他们很有技术含量,只有非常NB的人才能做。很想知道他们的原理,实现这样的功能,设计是不是必须得非常NB非常奇特,代码是不是要写得非常好,性能非常高。总之这一切都不是我这样级别的人能做的。直到我看了《编程珠玑(第二版)》中的这么一段文字:“假定我们可以在执行搜索之前对文本内容进行预处理,那么我们可以建立一个撒列表(或者搜索树),为文档中的每个不同的单词建立索引,并为每个单词的每次出现存储一个链表,这样的逆向索引使得程序可以很快的找到给定的单词,为了查找短语,我们可以对其中包含的每个单词的链表进行交叉,但实现起来比较复杂,速度可能会很慢。(不过一些网页搜索引擎用的就是这 阅读全文
posted @ 2012-01-20 17:20 啊汉 阅读(4827) 评论(16) 推荐(7) 编辑
摘要:其实就是多线程构造多个请求,请求同一个地址,在网站测试的时候还是能用上的,有的时候方法在同一时间只能被一个线程访问,用这个工具就可以测试的方法是不是真的是在同一时间只能被一个线程访问,在处理订单的时候用处就大了,如银行订单,支付宝订单,骏卡订单等,我们都知道一个订单只能被处理一次,也就是说在同一时间只能有一个线程处理这个订单,等这个线程处理完之后,才能让其他线程访问,等这个线程处理完之后,其他线程在来访问,就直接提示订单的处理结果,用这个工具测试就很方便了,因为他是多个线程同时访问的吗!前段时间CSDN泄密的原因,大家都说CSDN的技术很烂,我当时就做了个很简单的工具,就是不停的请求CSDN的 阅读全文
posted @ 2012-01-18 12:11 啊汉 阅读(3753) 评论(23) 推荐(4) 编辑
摘要:C#运行时的相互关系本博客主要讲述运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别,以及内存的分配和回收。线程栈:在一个进程中可能包含多个线程,一个线程在创建的时候,会分配到一个大小1MB大小的栈,栈用于存储方法的实参、形参以及方法内部的局部变量,栈是从高位内存地址向地位地址构建的,由于栈有先进后出的特点,所以先定义的变量后被回收。下面来看一个简单的例子,让你更了解线程栈由于线程栈是从高位开始分配内存,先分配的我就画在上面了,在调用F1();方法时,分配内存的顺序是:name->n->F2的返回地址->Age->name;回收内存的顺序当 阅读全文
posted @ 2011-12-26 22:08 啊汉 阅读(3462) 评论(7) 推荐(4) 编辑
摘要:垃圾回收--代代是CLR垃圾回收器采用的一种机制,他唯一的目的就是提升应用程序的性能,采用代的垃圾回收器做到了一下几点:1:对象越新,生存周期越短,跟栈的原理很像,先进后出,先定义的局部变量,在栈中停留的时间相对长一点。2:对象越老,生存周期越长,后面解释。3:回收堆的一部分,速度快于回收整个堆,那是肯定的,就是为了实现只回收一部分内存中的数据,才产生了代的概念,大多数时间只回收第0代。第0代:托管堆在初始化的时候不包含任何对象,新分配在堆上的对象被称为第0代,垃圾回收器从没有检查过他,CLR在初始化的时候,会为第0代预算了一个容量,假设为256KB,容量一般为128KB的整数倍,这跟CPU的 阅读全文
posted @ 2011-12-19 18:01 啊汉 阅读(2665) 评论(13) 推荐(6) 编辑
摘要:C#方法1:实例构造器和类2:实例构造器和结构3:类型构造器4:操作符重载方法5:转换操作符方法6:扩展方法 7:部分方法这篇博客的内容基本上是CLR via C#中第八章 “方法”的大致内容,如果我说得不对,欢迎大家搬砖头1:实例构造器和类构造器是允许将类型的实例初始化为良好状态的一种特殊方法,创建一个引用类型的实例时,先为实例的数据字段分配内存,然后初始化对象的附加字段(类型对象指针和同步索引),最后调用构造函数来设置对象的初始状态。构造函数不能被继承,所以不能被virtual、new、override、sealed和abstract修饰,若没有显示定义任何构造函数,编译器将定义一个无参的 阅读全文
posted @ 2011-12-10 16:43 啊汉 阅读(6605) 评论(5) 推荐(1) 编辑
摘要:委托委托:委托是一种安全地封装方法的引用类型,他是面向对象的、类型安全的和保险的,它可以代理一个或是多个方法,或是代码块执行,由于是引用类型,它保存的不是实际值,而是保存对存储在托管堆中的对象的引用,即对函数的引用。构造委托对象的方法:命名方法:使用命名方法构造的委托可以封装静态方法或实例方法(当然定义定义委托的时候不能用static修饰,静态方法不能调用实例化方法),命名方法代理的是方法。public delegate void SampleDelegate(string message);public static void SampleDelegateMethod(string mess 阅读全文
posted @ 2011-11-26 18:03 啊汉 阅读(2328) 评论(1) 推荐(2) 编辑
摘要:C#自定义分页控件3.0 C#自定义分页控件不知不觉也到了3.0,说明问题还是有一些,开始的时候考虑得不够周到,第一版出来的时候,感觉还行,等自己再次看代码的时候,发现还是有待改进。 热烈欢迎下载使用,剖析,批评,提修改建议。我要下载C#自定义分页控件3.0 这篇博客对很多人可能没有什么帮助,若有时间,可以看看源码,说不定对你的损失还有点小小的挽回,下一篇博客可能会对你有所帮助,这次这么久都没有写博客,是因为项目太忙了,下一篇会写写自己失败的教训,因为最近做的一个项目,60%多的代码都是我一个人写的,前期没有做好准备,导致后期比较麻烦,还好昨天晚上已经上线了,地址如下目标软件充值中心:h... 阅读全文
posted @ 2011-11-15 13:41 啊汉 阅读(3603) 评论(15) 推荐(4) 编辑
摘要:C#自定义分页控件第二版首先我要说明,我自认为我做的这个自定义分页控件没有什么技术含量,再次说明它只是为了生成所需的HTML代码而已。Demo下载,含源码。第二版改进之处:1. 将生成A标签的class改为了struct,因为它只有属性和ToString()方法,class和struct的什么什么我就不废话了。2. 加了一个事件方法OnPageChanging,分页相关的代码就写在这个事件里即可。3. 除了默认值之外,去掉了所有硬编码,代码做了一些优化。由于能力有限,一定还存在很多缺陷,所以版本会一直升级,我没有要和AspNetPager比的意思,AspNetPager非常强大,好话不多说,我 阅读全文
posted @ 2011-08-21 11:35 啊汉 阅读(2392) 评论(13) 推荐(1) 编辑
摘要:C#自己写的一个自定义分页控件(源码下载,没有DEMO)分页以前一直是用第三方分页控件AspNetPager.dll,使用起来也挺方便的,就是样式设置起来感觉不是很好,于是经理决定我们自己做一个分页控件,这个任务就交到我的手上。这个自定义分页控件是模仿58同城的分页及结合我们现在项目的需要写的。感觉比较实用,没什么亮点。 其实分页控件也没啥,就是生成相关的HTML代码,你需要啥HTML代码,用你的代码生成就是了,不管是AspNetPager.dll还是58同城也都是生成分页相关的HTML代码,其实就是一堆a标签,点分页的时候,分页控件所在的页面会刷新。一:用AspNetPager.dll实现. 阅读全文
posted @ 2011-08-19 13:28 啊汉 阅读(8314) 评论(29) 推荐(7) 编辑