随笔分类 -  C#

摘要:所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定。C#中对象的类型分为引用类型和值类型。CLR在这两种类型上的等待是不一样的。我们可以简单的理解为在CLR中,值类型是不能被锁定的,也即:不能在一个值类型对象上执行等待。而在引用类型上的等待机制,则分为两类:锁定和信号同步。锁定,使用关键字lock和类型Monitor。两者没有实质区别,前者其实是后者的语法糖。这是最常用的同步技术;本建议我们讨论的是信号同步。信号同步机制中涉及的类型都继承自抽象类WaitHandle,这些类型有EventWaitHandle(类型化为AutoResetEvent、M 阅读全文
posted @ 2012-08-07 11:40 怡馨 阅读(212) 评论(0) 推荐(0)
摘要:在标准的Dispose模式中(见前一篇博客“C#中标准Dispose模式的实现”),提到了需要及时释放资源,却并没有进一步细说让引用等于null是否有必要。有一些人认为等于null可以帮助垃圾回收机制早点发现并标识对象是垃圾。其他人则认为这没有任何帮助。是否赋值为null的问题首先在方法的内部被人提起。现在,为了更好的阐述提出的问题,我们来撰写一个Winform窗体应用程序。如下:privatevoid button1_Click(object sender, EventArgs e){Method1();Method2();}privatevoid button2_Click(object 阅读全文
posted @ 2012-08-07 11:39 怡馨 阅读(308) 评论(0) 推荐(0)
摘要:要选择正确的集合,我们首先要了解一些数据结构的知识。所谓数据结构,就是相互之间存在一种或多种特定关系的数据元素的集合。结合下图,我们看一下对集合的分类。集合分类在上图中,可以看到,集合总体上分为线性集合和非线性集合。线性集合指元素具有唯一的前驱和后驱的数据结构类型。非线性集合是指具有多个前驱或后驱的数据结构类型,如:树、图。在FCL中,非线性集合实现的比较少,所以我们将会更多的讨论线性集合。注意:由于类型安全、转型效率等方面的原因,本建议将只讨论泛型集合。线性集合按存储方式,又分为直接存储和顺序存储。所谓直接存储是指:该类型的集合数据元素可以直接通过下标(也即index)来访问,在C#中有三种 阅读全文
posted @ 2012-08-07 11:38 怡馨 阅读(182) 评论(0) 推荐(0)
摘要:需要明确一下C#程序(或者说.NET)中的资源。简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类:托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象;非托管资源:不受CLR管理的对象,windows内核对象,如文件、数据库连接、套接字、COM对象等;毫无例外地,如果我们的类型使用到了非托管资源,或者需要显式释放的托管资源,那么,就需要让类型继承接口IDisposable。这相当于是告诉调用者,该类型是需要显式释放资源的,你需要调用我的Dispose方法。不过,这一切并不这么简单,一个标准的继承了IDisposable接口的类型应该像下面这样去实现。这种实现我们称 阅读全文
posted @ 2012-08-07 11:38 怡馨 阅读(171) 评论(0) 推荐(0)
摘要:dynamic是FrameWork4.0的新特性。dynamic的出现让C#具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性。比如,即使你对GetDynamicObject方法返回的对象一无所知,你也可以像如下那样进行代码的调用,编译器不会报错:dynamic dynamicObject = GetDynamicObject(); Console.WriteLine(dynamicObject.Name); Console.WriteLine(dynamicObject.SampleMethod());说到正确用法,那么首先应该指出 阅读全文
posted @ 2012-08-07 11:37 怡馨 阅读(234) 评论(0) 推荐(0)
摘要:好吧,我承认,这是一个反标题,实际的情况是:我找不到一个非用ICloneable不可的理由。事实上,接口ICloneable还会带来误解,因为它只有一个Clone方法。我们都知道,对象的拷贝分为:浅拷贝和深拷贝。ICloneable仅有一个Clone方法使我们无法从命名的角度去区分到底是哪个拷贝。浅拷贝:将对象的字段复制到副本(新的对象)中,同时将字段的值也赋值过去,但是引用类型字段只复制引用,而不是引用类型本身。这意味着,源对象引用类型字段的值改变了,会影响到副本中对应的值也改变;深拷贝:将对象的字段复制到副本(新的对象)中,无论是值类型还是引用类型字段,都会复制类型本身及类型的值。这意味着 阅读全文
posted @ 2012-08-07 11:36 怡馨 阅读(223) 评论(0) 推荐(0)
摘要:很多时候,在winform的设计下,会遇到新建窗体时不需要用到默认的关闭按钮的情况,而是用另外设置关闭 button或其他控件来控制窗体的关闭。 之前我遇到这个问题时,问了很多朋友,都没找到方法,VS的窗体属性里也没那一项,在MSDN里也没有相关的资料。 但后来偶然发现,原来办法是很简单的,只需要在初始化窗体的时候不显示那关闭按钮就可以了。 具体方法是,加上一句“ this.ControlBox = false;”。 如下: public Form1() { InitializeComponent(); this.ControlBox = false; // 设置不出现关闭按钮 } 而对最大最 阅读全文
posted @ 2012-08-06 08:51 怡馨 阅读(925) 评论(1) 推荐(0)
摘要:很多时候自定义或者引用控件都需要注册才能使用,但是如何使要注册的dll或ocx打包到exe中,使用户下载以后看到的只是一个exe,点击直接运行呢?就像很多安全控件,如支付宝的aliedit.exe那样。 现在介绍一种使用资源文件,将dll、ocx打包进exe,点击直接注册的例子: 首先,新建一个工程RegisterFile。 新建文件夹Resource,里面添加需要注册的ocx或dll。这里我添加的是dsoframer.ocx,并将其文件“属性”中“生成操作”项的值改为“嵌入的资源”。 接下来,创建类Register.cs 里面只有一个函数RegisterDll()。这里为省事,我把它放到了P 阅读全文
posted @ 2012-07-17 09:36 怡馨 阅读(1277) 评论(0) 推荐(0)
摘要:C#工程经常会引用多个DLL文件,形成一个完整的工程项目的目的。这样的工程在发布时,需要将编译形成的EXE文件与DLL文件共同发布。如果感觉麻烦,可以将这些DLL文件与EXE文件合并,最终形成一个更大的EXE文件,然后只发布这个EXE文件就可以。这个工具就是ilMerge,可以到http://research.microsoft.com/~mbarnett/ILMerge.aspx下载。 下载安装完毕后,设安装在c:\ilMerge目录下,只有一个有用的文件,ilMerger.exe,对于需要装配到一起的文件,我的意见是将当时工程中形成的EXE文件和引用的DLL文件都拷贝到ilMerger目录 阅读全文
posted @ 2012-07-17 09:31 怡馨 阅读(536) 评论(0) 推荐(0)
摘要:这篇文章可以帮助你熟悉于用C#开发与RS232的通讯。难易程度 1、2、3本文相关代码下载:NetSerialComm.exe (89KB)http://download.microsoft.com/download/8/3/f/83f69587-47f1-48e2-86a6-aab14f01f1fe/NetSerialComm.exe导引:在.NET环境下编写与RS252串口通信的应用程序的唯一方法,就是引用过时了的并且有点限制的MSComm ActiveX控件。这篇文章介绍了用C#安全代码编写一个多线程的,且时尚的与RS232通讯的基础类库。这个类库使用平台调用服务(即Platform I 阅读全文
posted @ 2012-07-14 09:51 怡馨 阅读(458) 评论(0) 推荐(0)
摘要:摘要:本文详细介绍了MSComm控件在串口编程中使用。 目 次MSComm控件两种处理通讯的方式CommPort属性RThreshold 属性CTSHolding 属性SThreshold 属性CDHolding 属性DSRHolding 属性Settings 属性InputLen 属性EOFEnable 属性Handshake 常数OnComm 常数InputMode 常数错误消息 MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。Mic 阅读全文
posted @ 2012-07-14 09:37 怡馨 阅读(773) 评论(0) 推荐(0)
摘要:下面是一些常见的问题及其解决方案:问题1:如何读写文本文件(并考虑不同的编码类型);解决方案:创建一个FileStream对象用以引用该文件。要写入文件,将FileStream对象封装在StreamWriter对象中,使用其重载了的Write方法;要读取文件,将FileStream对象封装在StreamReader对象中,使用其Read或ReadLine方法;.NET Framework允许通过StreamWriter和StreamReader类操作任何流来读写文本文件。当使用StreamWriter类写入数据时,调用它的Write方法,该方法在重载后可以支持所有常见的C#数据类型,包括字符串 阅读全文
posted @ 2012-06-15 11:32 怡馨 阅读(368) 评论(0) 推荐(0)
摘要:文件操作是程序中非常基础和重要的内容,而路径、文件、目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题, 尽量提供一些解决方案,即使没有你想要的答案,也希望能提供给你一点有益的思路,如果你有好的建议,恳请能够留言,使这些内容更加完善。 主要内容:一、路径的相关操作, 如判断路径是否合法,路径类型,路径的特定部分,合并路径,系统文件夹路径等内容;二、相关通用文件对话框,这些对话框可以帮助我们操作文件系统中的文件和目录;三、文件、目录、驱动器的操作,如获取它们的基本信息,获取和设置文件和目录的属性,文件的版本信息,搜索文件和目录,文件判等,复制、移动、删除、 阅读全文
posted @ 2012-06-15 11:31 怡馨 阅读(4519) 评论(0) 推荐(0)
摘要:TF31003:您的用户帐户没有连接到 Team Foundation Server {0} 的权限。请与 Team Foundation Server 管理员联系,请求其向您的帐户添加适当的权限。一、首先确认一下控制面板-系统和安全-windows防火墙-允许的程序里打开了“文件和打印机共享”(也可以关闭防火墙)二、开始=>运行... =>gpedit.msc=>本地计算机策略=>计算机配置=>Windows设置=>安全设置=>本地策略=>安全选项。找到:“网络安全:LAN管理器身份验证级别”项,默认值“没有定义”改为“发送LM & N 阅读全文
posted @ 2012-06-14 11:42 怡馨 阅读(2196) 评论(0) 推荐(0)
摘要:public byte[] intToByte(int i) { byte[] abyte0 = new byte[4]; abyte0[0] = (byte) (0xff & i); abyte0[1] = (byte) ((0xff00 & i) >> 8); abyte0[2] = (byte) ((0xff0000 & i) >> 16); abyte0[3] = (byte) ((0xff000000 & i) >> 24); return abyte0; } public static int bytesToInt 阅读全文
posted @ 2012-06-13 13:02 怡馨 阅读(552) 评论(0) 推荐(0)
摘要:1.深拷贝与浅拷贝 拷贝即是通常所说的复制(Copy)或克隆(Clone),对象的拷贝也就是从现有对象复制一个“一模一样”的新对象出来。虽然都是复制对象,但是不同的复制方法,复制出来的新对象却并非完全一模一样,对象内部存在着一些差异。通常的拷贝方法有两种,即深拷贝和浅拷贝,那二者之间有何区别呢?MSDN里对IClone接口的Clone方法有这样的说明:在深层副本中,所有的对象都是重复的;而在浅表副本中,只有顶级对象是重复的,并且顶级以下的对象包含引用。可以看出,深拷贝和浅拷贝之间的区别在于是否复制了子对象。这如何理解呢?下面我通过带有子对象的代码来验证二者的区别。首先定义两个类型:Studen 阅读全文
posted @ 2012-04-12 14:51 怡馨 阅读(576) 评论(0) 推荐(0)
摘要:C#中有两种类型变量,一种 是值类型变量,一种是引用类型变量,对于值类型变量,深拷贝和前拷贝都是通过赋值操作符号(=)实现,其效果一致,将对象中的值类型的字段拷贝到新的对象中.这个很容易理解。 本文重点讨论引用类型变量的拷贝机制和实现。 C#中引用类型对象的copy操作有两种: 浅拷贝(影子克隆/shallow copy):只复制对象的值类型字段,对象的引用类型,仍属于原来的引用. 深拷贝(深度克隆):不仅复制对象的值类型字段,同时也复制原对象中的对象.就是说完全是新对象产生的. 浅拷贝和深拷贝之间的区别:浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它... 阅读全文
posted @ 2012-04-12 14:48 怡馨 阅读(426) 评论(0) 推荐(0)
摘要:一、问题的提出最近,博客园有许多blogger提出了为枚举显示中文名称的文章,例如[让枚举成员显示出中文信息],[利用自定义属性,定义枚举值的详细文本],[细节决定成败:映射枚举],[利用DescriptionAttribute定义枚举值的描述信息],还有原来看过的一些文章(不好意思地址没记)。这些文章的共同特点就是,使用了自定义Attribute附加在枚举值上, 在运行时获取枚举相关的信息。这种方法中,由于是使用反射,因为有些人关心其中的性能问题——特别是处理大量数据的时候,例如将大量枚举导入到DataGrid的时候;而且人们也发现,Enum本身的ToString方法也使用了反射的方法,因此 阅读全文
posted @ 2012-04-07 17:05 怡馨 阅读(384) 评论(0) 推荐(0)
摘要:在WinForm开发中,经常会遇到开发双语版本的问题,利用Resource功能,很容易实现。而前不久,我就遇到了一个难题——枚举的双语显示问题,问题如下:这里先定义一个枚举:enum Sex{Male,Female}然后,我们在WinForm一个窗口中放入一个ComboBox(命名为cbxSex),并把它的数据源绑定到Sex枚举,代码如下:cbxSex.DataSource = enum.GetValues(typeof(Sex));此时,界面显示如下:但是,此时要做中文版时,发现没法在不修改cbxSex.DataSource = enum.GetValues(typeof(Sex))的基础上 阅读全文
posted @ 2012-04-07 16:11 怡馨 阅读(371) 评论(0) 推荐(0)
摘要:1。问题 在设计实体类的时候,通常我们会把某些字段设置为枚举值,例如性别:publicenumSex:int{Male='M',Female='W',NotRestrict='A'} 这样好处不用说,通常是为了直观的考虑,还有限制输入的好处;如果强制用int转换,还以用System.Enum.IsDefined() 来判断枚举是否被定义,但是麻烦的是在界面UI上绑定的时候,我们通常要这样写:<asp:DropDownListRunat="server"id="ddlSex"><asp:Li 阅读全文
posted @ 2012-04-07 15:13 怡馨 阅读(784) 评论(0) 推荐(0)