雁过请留痕...
代码改变世界

随笔分类 - C#

.NET实现事务的编码方式

2018-03-19 10:32 by xiashengwang, 93 阅读, 收藏, 编辑
摘要:1,在T-SQL语句中用begin tran,end tran的方式 begin tran --select top(1) * from dbo.test with(updlock) update test with(updlock) set name ='name_upd' where id = 阅读全文

[转]MS SQL Server 数据库连接字符串详解

2018-03-16 11:22 by xiashengwang, 87 阅读, 收藏, 编辑
摘要:http://blog.csdn.net/jackiehome/article/details/8668121 问题 : 超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。 解决办法 1. 在代码里面 , 把未关闭的连接关闭 2. 扩大共享 阅读全文

[转].Net连接池超时注意事项

2018-03-16 11:21 by xiashengwang, 200 阅读, 收藏, 编辑
摘要:http://blog.csdn.net/jxqvip/article/details/6738551 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。 解决办法1.在代码里面,把未关闭的连接关闭2.扩大共享池,方法如下:解决方法可 阅读全文

Jquery调用ajax参数说明

2017-12-22 11:22 by xiashengwang, 126 阅读, 收藏, 编辑
摘要:代码中有详细注释,直接上代码。 注释掉的选项,一般用不到,直接用最基本的部分就可以了。 阅读全文

HttpWebRequest、HttpWebResponse获取网页

2017-05-22 14:46 by xiashengwang, 95 阅读, 收藏, 编辑
摘要:1,通过HttpWebRequest、HttpWebResponse获取一个流 2,读取流成字符串 方法1:利用Stream的Read方法 方法1中的response.ContentLength可能为-1(和服务器的压缩有关),造成数组初始化失败。 网上方法:添加 request.Headers.S 阅读全文

