.net
lanruoshui
这个作者很懒,什么都没留下…
展开
-
System.String和System.Text.StringBuilder
在简单的字符串操作中使用String,在复杂的字符串操作中使用StringBuilder。StringBuilder对象的创建代价较大,在字符串连接目标较少的情况下,应优先使用String类型,而在有大量字符串连接操作的情况下,应优先考虑StringBuilder。同时,StringBuilder在使用上,最好指定合适的容量值,否则由于默认容易的不足而频繁进行内存分配的操作会影响性能。原创 2013-05-22 17:26:00 · 1664 阅读 · 0 评论 -
.Net线程足迹(四)——互斥量(Mutex)
只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。 可以使用 WaitHandle.WaitOne 方法请求互斥体的所属权。拥有互斥体的线程可以在对 WaitOne 的重复调用中请求相同的互斥体而不会阻止其执行。但线程必须调原创 2010-05-11 13:22:00 · 1333 阅读 · 0 评论 -
ADO.NET与ORM的比较(4):EntityFramework实现CRUD
说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是Spring+Struts+Hibernate,除了在学习基础知识的时候被告知可以使用JDBC操作数据库之外,大量的书籍中都是讲述使用Hibernate这个ORM工具来操作数据。在.NET中操作数据库的方式有多种,除了最直接的方式就是使用ADO.NET之外,还可以使用NHibernate这个Hibernate在.NET中的实转载 2010-05-10 16:37:00 · 677 阅读 · 0 评论 -
.Net线程足迹(三)——IsAlive属性
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace ThreadDemo{ class Program { static void Main(string[原创 2010-04-29 16:25:00 · 2222 阅读 · 0 评论 -
.Net线程足迹(二) ——传递参数至线程
方法一:应用ParameterizedThreadStart这个委托来传递输入参数,这种方法适用于传递单个参数的情况。using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Lin原创 2010-04-26 15:19:00 · 3412 阅读 · 0 评论 -
Control.Invoke&Control.BeginInvoke
只在创建控件的线程里设置控件的属性当然是可以的,但是两个线程都在自顾自的运行,我有什么办法让别的线程停下手头的工作,来执行我分派的任务,这又不是两个人,我可以跟他说下。嘿,您还别说,这里的机制还真像两个人,甲线程发个短信给乙线程说,哥们,我有个事儿自己不好处理,怕出问题,你抽空儿给我处理下。根据甲线程发短信的方式,甲线程要么发了短信后就忙自己的事儿然后等乙线程处理完后的消息,要么一直在那里傻傻的等转载 2010-04-09 15:34:00 · 1767 阅读 · 0 评论 -
Windows窗口和消息
进行Windows程序设计,实际上是在进行一种对象导向的程序设计(OOP)。这种对象正是Windows之所以命名为「Windows」的原因。作为对象,使用者会在屏幕上看到这些窗口,并通过键盘和鼠标直接与它们进行交互操作。窗口以「消息」的形式接收窗口的输入,窗口也用消息与其它窗口通讯。 这有一个Windows的消息范例:我们知道,大多数的Windows程序都有大小合适的应用程原创 2010-04-09 13:45:00 · 1037 阅读 · 0 评论 -
Delegate.BeginInvoke例子
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namesp原创 2010-04-09 13:19:00 · 8482 阅读 · 0 评论 -
Invoke and BeginInvoke
在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate。 一、为什么Control类提供了Invoke和BeginInvoke机制?关于这个问题的最主要的原因已经是dotnet程序员众所周知的,我在此费点笔墨再次记录到自己的日志,以便日后提醒一下自己。1、windows程序消息机制Windows GUI程序是基于消息机制的,有个主线程维护着一个消息泵转载 2010-04-09 13:52:00 · 604 阅读 · 0 评论 -
.Net线程足迹(一)
开始学习线程了,做个记录:) 1、在这个小例子里,将创建一个新线程,我们将用两个线程演示多线程的工作方式。 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace ManualResetEv原创 2010-04-14 14:25:00 · 1529 阅读 · 0 评论 -
C#中使用SendMessage
在C#中,程序采用了的驱动采用了事件驱动而不是原来的消息驱动,虽然.net框架提供的事件已经十分丰富,但是在以前的系统中定义了丰富的消息对系统的编程提供了方便的实现方法,因此在C#中使用消息有时候还是大大提高编程的效率的。 1 定义消息 在c#中消息需要定义成windows系统中的原始的16进制数字,比如 const int WM_Lbutton = 0x201; //定义了鼠标的左键点击消息转载 2010-03-30 15:58:00 · 2037 阅读 · 0 评论 -
C#使用SendMessage传递字符串
在C#中使用SendMessage,原本以为很简单的事,却处处碰壁。在定义消息时忘记了用户可定义消息的边界值,在网上一阵疯找后来发现是const int WM_USER = 0x400。接着是SendMessage的lParam类型不能决定(默认是IntPtr),我想发送字符串信息,就将它定为了string型,然后通过重写DefWndProc接收自定义消息。问题出现:(string) mess转载 2010-03-30 16:10:00 · 5469 阅读 · 0 评论 -
C# SendMessage
public sealed class API { //wMsg参数常量值: //WM_KEYDOWN 按下一个键 public static int WM_KEYDOWN = 0x0100; //释放一个键 public static int WM_KEYUP = 0x0101; //按下某键,并已发出W转载 2010-03-30 15:36:00 · 911 阅读 · 0 评论 -
进程的互斥运行
正常情况下,一个进程的运行一般是不会影响到其他正在运行的进程的。但是对于某些有特殊要求的如以独占方式使用串行口等硬件设备的程序就要求在其进程运行期间不允许其他试图使用此端口设备的程序运行的,而且此类程序通常也不允许运行同一个程序的多个实例。这就引出了进程互斥的问题。 实现进程互斥的核心思想比较简单:进程在启动时首先检查当前系统是否已经存在有此进程的实例,如果没有,进程将成功创建并原创 2010-03-25 15:06:00 · 811 阅读 · 0 评论 -
C#读写者线程(用AutoResetEvent实现同步)
1. AutoResetEvent简介 通知正在等待的线程已发生事件。无法继承此类。 常用方法简介:AutoResetEvent(bool initialState):构造函数,用一个指示是否将初始状态设置为终止的布尔值初始化该类的新实例。 false:无信号,子线程的WaitOne方法不会被自动调用 true:有信号,子线程的WaitOne方法会被自动调用pu转载 2010-03-24 16:22:00 · 1744 阅读 · 1 评论 -
WaitHandle.WaitOne 方法
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace ConsoleTest{ //下面代码说明在进程等待后台线程执行完时,如何使用等待句柄阻止进程终止。 class Prog原创 2010-03-24 11:53:00 · 21024 阅读 · 5 评论 -
Observer设计模式——委托事件
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DelegateObserver{ /// /// 热水器(监视对象) /// public class Heater {原创 2010-03-19 16:55:00 · 858 阅读 · 0 评论 -
修改注册表实现禁用/启用USB
private void button2_Click(object sender, EventArgs e) { //禁用usb RegistryKey keyLocalMachine = Registry.LocalMachine; RegistryKey key = keyLocal原创 2009-12-31 14:12:00 · 4009 阅读 · 0 评论 -
关于若干Win32多线程函数API详解
CreateThread函数功能:该函数创建一个在调用进程的地址空间中执行的线程。函数原型: HANDLE CreateThread ( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParame转载 2010-05-11 13:33:00 · 1341 阅读 · 0 评论 -
MissingMethodException
<br /> 在WinCE5.0上直接调试客户端程序时,程序运行正常。将程序部署到设备上再启动后,程序报异常“MissingMethodException此应用程序需要比安装在此设备上的Microsoft(R).NET Compact Framework 更高的版本”。如下图所示:<br /><br /><br /><br />上网查了一下,原来是代码使用了更高版本的.net compact framework,解决方法是将CE系统升级。<br />我的程序中使用了.net compact framewor原创 2010-07-16 09:34:00 · 4493 阅读 · 0 评论 -
简单工厂,工厂方法和抽象工厂的区别
<br />看了网络上很多关于设计模式的方法,有的模式看起来相似,但本质还是区别很大的.像简单工厂,工厂方法和抽象工厂就有很明显的区别. <br /> 有一个比较好理解的例子,在这跟大家介绍下: <br /> 1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了. <br /> 2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来. <br /> 3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园.转载 2010-07-14 15:39:00 · 624 阅读 · 0 评论 -
接口本质
接口本质上仍然是类,可以看作是一个定义了抽象方法的类,该类仅提供了方法的定义,而没有方法的实现,其功能由接口的实现类来完成。也就是说,接口的抽象机制仍然是由多态来完成的。接口在本质上是一个不能实例化的类,但是又区别于一般意义上的类,例如不能实例化,允许多继承,还可以作用于值类型等。如:public struct DateTime:IComparable,IFormattable,IConv原创 2013-04-20 16:30:06 · 2107 阅读 · 0 评论 -
C#调用C++编写的COM DLL
在C#调用C++编写的COM DLL封装库时会出现两个问题:1. 数据类型转换问题2. 指针或地址参数传送问题 首先是数据类型转换问题。因为C#是.NET语言,利用的是.NET的基本数据类型,所以实际上是将C++的数据类型与.NET的基本数据类型进行对应。 例如C++的原有函数是: int __stdcall FunctionName(unsig转载 2012-12-14 14:58:57 · 836 阅读 · 0 评论 -
VS2010中的调试技巧
这是我的博客中关于VS 2010和.NET 4发布系列的第二十六篇文章。 今天的博文将介绍Visual Studio中的一些实用调试技巧。这是受我朋友Scott Cate (他发表过几十篇很棒的VS技术文章) 启发。他最近告诉我,许多Visual Studio下的程序员,甚至一些很有经验的开发人员,都不知道这些技巧。希望这篇文章能帮你掌握这些技巧。它们都很简单,却能帮你节约大量的时间。转载 2012-12-10 10:55:54 · 822 阅读 · 0 评论 -
c# 中string与StringBuilder区别
string是固定不变的,在进行字符串连接的时候实际上是新建一个字符串,返回一个新的字符串对象。连接赋值后, 如果对string赋值多次,就会在内存中保存多个这个对象的副本,这些对象不再被引用,极大地浪费了系统资源 。而StringBuilder是可变的,不用生成中间对象,拼接字符串比较多,或字符串的长度比较长时有较高的效率。 StringBuilder的内存空间不够也要扩容,如果分配的原创 2012-06-14 17:00:33 · 673 阅读 · 0 评论 -
前台验证(利用验证控件和正则表达式)
正则表达示收藏整数或者小数:^[0-9]+/.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$"。只能输入n位的数字:"^/d{n}$"。只能输入至少n位的数字:"^/d{n,}$"。只能输入m~n位的数字:。"^/d{m,n}$"只能转载 2011-08-03 14:00:40 · 764 阅读 · 0 评论 -
Grove——.NET中的ORM实现
<br />ORM的全称是Object Relational Mapping,即对象关系映射。它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将这些对象组织起来,实现系统业务逻辑的过程。在ORM过程中最重要的概念是映射(Mapping),通过这种映射可以使业务对象与数据库分离。从面向对象来说,数据库不应该和业务逻辑绑定到一起,ORM则起到这样的分离作用,使数据库层透明,开发人员真正的面向对象。图 1简单说明了ORM在多层系统架构中的这个作用转载 2011-04-29 10:39:00 · 896 阅读 · 0 评论 -
对比.NET PetShop和Duwamish来探讨Ado.NET的数据库编程模式
概述Ado.NET为我们提供了强大的数据库开发能力,它内置的多个对象为我们的数据库编程提供了不同的选择。但是在允许我们灵活选用的同时,许多初学者也很迷惑,我到底是应该使用DataReader还是应该使用DataAdapter?我只想读取一小部分数据,难道我一定要Fill满整个DataSet吗?为什么DataReader不能和RecordSet一样提供一个数据更新的方法?DataSet到底有什么好处?在本文中,我将对.NET PetShop的数据库编程模式和Duwamish的数据库编程模式进行一些简单的分析和转载 2011-04-29 10:20:00 · 705 阅读 · 0 评论 -
C# observer模式
今天复习了一下c sharp中的observer模式,记录一下。定义委托HotDelegateEventHandlerusing System;using System.Collections.Generic;using System.Text;namespace ObserverTest{ public delegate void HotDelegateEv原创 2011-06-22 17:12:00 · 827 阅读 · 0 评论 -
AutoResetEvent 与 ManualResetEvent区别
在C#多线程编程中,这两个类几乎是不可或缺的,他们的用法/声明都很类似,那么区别在哪里了?Set方法将信号置为发送状态 Reset方法将信号置为不发送状态 WaitOne等待信号的发送其实,从名字就可以看出一点端倪 ,一个手动,一个自动,这个手动和自动实际指的是在Reset方法的处理上,如下面例子public AutoResetEvent autoevent=new AutoRese转载 2011-06-10 11:14:00 · 613 阅读 · 0 评论 -
关于File.Move方法
如果操作的源和目标处于相同的根目录下,如源处于/C:/,目标处于/C:/test/,Move操作就不会引发异常。如果操作的源与目标处于同一目录下,即全位于C盘下,则进行的是重命名操作,与文件正在是否使用无关。如果操作的源与目标处于相同的根目录下,如源处于/C:/,目标处于/C:/test/,Move操作进行的是移动操作。与文件是否正在使用无关。原创 2011-06-10 11:30:00 · 2961 阅读 · 0 评论 -
MessageWindow类
<br />using System;using System.Collections.Generic;using System.Text;using Microsoft.WindowsCE.Forms;namespace SmartDeviceProject1{ //MessageWindow 类提供发送和接收基于 Windows 的消息的能力。 public class MsgWindow : MessageWindow { p原创 2011-06-01 15:49:00 · 2274 阅读 · 0 评论 -
两个数相除计算百分比
<br /> string signal = "5"; decimal value = Convert.ToDecimal(signal) / 31; //小数据取两位 int result = (int)(Math.Round(value, 2) * 100); this.lbSingle.Text = result + "%";原创 2011-05-19 10:52:00 · 8042 阅读 · 0 评论 -
C#或者.NET下的强制垃圾回收办法
<br />今天来谈谈C#的GC,也就是垃圾回收机制,非常的受教,总结如下<br />首先:谈谈托管,什么叫托管,我的理解就是托付C#运行环境帮我们去管理,在这个运行环境中可以帮助我们开辟内存和释放内存,开辟内存一般用new,内存是随机分配的,释放主要靠的是GC也就是垃圾回收机制。哪么有两个大问题 1.GC可以回收任何对象吗?2.GC什么时候来回收对象?回收那些对象?<br />对于第一个问题,GC可以回收任何对象吗?我是这样理解的,首先要明白一点,C#在强大也管不到非托管代码?哪么什么是非托管代码呢?比如转载 2011-03-16 17:21:00 · 13435 阅读 · 1 评论 -
.Net中引用型对象作为参数进行传递
今天在调试程序的时候,C类中调用了操作数据库的方法A,方法A传递了数据库连接对象B。在方法中将数据库连接对象Dispose并置null,方法A执行完毕后,在C中B的值并不是空。同事说B应该就是空,理由是B是引用类型,我觉得B不应该是空,只有调用B时添加ref关键字才能将B对象置为null。我又说不出原因,只好写个小测试程序验证一下。原创 2011-03-16 17:29:00 · 1451 阅读 · 0 评论 -
C# 字节数组和字符串的相互转换
<br />c#中提供字节数组和字符串的相互转换的类:System.Text.Encoding<br />一:字符串-->字节数组,需要调用System.Text.Encoding中各种编码类的GetBytes方法。<br />二:字节数组-->字符串,需要调用System.Text.Encoding中各种编码类的GetString方法。<br /> <br /><br />System.Text.Encoding<br /> Encoding类负责字符的编码和字节序列的解码。编码是一个将一组 Uni转载 2010-11-23 13:48:00 · 3434 阅读 · 1 评论 -
如何:创建和终止线程
<br />摘自MSDN.<br />此示例演示如何创建辅助线程,并用它与主线程并行执行处理。还将演示如何使一个线程等待另一个线程,并正确地终止线程。<br />using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace MainThreadDemo{ //由于此数据成员由 DoWork 方法来检查,因原创 2010-07-21 11:18:00 · 850 阅读 · 0 评论 -
设计模式之工厂模式Factory
<br />今天来转载一篇关于设计模式的文章!<br />工厂模式定义:提供创建对象的接口.<br />为何使用?<br />工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。<br />为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑实用工厂模式,虽然这样做,可能多做一些工作,但会转载 2010-07-14 13:06:00 · 646 阅读 · 0 评论 -
打包时设置安装路径
方法如下: 安装程序工程——视图——应用程序文件夹——属性—DefaultLocation:d:/[ProductName]原创 2009-12-29 14:23:00 · 1118 阅读 · 0 评论 -
c#实现动态加载Dll
原理如下:1、利用反射进行动态加载和调用. Assembly assembly=Assembly.LoadFrom(DllPath); //利用dll的路径加载,同时将此程序集所依赖的程序集加载进来,需后辍名.dllAssembly.LoadFile 只加载指定文件,并不会自动加载依赖程序集.Assmbly.Load无需后辍名 2、加载dll后,需要使用dll中某类.Type type=ass原创 2009-12-28 13:54:00 · 42088 阅读 · 2 评论