String Format for Double [C#]

2017-05-22 10:25 by xiashengwang, 735 阅读, 收藏, 编辑
摘要:转载:http://www.csharp-examples.net/string-format-double/ he following examples show how to format float numbers to string in C#. You can use static met 阅读全文

sqlserver查看和解除表死锁

2017-01-23 13:29 by xiashengwang, 11496 阅读, 收藏, 编辑
摘要:1,查看那个表死锁 2,结束死锁的进程 阅读全文

调用cmd.exe执行pdf的合并(pdftk.exe)

2016-07-12 16:31 by xiashengwang, 845 阅读, 收藏, 编辑
摘要:今天调查一个pdf文件的抽取,合并功能,用到下面这个工具(pdftk): https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/ 在cmd.exe里执行的很好,但在.net环境下,用程序调用就出问题,调用代码如下: 不管怎么调试,代码就卡在p.Sta 阅读全文

以Lockbits的方式访问bitmap

2015-01-15 11:38 by xiashengwang, 4588 阅读, 收藏, 编辑
摘要:用Bitmap.GetPixel和Bitmap.SetPixel访问像素点实在是太慢了,必须要用LockBits的方式访问内存才能改善,这里贴一个快速访问Bitmap每个像素点的包装类,是国外一个老外写的,感觉很好用。 public class LockBitmap { Bitmap source = null; IntPtr Iptr = IntPt... 阅读全文

【转】Graphics 关于呈现质量与合成模式

2015-01-14 15:34 by xiashengwang, 328 阅读, 收藏, 编辑
摘要:GDI+相关的作图,每种语言都有其自身的封装类,但本质上是一样的,下面这篇文章写的非常好,对于C#的Graphics类也是使用的,所以转载了,原文在这里: http://www.cnblogs.com/del/archive/2009/12/22/1630120.html 相关内容有: IGPGraphics.SmoothingMode; { 绘图质量 } IGPGraph... 阅读全文

【转】使用lockbits方法处理图像

2015-01-07 14:11 by xiashengwang, 500 阅读, 收藏, 编辑
摘要:许多图像处理任务即时是最简单的文件类型转换,例如从32位深度到8位深度的格式转化,直接获得像素阵列要比使用GetPixel和SetPixel等方法的效率高得多。 你可能会发现DotNet采用托管机制,大多数情况下微软会推荐你使用托管代码,理由是便捷和安全。实际应用中,直接操作内存中的数据块是很少见的,尽管如此,图像处理恰恰是这类为数不多的情况之一,因为使用托管代码的效率低的难以忍受,特别是对巨幅图... 阅读全文

DataTable 行删除

2014-12-24 15:08 by xiashengwang, 2840 阅读, 收藏, 编辑
摘要:今天在阅读一个项目中的代码时,发现删除DataTable的数据时用的dataTable.Clear(); 由于以前自己习惯都是用dataTable.Rows.Clear();因此突然感觉到很茫然,难道这两者有啥不一样?于是一阵百度,Bing搜索,在加上Reflector的帮助,结论如下:1,data... 阅读全文

Windows API 常用函数

2014-10-15 14:21 by xiashengwang, 2008 阅读, 收藏, 编辑
摘要:.Net中虽然类库很强的,但还是有些时候功能有限,掌握常用的api函数,会给我们解决问题提供另一种思路,下面给出自己常用到的Api函数,以备查询。 知道api函数,但却不知道c#或VB.net该如何声明,可以查询这个网站:http://pinvoke.net/ 1,SetForegroundWindow 将窗口显示到最前面,前提是窗口没有最小化。 [DllImport("User32.dl... 阅读全文

winform上控件的拖拽小结

2014-10-14 15:25 by xiashengwang, 8839 阅读, 收藏, 编辑
摘要:这里罗列出几个相关的事件和属性,具体的实现介绍已有非常优秀的文章了,文章末尾我将会给出,大家可以去参考。 属性: AllowDrop: 目标控件必须设定为true,才能接受拖拽来的东西。 事件: ItemDrag: 源控件在拖动开始时发生。在这里需调用DoDragDrop方法开始拖拽行为。 DragEnter:目标控件接受到拖拽行为时发生。在这里可以通过e.Effect设定目标控件能接受的拖拽行为... 阅读全文

【进阶修炼】——改善C#程序质量(10)

2014-10-09 16:36 by xiashengwang, 201 阅读, 收藏, 编辑
摘要:158,不要写冗余注释。 注释应该写代码没有表达的东西。 代码能够自我描述就不要加注释。 159,废弃的注释应该尽早删除。 废弃的注释由于年代太久远,已经和现在的代码逻辑不匹配了,这样的注释只会误导人,应该删除。 160,注释掉的代码。 这是一个灾难,没有人知道它还有没有用,一直被遗留下来,然后代码不断的腐朽下去,勇敢的删除它吧,版本管理工具会记得它。 160,死函数。 死函数,即没有被调用... 阅读全文

【进阶修炼】——改善C#程序质量(9)

2014-10-09 16:35 by xiashengwang, 166 阅读, 收藏, 编辑
摘要:140,使用默认的访问修饰符。 如果不加访问修饰符,成员变量的默认是private的,类默认是internal的。为了明确访问的权限,我倒是建议都加上访问修饰符,这省不了多少代码。 141,不知道该不该加大括号的时候就加上。 大括号会多占用两行代码,到底一行语句的代码需不需要加大括号这是一个争论。但是为了避免引入不必要的bug还是加上吧。 142,总是提供有意义的命名。 我们不希望看到如iTe... 阅读全文

【进阶修炼】——改善C#程序质量(8)

2014-10-09 16:34 by xiashengwang, 142 阅读, 收藏, 编辑
摘要:122,以.作为命名空间。 如Microsoft.Windows.Design。也可以用域名作为空间,如www.microsoft.com,就可以写成com.microsoft. ,这种命名方法在java中比较常见。但.net中似乎不是很推荐,最好用第一种。好的命名空间可以避免不同程序集间类名的冲突。 123,程序集不必与命名空间同名。 程序集名称表示的是物理分组,而命名空间是逻辑分组,两者没有... 阅读全文

【进阶修炼】——改善C#程序质量(7)

2014-10-09 16:33 by xiashengwang, 145 阅读, 收藏, 编辑
摘要:113,声明变量时考虑最大值。 Ushort的最大值是65535,用于不同的用途这个变量可能发生溢出,所以设计时应充分了解每个变量的最大值。 114,MD5不再安全。 MD5多用于信息完整性的校验。R=H(S),MD5的算法是不可逆的,也就是我们几乎没有可能根据生产的MD5码去还原原文。但是我们可以使用穷举的办法生成MD5码来对比,由于我们平常设定的密码都比较简单,如:123456,根本不用很长... 阅读全文

【进阶修炼】——改善C#程序质量(6)

2014-10-09 16:32 by xiashengwang, 179 阅读, 收藏, 编辑
摘要:90,不应为抽象类指定public的构造函数。 抽象类即使指定了public的构造函数,也是不能实例化的,编译通不过。抽象类的构造函数应该设定为protected,它的作用应该是初始化自己的成员,以及可以被子类构造函数调用。设定为public权限毫无意义。 91,可见字段应该重构为属性。 属性比字段有更好的灵活性,可以加入代码控制,可以在类型内部实现线程安全访问,可以让类型得到通知(如WPF系统... 阅读全文

【进阶修炼】——改善C#程序质量(5)

2014-10-09 16:31 by xiashengwang, 214 阅读, 收藏, 编辑
摘要:71, 区分异步和多线程的应用场景。 计算机的很多硬件,如硬盘,光驱,声卡,网卡都有DMA(Direct Memory Access)功能,它可以不占用cpu的资源,而异步的提出恰恰就是基于这个的。而多线程是操作系统上的并行执行的代码,是会占用cpu资源的。所以关于这两种的使用场景建议是:1)对于I/0密集型操作使用异步。2)对于计算密集型操作使用多线程。 72, 在线程同步中使用信号量。 值类... 阅读全文

【进阶修炼】——改善C#程序质量(4)

2014-10-09 16:30 by xiashengwang, 331 阅读, 收藏, 编辑
摘要:46, 显示释放资源,需要实现IDisposable接口。 最好按照微软建议的Dispose模式实现。实现了IDisposable接口后,在Using代码块中,垃圾会得到自动清理。 47, 即使提供了显示的释放方法,也应该在终结器中提供隐式实现。 因为我们不能保证用户会主动去调用这个释放方法,但我们要保证在垃圾回收时,这些资源能得到清理。 48, Dispose方法应该允许被多次调用。 我们可... 阅读全文

【进阶修炼】——改善C#程序质量(3)

2014-10-09 16:29 by xiashengwang, 161 阅读, 收藏, 编辑
摘要:32, 总是优先考虑泛型。 泛型代码有很好的重复利用性,和类型安全性。 33, 应尽量避免在泛型类中声明静态成员。 静态成员达不到共享的目的。List和List是两个不同的类型,而静态成员是针对类型的。当然2个List之间是可以共享静态成员的,但为了不必要的混淆,应该避免使用静态成员。 34, 为泛型参数添加约束。 没有约束的参数,功能是有限的,添加了约束后,我们就可以使用约束类型的方法和属性... 阅读全文

【进阶修炼】——改善C#程序质量(2)

2014-10-09 16:28 by xiashengwang, 227 阅读, 收藏, 编辑
摘要:16, 元素可变的情况下应避免用数组。 数组是定长的集合,可以考虑用ArrayList或List集合。ArrayList元素是object类型,有装箱的开销,性能较低。另外Array类提供了Array.CreateInstance来创建数组,Array.Copy来拷贝数组,但这牵涉到新数组的创建,会增加开销。 17, 多数情况下用foreach代替for循环。 18, Foreach不能代替f... 阅读全文

【进阶修炼】——改善C#程序质量(1)

2014-10-09 16:27 by xiashengwang, 363 阅读, 收藏, 编辑
摘要:这是一个大纲形式的概要,以便自己可以花较少的时间反复阅读。在开发中,多加注意这些有用的建议,让自己成为一个更优秀的程序员。内容主要来自《编写高质量代码-改善C#程序的157个建议》(陆敏技),这本书写的真的很好,都是些实战经验的总结,建议大家购买,这其中的建议不仅仅适合于C#,只要你做.NET开发,阅读此书都会从中受益。同时,其他书籍和资料的一些好的编程建议,我也会不断更新到这里。 1,... 阅读全文

接口与virtual,override,new关键字

2014-07-14 17:56 by xiashengwang, 1299 阅读, 收藏, 编辑
摘要:一,类继承接口1,首先我们定义一个简单的ITeacher接口,并定义一个Professor类继承它。 public interface ITeacher { void Print(); } public class Pro... 阅读全文

.Net程序帮助文档制作

2014-07-11 14:06 by xiashengwang, 2586 阅读, 收藏, 编辑
摘要:一,准备工作1,首先介绍一款VS的代码注释插件GhostDoc你也许认为我们在代码中敲入///就能自动生成xml注释,但这种注释是没有说明文字的。而GhostDoc可以生成一些简单的说明文字,如果你的函数命名很规范的话,它生成的函数描述会很准确。并且它还能生成一些参数类型的附加说明。在你想生成代码注... 阅读全文

协变(covariant)和逆变(contravariant)

2014-01-21 16:15 by xiashengwang, 380 阅读, 收藏, 编辑
摘要:我们知道子类转换到父类,在C#中是能够隐式转换的。这种子类到父类的转换就是协变。而另外一种类似于父类转向子类的变换,可以简单的理解为“逆变”。上面对逆变的简单理解有些牵强,因为协变和逆变只能针对接口和代理类型。而父类和子类之间不存在这种逆变的概念。协变和逆变的本质都是子类安全的转到父类的过程。下面就来加深下印象,先定义两个类Car和Baoma public class Car { } public class Baoma : Car { }明显Baoma(宝马)是Car的子类1,先来看看协变协变在C#中要用out关键字标明,用这个关键字就表示参数T只能用于函... 阅读全文

枚举Enum和常量0之间的恩怨

2013-11-29 15:13 by xiashengwang, 1915 阅读, 收藏, 编辑
摘要:1,任何为0的常量表达式都能隐式的转换成枚举Enum。对于这一点,在程序中没少吃苦头。特别是对于函数重载的情况,往往让人一头雾水。看看下面的代码(摘自MSDN),你能猜到输出吗?public enum E{ Zero = 0, One = 1,} class A{ public A(string s, object o) { System.Console.WriteLine("{0} => A(object)", s); } public A(string s, E e) { System.Console.WriteLine("{0} => A(Enu 阅读全文

Lamda表达式的参数捕获,太酷了

2013-11-28 11:22 by xiashengwang, 5589 阅读, 收藏, 编辑
摘要:lamda表达式有了参数捕获这个功能,让Action这个委托变得无所不能。Action委托就是无参数,无返回值的一个代理类型。它只能对应于下面这种类型的函数声明。 public void Function() { //Do something } public void Function2() { //Do something } public void Function3() { //Do something }假设我们定义一个共通的执行... 阅读全文

.Net中的内存分配问题

2013-09-29 15:13 by xiashengwang, 307 阅读, 收藏, 编辑
摘要:最近在测试的时候,要求测试内存不足的情况。我不想去开很多的程序来占用内存,那样太麻烦了,也不太精确。于是就写一个小程序来占用内存,想法很简单,就是声明一个Byte数组在占用内存,没想到这么简单的想法却没能正常工作,出乎我的所料,经过一番折腾,终于搞清楚了原因。using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows. 阅读全文

别误用IsDigit与IsNumber函数

2013-07-27 19:51 by xiashengwang, 17624 阅读, 收藏, 编辑
摘要:1、起因最近发现程序中有一段控制TextBox数字输入的代码,相信大家都不会太陌生,如下: void int_KeyPress(object sender, KeyPressEventArgs e) { const char Delete = (char)8; if (!Char.IsDigit(e.KeyChar) && e.KeyChar != Delete) { e.Handled = true; } }乍一看,好像没有啥问题,但... 阅读全文

双行表头DatagridView的简单实现

2013-07-16 16:38 by xiashengwang, 4096 阅读, 收藏, 编辑
摘要:DatagridView默认不支持多行表头的实现,一些第三方的控件,比如Spread就可以,因此要实现这个功能,只能自己想办法了。介绍两种思路:1,用重写DataGridView的Paint等方法,可以重画表头,这个实现起来较为复杂,费时费力,此处略去。2,利用两个DataGridView,一个DataGridView用来显示第一行标题,另一个DatagridView用来显示第二行表头以及数据部分。实现中遇到一个问题,当列数很多的时候,第二个DatagridView会出现水平滚动条,拉动滚动条,第一个DatagridView并没有随着同步滚动,解决这个问题的方法是在第二个DatagridVie 阅读全文

不可小瞧的GetHashCode函数

2013-03-04 17:27 by xiashengwang, 9492 阅读, 收藏, 编辑
摘要:要实现对象的相等比较,需要实现IEquatable,或单独写一个类实现IEqualityComparer接口。像List的Contains这样的函数,如果我们自己定义的对象不实现IEquatable接口,这个函数会默认调用object的Equels来比较对象,得出非预期的结果。先自定义一个类: ... 阅读全文

byte[]和int型的互转

2012-09-28 17:41 by xiashengwang, 3082 阅读, 收藏, 编辑
摘要:这种转换有有意义的,比如可以将多个byte型的字段,转换后放到一个int字段中。例如color的a,r,g,b值,就可以放到一个int中,需要使用的时候,再从int转换成byte[]数组。它真正的意义还在于给我们提供了另一种存储数据的思想,它比较类似于位图存储法。下面记录下具体的实现方式。用位移运算(关键在于思想) //byte[] --> int byte a = 254, r = 240, g = 230, b = 220; int color = a << 24 | r << 16 | g << 8 | b; ... 阅读全文

c# 不安全代码之指针

2012-09-28 16:43 by xiashengwang, 171 阅读, 收藏, 编辑
摘要:1,首先,编译器的选项里要打开“允许不安全代码”选项。2,代码块要放在unsafe关键字中,或对整个函数使用unsafe关键字。3,对于指向托管变量的指针分配必须放在fixed关键字中。例子: int i; unsafe { byte a = 254, r = 240, g = 230, b = 220; byte[] bytes = new byte[] { a, r, g, b }; //byte[] --> int ... 阅读全文

混合线程同步核心篇——自定义混合同步锁,Monitor,lock,ReaderWriterLockSlim・・・

2012-08-31 10:18 by xiashengwang, 2134 阅读, 收藏, 编辑
摘要:前两篇博客,分别介绍了用户模式和内核模式的同步构造,由于它们各有优势和劣势。本文将介绍如何将这两者的优势结合在一起,构建一个性能良好的同步机制。一,实现一个简单的混合同步锁#region hybird lock/// /// 简单的混合同步锁/// private sealed class Hybi... 阅读全文

基元线程同步——内核模式构造(WaitHandle,EventWaitHandle,AutoResetEvent,ManualResetEvent,Semaphore,Mutex)

2012-08-29 17:46 by xiashengwang, 2191 阅读, 收藏, 编辑
摘要:一、内核模式构造内核模式构造,采用的是windows操作系统来同步线程,比VolatileRead,VolatileWrite,Interlocked等用户模式的构造慢很多。相对于用户模式的构造,它也有自己的优点:1,不用像用户模式那样占着cpu“自旋”,浪费cpu资源。2,内核模式可同步在同一机器不同进程中运行的线程。3,可实现本地和托管线程相互之间的同步。4,一个线程可以一直阻塞,直到一个集合中的内核对象全部可用,或部分可用。(WaitAll,WaitAny)5,阻塞一个线程时,可以指定一个超时值,超过这个时间就解除阻塞。二、FCL提供的内核模式构造层次结构WaitHandle(抽象类) 阅读全文

基元线程同步——Interlocked Anything模式

2012-08-29 14:19 by xiashengwang, 559 阅读, 收藏, 编辑
摘要:上一篇基元线程同步——基础,非阻塞同步(VolatileRead,VolatileWrite,volatile,Interlocked)已经对Interlocked类做了比较详细的分析,这一篇是对Interlocked类的一个模式进行补充说明。如果没用过Interlocked类,可以看看上面的这篇文章。这个模式的名字是Jeffrey给起的,它究竟要解决什么问题,我们为什么要用它?带着这些疑问,我们来看看它的应用场景。看看下面这个设定最大值的例子: private static Int32 Maximum(ref int target, int value) { ... 阅读全文

基元线程同步——基础,非阻塞同步(VolatileRead,VolatileWrite,volatile,Interlocked)

2012-08-25 11:22 by xiashengwang, 2572 阅读, 收藏, 编辑
摘要:一、基元用户模式和内核模式。基元(Primitive):指代码中可以使用的最简单的构造。有两种基元构造:用户模式(user-mode)和内核模式(kernel-mode)。1,用户模式。它是用CPU指令来协调线程,这种协调是在硬件中发生的,所以速度会快于内核模式。但是也意味着,Windows操作系统永远也检测不到一个线程在一个基元用户模式构造上阻塞了。由于在一个基元用户模式构造上阻塞的线程永远不认为已经阻塞,所以线程池不会创建新的线程来替换这种阻塞的线程。另外,这些CPU指令只是阻塞线程极短的时间。缺点:只有Windows系统的内核才能停止一个线程的执行。用户模式中的线程可能会被系统抢占,但很 阅读全文

线程同步——优势、劣势

2012-08-25 10:16 by xiashengwang, 404 阅读, 收藏, 编辑
摘要:一、线程同步好处:多个线程同时访问共享数据时,防止数据被损坏。二、线程同步带来的问题:1,实现比较繁琐,而且容易出错。必须对多个线程可能同时访问的所有数据,用额外的代码包围起来,以获得和释放一个同步锁。这需要由程序员来保证没有遗漏,对多线程共享的数据的加锁工作。并且,在程序完成时,需要进行压力测试以保证多个线程并发时,结果如预期。2,它会损害性能。获取和释放一个锁是需要时间的。因为需要额外的调用一些方法,并且需要协调调度下一个获得锁的线程。3,每次只能允许一个线程访问资源。这是锁的全部意义所在,但也是问题所在,因为阻塞一个线程可能会造成更多的线程被创建。三、线程同步建议:1,线程同步并不是一件 阅读全文

研究BackgroundWorker后发现:AsyncOperation和SynchronizationContext的差异真的很大!

2012-08-22 15:58 by xiashengwang, 1227 阅读, 收藏, 编辑
摘要:今天研究BackgroundWorker代码时发现,两处代码的写法有些不一致,于是好奇的测试了一番,以为能测出BackgroundWorker的一个bug。结果大家都知道microsoft胜了。下面来看看过程,BackgroundWorker类里的ReportProgress方法public void ReportProgress(int percentProgress, object userState){if (!this.WorkerReportsProgress) throw new InvalidOperationException("BackgroundWorker_Wo 阅读全文

APM异步编程模型的优势

2012-08-21 14:11 by xiashengwang, 1059 阅读, 收藏, 编辑
摘要:我们之所以要花大力气学习APM,就必须要清楚它能解决实际编程中的那些难题。以及现有的技术为什么不行。简单点说:APM是基于IAsyncResult接口的,采用的BeginXXX和EndXXX的形式来实现异步。下面这几点就是APM的优势:1,线程执行是异步的,不会阻塞调用线程。这一点也是我们使用异步的主要目的,我们不就是希望后台处理一些耗时操作吗?2,任务完成可以得到通知。(非阻塞)3,任务可以实现进度报告。(需要额外的辅助代码支持)4,可以有返回值。5,参数可以是多个。再看看Thread,ThreadPool,Task能实现上面的几点?这三个中,Task是相对完善的一个,对于第2点它可以通过C 阅读全文

线程阶段性总结——APM,ThreadPool,Task,TaskScheduler ,CancellationTokenSource

2012-08-18 16:39 by xiashengwang, 2074 阅读, 收藏, 编辑
摘要:不管我们使用thread,threadPool,task,还是APM异步,本质都是在使用多线程。对于新手来说,不太敢用多线程的原因,就我个人的体验来说,就是对多线程的异常捕获方式或时机缺乏了解,而一旦出现异常没有捕获,将会带来难以发现的bug,进而造成系统崩溃。而多线程本身也不是一朝一夕就能学好的,必须不断的去学习总结,所以我个人认为你要用一种线程模型,首先要对它有足够的了解,特别是对异常的捕获。如果你没有完全的把握,最好在实际开发中谨慎的用多线程。1,APM异步编程模型。采用BeginXXX和EndXXX方法。关于异常的捕捉,对于刚调用BeginXXX抛出的异常,异步操作可能还没有进入队列。 阅读全文

非UI线程更新UI界面的各种方法小结

2012-08-18 15:58 by xiashengwang, 4650 阅读, 收藏, 编辑
摘要:我们知道只有UI线程才能更新UI界面,其他线程访问UI控件被认为是非法的。但是我们在进行异步操作时,经常需要将异步执行的进度报告给用户,让用户知道任务的进度,不至于让用户误认为程序“死掉了”,特别是对于Winform,WPF等客户端程序尤为重要。 那么我们要探讨的就是如何让非UI的任务线程更新UI界 阅读全文

一个关于字典查找引发的思考——BinarySearch

2012-08-02 12:20 by xiashengwang, 1633 阅读, 收藏, 编辑
摘要:最近在一个e文网站的提问区看到一个非常有意思的问题,内容如下:有几组信号范围(range),每个范围对应一个位置(Position):Signal Strenth Position0-9 110-19 220-29 3要求很简单,就是比如输入一个15,找到它的Position为2。但要求不能用IF语句进行简单的判定,最好用类似于字典的查找。看见这个问题,你脑海中有什么样的方案?Dictionary?在实际工作中还是经... 阅读全文

C# 3.0 新特性概览

2012-07-23 22:33 by xiashengwang, 348 阅读, 收藏, 编辑
摘要:1. 隐式类型局部变量(Implicitly Typed Local Variables)隐式类型局部变量的具体类型取决于初始化它的表达式。在一个局部变量声明时,前面加一个var关键字,这个局部变量就被叫做隐式类型局部变量。例如: var i = 0; var s = "Hello"; var d = 1.0; var numbers = new int[] { 2, 4, 7, 8 }; var order = new Dictionary<string, string>();上... 阅读全文

log4net使用总结

2012-06-20 17:08 by xiashengwang, 640 阅读, 收藏, 编辑
摘要:一,log4net是什么 log4net架构下用于记录日志的开源组件,功能相当完善,免去了我们重复造轮子。我想不管是winform还是web都需要记录日志。 官网下载地址:http://logging.apache.org/log4net/ SDK地址:http://logging.apache.o 阅读全文

通用的泛型Icomparer生成类,对类进行排序,最大支持4个字段同时比较

2012-06-07 15:18 by xiashengwang, 174 阅读, 收藏, 编辑
摘要:一,通常我们自己定义一个类,然后对类的集合进行排序,是下面这样的做法 class People { public int ID { get; set; } public string Name { get; set; } public DateTime Birthday { get; set; } public override string ToString() { return string.Format("{0},{1},... 阅读全文

扩展方法及几种常见的代理(delegate)语法

2012-06-05 11:27 by xiashengwang, 98 阅读, 收藏, 编辑
摘要:1,扩展方法必须写在非泛型的静态类中using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms;namespace Cshapr3._0NewFeature{ public static class ExtendMethod { //Search Control's Child public static IEnumerable<T> SearchControls<T>(this Control c... 阅读全文

Excel单元格列名转化成函数

2012-03-20 21:17 by xiashengwang, 164 阅读, 收藏, 编辑
摘要:/// <summary> /// Excel形式的列变换 /// </summary> public class ExcelCRHelper { private const string ALPHABET_UPPER = "ABCDEFGHIGKLMNOPQRSTUVWXYZ"; /// <summary> /// 形如(B4)的单元格的列号提取 /// </summary> /// <returns></returns> public static int ExtractCol... 阅读全文

c#实现的破解程序--针对软件使用时间限制

2011-12-22 22:09 by xiashengwang, 1887 阅读, 收藏, 编辑
摘要:自己捣腾了一天,弄了一个修改软件过期的小程序,主要是自己有几款有时间限制的软件,每次改时间很麻烦。有了这个程序就可以一劳永逸了。前提:只适用于修改操作系统时间后,程序就能够正常使用的那种软件。如Lingoes,reflector,这两款我测试是可以的。在Win7下必需用管理员的方式启动。思路很简单:1,修改操作系统时间到软件过期前。2,启动软件。3,改回操作系统时间。程序类似于网上的一款好像叫RunAsDate的软件,没用过,只大概记得它的界面,决定自己实现类似的功能。该程序的亮点是1,可以生成破解程序的快捷方式到桌面上,生成的快捷方式图标和原来的程序一样(有轻度的失真),生成这个快捷方式后, 阅读全文

c#修改系统时间的方法

2011-12-21 17:06 by xiashengwang, 3374 阅读, 收藏, 编辑
摘要:C#没有提供直接的方法对系统时间进行设定,一般我们只能通过DateTime.Now获取系统时间,但是并不能对这个时间进行修改。这里对了解的主要的两种方式做了个整理,希望对大家有帮助。方法一,用API函数的方式来修改时间。首先定义API函数 [StructLayout( LayoutKind.Sequential)] public struct SYSTEMTIME { public ushort wYear; public ushort wMonth; public ushort wDayOfWeek; public u... 阅读全文

浅拷贝和深拷贝

2011-12-21 15:48 by xiashengwang, 129 阅读, 收藏, 编辑
摘要:关于深拷贝和浅拷贝的区别,主要在对于引用类型的成员的拷贝上,浅拷贝只是简单的复制引用的地址,深拷贝会生成一个完全独立的对象,包括对象内的引用成员。浅拷贝:Object类提供了一个MemberwiseClone方法,一般是基于它来实现。深拷贝:要求对象要实现Serializable特性,表明它是可以被序列化的。利用对象的序列化和反序列化来实现深度拷贝。完整的例子如下:using System;using System.Collections.Generic;using System.Text;namespace CsharpBase{ class CloneDemo { ... 阅读全文

IEnumerable接口使用

2011-12-21 15:04 by xiashengwang, 82 阅读, 收藏, 编辑
摘要:要使用foreach语句对对象遍历,对象必须实现IEnumerable接口,下面是一个Demo。using System;using System.Collections.Generic;using System.Collections;using System.Text;namespace CsharpBase{ class EnumerableDemo { public static void Run() { Child[] childs = new Child[3] { new ... 阅读全文

Winform下KeyDown,KeyPress,KeyUp事件的总结

2011-09-15 13:26 by xiashengwang, 2246 阅读, 收藏, 编辑
摘要:在winform程序中,经常会用到这几个事件用于控制数字输入,按键动作等操作,但一直没有完全弄清楚他们之间的区别和联系,到底什么时候用哪一个事件合适,闲暇无事,做了一个小小的总结,以免以后犯糊涂。1) 这三个事件调用的先后顺序(MSDN) 1.KeyDown :在控件有焦点的情况下按下键时发生 2. KeyPress :在控件有焦点的情况下按下键时发生。 3. KeyUp :在控件有焦点的情况下释放键时发生。2) KeyDown和KeyPress在MSDN上的解释完全一样,都是在按下键的时候发生,那区别是什么呢?textBox1_KeyDown(object sender, KeyEventA 阅读全文

C#前期绑定和后期绑定操作Excel-------实现简单打印功能

2011-09-06 14:00 by xiashengwang, 258 阅读, 收藏, 编辑
摘要:1,前期绑定前期绑定需要引用Microsoft.Office.Interop.Excel.dll,代码有提示功能,编写方便,且代码量小。但是和具体的office版本密切相关,不同版本的Excel可能会出现不兼容。using System;using System.Collections.Generic;using System.Text;using Excel = Microsoft.Office.Interop.Excel;namespace ExcelCsharpTest{ class ExcelPrintNomal { public void PrintOut(... 阅读全文

实现List的多列排序

2011-05-20 12:15 by xiashengwang, 213 阅读, 收藏, 编辑
摘要:List的sort()方法,只能实现简单数据的排序,如过List里面装的是对象,就必须要显示实现IComparer接口,才能排序,并且有时我们需要对一个对象进行多列排序,如学生按学号,成绩升序排列。在实现这个接口的时候,我们可以对多个字段排序,代码如下: public class People { public string Sex { get; set; } public int Age { get; set; } public string Name { get; set; } }... 阅读全文