新手入门(c#)
文章平均质量分 73
Knight94
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
《Effective C#》Item 5:提供一个有意义的ToString函数
在编写自定义类型的时候,即使我们不写ToString函数,系统也会自动提供ToString函数,例如: public class clsUserInfo { private string strUserName; …… } 不过系统所提供ToString函数,并不做太多的事情,无法真实的反映当前对象的一些属性,就如上这段代码原创 2006-06-18 16:48:00 · 4568 阅读 · 0 评论 -
如何解决WebService参数传递中文的问题
很多人在调用WebService所提供方法的时候,发现如果当字符串中含有中文,传到WebService端就发现是乱码,这是由于WebService默认的编码是“UTF-8”,当调用端和接收端用不同编码进行转换的时候,就会出现此类问题,如何解决这类问题呢,具体要根据你的环境而定。 如果WebService的代码是你可控的,那么修改起来很简单,只需要把WebService工程中的web.con原创 2006-05-01 18:39:00 · 22691 阅读 · 2 评论 -
如何用C#获得文件信息以及扩展信息
在C#中获得文件信息很容易,只需要用FileInfo类或者FileVersionInfo类就可以获得,但是如果想要获得文件的扩展信息,则无法从这两类来获得。不过在C#中,这也不是件难事,只要引入“Microsoft Shell Controls and Automation”这个COM就可以获得。 接下来就分别来介绍。首先介绍FileInfo类,这个类非常简单,首先需要根据文件名来创建原创 2006-05-07 09:00:00 · 25124 阅读 · 13 评论 -
如何用一个数据库的数据去更新另一个数据库的内容(续)
上次写了一个简单数据库之间数据交换的程序,但是考虑到如果数据量大的情况,我所使用的DataAdatper+DataSet方法,在性能上就有很大的劣势。不过,要想在数据量大的数据库之间能高效地交换,就需要舍弃原先的方法,而改用DBCommand+DataReader来操作,其实也是很简单的。 首先套用我原先例子数据转换模式,即把Access数据库中的数据去更新SQL Server数据库,原创 2006-05-13 09:12:00 · 8941 阅读 · 1 评论 -
如何在MDI中使子窗体只保留一个实例
由于在MDI中,子窗体会很多,那么在我以前一篇文章中所提到的方法就有些繁琐了。为了能适应多个子窗体,并对于每个子窗体只保留一个实例,那么我就用一个新的方法来替换,即用反射方法来作处理。 大致代码如下。首先是通过子窗体类型名来判断是否打开新的子窗体,还是把原有的子窗体进行显示。 using System.Reflection; /// /// Open c原创 2006-05-17 11:28:00 · 18458 阅读 · 47 评论 -
程序以及窗体运行的唯一性汇总
经常看到有人讨论程序运行唯一性或者窗体运行的唯一性问题。我之前也写了一些文章,在此把它进行整理汇总。 如果是程序的唯一性问题,我之前的一篇文章已经写得很全面,可以参看。http://blog.youkuaiyun.com/knight94/archive/2006/03/16/625809.aspx 如果是MDI子窗体的话,那么我最近的一篇文章提到的两种方法都不错,可以参看。http:原创 2006-05-24 13:57:00 · 13586 阅读 · 4 评论 -
《Effective C#》Item 15:利用using和try-finally来释放资源
我以前写过一篇文章,关于.Net资源释放问题,也就是对于非内存的资源,最好使用IDisposable接口提供的Dispose来释放,详情参看这篇文章。http://blog.youkuaiyun.com/knight94/archive/2006/08/05/1023352.aspx 很明显,Dispose方法是一个外部方法,系统并不会帮你调用。为了尽早释放对象所占用的资源,所以需要保证Dispo原创 2006-10-08 18:58:00 · 10547 阅读 · 5 评论 -
《Effective C#》Item 17:减少装箱(Boxing)和拆箱(Unboxing)操作
为了便于文章的开展,首先介绍装箱(Boxing)和拆箱(Unboxing)这两个名词。.Net的类型分为两种,一种是值类型,另一种是引用类型。这两个类型的本质区别,值类型数据是分配在栈中,而引用类型数据分配在堆上。那么如果要把一个值类型数据放到堆上,就需要装箱操作;反之,把一个放在堆上的值类型数据取出来,则需要进行拆箱操作。 例如,对于如下简单的装箱和拆箱操作语句。 int i原创 2006-10-08 19:15:00 · 14124 阅读 · 7 评论 -
《Effective C#》Part II:第二部分总结
第二部的主题在于资源管理,.Net编写的程序以托管程序居多,但是并不意味着可以不注意细节,合理的使用.Net提供的便利,加上好的习惯,有利于程序效率提高。 这部分包括7个单元,分别如下:Item 12: Prefer Variable Initializers to Assignment Statements《Effective C#》Item 12:推荐使用成员初始化语句ht原创 2006-10-10 20:28:00 · 7821 阅读 · 1 评论 -
《Effective C#》Item 16:尽量减少垃圾产生的数量
对于.Net所写一般程序来说,都属于托管程序,内存的释放和回收是由Garbage Collector完成。但是相对于栈上内存操作而言,GC回收堆上的内存,会消耗更多的CPU时间,这方面的内容可以参看这篇文章。http://blog.youkuaiyun.com/knight94/archive/2006/08/05/1023352.aspx 因此如果让GC不停的释放和回收内存,会造成程序性能的下降原创 2006-10-08 19:07:00 · 10410 阅读 · 2 评论 -
《Effective C#》Item 18:Dispose函数的标准实现模式
对于托管程序来说,非托管资源来说,需要手动来释放,否则会造成资源泄漏,如果放到析构函数去完成,但是GC调用对象的析构函数时机并不确定,对于资源释放并不及时。换句话说析构函数只是保障资源不被泄漏的方法,但不是最好的方法。比较好的方法,就是使用.Net的IDisposable接口提供的Dispose方法来进行释放。对于程序资源释放,可以参看这篇文章。http://blog.youkuaiyun.com/k原创 2006-10-10 20:12:00 · 11765 阅读 · 6 评论 -
如何弹出一个模式窗口来显示进度条
最近看了好多人问这方面的问题,以前我也写过一篇blog,里面说了如何在子线程中控制进度条。但目前大多数环境,需要弹出模式窗口,来显示进度条,那么只需要在原先的基础上稍作修改即可。 首先是进度条窗体,需要在上面添加进度条,然后去掉ControlBox。除此外,还要增加一个方法,用来控制进度条的增加幅度,具体如下: /// /// Increase process bar原创 2006-05-27 10:43:00 · 42902 阅读 · 56 评论 -
《Effective C#》Item 1:用属性来访问类的私有成员
在程序中,难免要访问某个对象的私有成员。那么以前实现这类功能的方法有两种,第一种方法最简单,就是把成员访问符从“private”改为“public”即可;而另一个就是提供公有的成员访问函数来进行访问。那么现在用C#编写程序,就不再需要采用前面所说的两种方法了,而直接使用属性来完成。 首先来看看三种方法的如何实现以及调用的,这里用一个例子来说明,即访问“EmployeeInfo”类的私有成员原创 2006-06-04 17:45:00 · 17199 阅读 · 13 评论 -
《Effective C#》Item 3:使用as和is操作符来做类型转换
在程序中,进行类型转换是常见的事。那么在C#中支持以前语言的类型转换方法,即用类型名进行强行转换,例如:object objTest = new NewType();NewType newValue = (NewType)objTest; 但是这样转换,有个严重的问题,就是在把objTest强转换成NewType类型对象的时候,这个过程是不安全的,因此需要用try-catch语句来原创 2006-06-12 16:38:00 · 5752 阅读 · 2 评论 -
《Effective C#》Item 19:推荐在继承中使用接口
.Net提供了接口,这个不同于Class或者Struct的类型定义。接口有些情况,看似和抽象类一样,因此有些人认为在.Net可以完全用接口来替换抽象类。其实不然,接口和抽象类各有长处和缺陷,因此往往在应用当中,两者要结合来使用,从而互补长短。 接下来先说说抽象类和接口的区别。区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是原创 2006-10-31 09:25:00 · 8463 阅读 · 3 评论 -
《Effective C#》Item 2:定义常量的两种方法
在C#中定义常量的方式有两种,一种叫做静态常量(Compile-time constant),另一种叫做动态常量(Runtime constant)。前者用“const”来定义,后者用“readonly”来定义。 对于静态常量(Compile-time constant),它的书写方式如下:public const int MAX_VALUE = 10;为什么称它为静态常量呢,因为原创 2006-06-06 19:48:00 · 6099 阅读 · 5 评论 -
如何把树与数据库的信息进行绑定
以前写了一个例子,演示如何通过数据库数据动态加载TreeNode,参看:Http://blog.youkuaiyun.com/knight94/archive/2006/03/24/637699.aspx 可能原先的例子,只是显示如何动态加载一个树,没有考虑到后期的修改或删除之类的操作,因此我在原有基础上,扩展了更新操作。不过实现的基础,还是在程序中保存一个临时数据表,要注意的是,如果数据量比较大原创 2006-05-01 12:27:00 · 7314 阅读 · 20 评论 -
《Effective C#》Item 4:使用Conditional属性来代替IF/ENDIF程序块
在编码的时候,有时候需要添加一些DEBUG信息,来为了方便调试程序,但是到了真正发布的时候,又不希望把这些信息进行编译发布。那么在以前C或者C++编码的时候,用IF/ENDIF来定义程序块实现这个功能,而此方法在C#中可以继续沿用。 这种用IF/ENDIF来增加DEBUG信息块有两种方式,如下:方式一,在一个函数中进行嵌入,例如:#if DEBUG Tra原创 2006-06-18 11:26:00 · 6868 阅读 · 3 评论 -
《Effective C#》Item 20:区分接口实现与虚函数重载
本文的英文标题为“Distinguish Between Implementing Interfaces and Overriding Virtual Functions”,但是文章的内容主要涉及的是如何在多层继承中使用接口,因此觉得文章标题和内容有些不符(也许我水平比较低,无法真正理解文章的内容)。 众所周知,在一个类中对接口所定义方法的实现,默认是不会加上“virtual”关键字的。原创 2006-11-04 20:03:00 · 10723 阅读 · 9 评论 -
《Effective C#》Item 21:用委托实现回调
委托属于C#中的新名词,它的应用也非常广泛,例如事件就是委托最简单而又直接的例子。 那么首先说说什么是委托,其实委托在用过C或者C++的人看来就是函数指针,不过使用C#的大多数人都没有用过这两门语言,因此对委托的理解不是很深,对于委托可以简单的从字面去理解,即“委托别人去执行某些操作”,也就是说执行一个操作,而这个操作过程自身并不知道,只是委托过来让你去执行而已。参看如下这个例子。原创 2006-11-15 10:49:00 · 10664 阅读 · 6 评论 -
《Effective C#》Item 6:区分值类型和引用类型
在C#中有两种类型的数据,一种是值类型数据,一种是引用类型数据。在编码的时候区分这两种类型数据,可以避免一些细小的编码错误。 首先说说什么类型是值类型,例如:int、float、bool之类的基础类型,以及用struct定义的类型,如:DateTime。除此外,如string,数组,以及用class定义的类型等都是引用类型。对于C#来说,很难罗列出所有类型进行一一分别,这需要自己在编码过程原创 2006-07-01 15:23:00 · 6491 阅读 · 3 评论 -
如何分解和合成Gif图像
一个Gif图像文件,是有几个文件进行合成的,因此处理此类文件的时候,不能像Jpeg或者Bmp文件那样处理。需要把Gif文件拆分帧的形式,然后对每一帧进行处理,处理完后再合成Gif。 其实网上有个例子对于Gif处理非常详细,地址如下。http://www.codeproject.com/dotnet/NGif.asp 但是对于一个Gif进行拆分,其实Image对象本身就支持,例如原创 2006-07-03 19:29:00 · 11447 阅读 · 9 评论 -
《Effective C#》Item 7:推荐使用不可改变的原子值类型
首先来解释一下标题,原标题为《Prefer Immutable Atomic Value Type》,因此对于标题的理解要分成三部分,第一部分为不可改变,第二部分为原子,最后一个部分为值类型。最后一部分,我不多说了,限制此章适用的范围。对于什么是不可改变类型,这里的意思是指此类型的变量一旦产生其成员就不能发生变化。至于原子类型,我以前在优快云也经常提到,例如保证操作的原子性之类的语句,那么一个原原创 2006-07-27 13:46:00 · 4482 阅读 · 3 评论 -
《Effective C#》Item 8:确保“0”在值类型中是有效的
大家在看了这标题后,肯定会觉的,为什么要确保“0”是有效的,这一点主要是跟值类型的内存分配有关,值类型有默认的构造函数,这是没法避免的,因此值类型变量中的成员在初始化的时候所出现的细微问题(对于值类型这方面的知识可以参看我前面一篇文章)。http://blog.youkuaiyun.com/Knight94/archive/2006/07/01/861383.aspx 日常中比较常见的两种值类型,原创 2006-08-09 10:06:00 · 4275 阅读 · 4 评论 -
浅谈C#托管程序中的资源释放问题
终于开始动手写这篇文章了,有个网友催了我好几次,今天终于可以静下心来完成它。 便于对文章的开展,需要先明确两个概念。第一个就是很多人用.Net写程序,会谈到托管这个概念。那么.Net所指的资源托管到底是什么意思,是相对于所有资源,还是只限于某一方面资源?很多人对此不是很了解,其实.Net所指的托管只是针对内存这一个方面,并不是对于所有的资源;因此对于Stream,数据库的连接,GDI+原创 2006-08-05 13:49:00 · 25907 阅读 · 27 评论 -
《Effective C#》Part I:第一部分总结
第一部分是语言使用的基础,而这是使用语言的基本功,也是平常最不注意的,养成好的习惯,有利于后期水平提高。 这部分包括11个单元,分别如下:Item 1: Always Use Properties Instead of Accessible Data Members《Effective C#》Item 1:用属性来访问类的私有成员http://blog.youkuaiyun.com/k原创 2006-08-21 08:21:00 · 7676 阅读 · 5 评论 -
使用Double-Buffer来实现无闪烁动态折线图
由于这片例子是借鉴于别人的基础上写的,我只是在上面加上了动态画折线图这部分,因为原理很简单,当时也只是为了给网友一个例子。没想到,还有很多人做这个,那么我就把这部分的代码贴出来,分享给大家。 大致代码如下://--------------------------- A Demo using Double-Buffer in GDI+ --------------------------原创 2006-08-18 16:31:00 · 12133 阅读 · 19 评论 -
《Effective C#》Item 10:小心GetHashCode函数所存在的陷阱
GetHashCode函数,看了它的名字就知道它会被用在哪里。没错,这个函数一般是在操作HashTable或者Dictionary之类的数据集的时候被调用。每个类型,不管是值类型还是引用类型,都提供这个基本函数,同样也可以像重写ToString或者Equals函数一样去重写它。但是我这里要说的,不建议重写此函数,而且在使用这个函数也需要加倍小心。 Why? 有些人看了我所说的,会产生类似的原创 2006-08-20 19:41:00 · 5624 阅读 · 6 评论 -
《Effective C#》Item 9:区别和认识四个判等函数
.Net有四个判等函数?不少人看到这个标题,会对此感到怀疑。事实上确是如此,.Net提供了ReferenceEquals、静态Equals,具体类型的Equals以及==操作符这四个判等函数。但是这四个函数之间有细微的关系,改变其中一个函数的实现会影响到其他函数的操作结果。 首先要说的是Object.ReferenceEquals和Object.Equals这两个静态函数,对于它们俩来说,原创 2006-08-11 15:24:00 · 9110 阅读 · 9 评论 -
《Effective C#》Item 11:提倡使用foreach语句来进行循环操作
循环语句是编程的基本语句,在C#中除了沿用C语言的循环语句外,还提供了foreach语句来实现循环。那么我要说的就是,在循环操作中尽量使用foreach语句来实现。 为了来更好地说明为什么要提倡使用foreach,用如下三种不同方式来编写循环语句。 int[] nArray = new int[100]; // Use "foreach" to l原创 2006-08-20 19:56:00 · 6313 阅读 · 7 评论 -
优快云第一期总结之二:ADO.NET + DataGrid的问题
现在写程序要完全不沾数据库的边恐怕很难,那么用C#写程序也是一样,会经常遇到数据库方面的问题。在C#中操作数据库是使用ADO.Net来完成,而显示数据这一方面常常要用到的是DataGrid这个组件,因此这两个问题也是论坛中问得最多的。 对于ADO.Net来说,涉及的问题大致分为如下几类:第一类,数据库的连接问题;第二类,数据库操作方面的问题,查询、更新等等;第三类,对数据集的操原创 2006-08-23 09:58:00 · 10972 阅读 · 9 评论 -
如何在异常中添加自己想要的信息
比较简单的方式,是在程序中先去捕获,然后再修改信息,最后抛出。如果想更多的信息,则需要一个类去继承Exception类,然后添加自己的元素。 先说简单的方法,首先修改存在异常的函数,例如: private void fun(int i, int k) { try { string a1 = "";原创 2006-03-30 16:06:00 · 3248 阅读 · 0 评论 -
如何在MDI程序中把子窗体菜单合并到主窗体上
这里只讲在MDI中,子菜单与父菜单合并的简单方法。 首先在MDI的主窗体中:1. 在主窗体构造函数中,添加如下代码,注意要在InitializeComponent调用之后,如: //Add File Menu MenuItem miFile = mnuMain.MenuItems.Add("&File");原创 2006-03-16 16:00:00 · 10259 阅读 · 5 评论 -
如何使自己的程序只运行一次
我介绍两个主流的方法。方法一:使用Mutex来进行1. 首先要添加如下的namespace:using System.Threading; 2. 修改系统Main函数,大致如下: bool bCreatedNew; //Create a new mutex using specific mutex name原创 2006-03-16 10:28:00 · 24697 阅读 · 14 评论 -
主窗体和子窗体之间如何相互操作对方的控件
很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件。相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即可。 下面重点介绍前一种,目前常见的有两种方法,基本上大同小异:第一种,在主窗体类中定义一个静态成员,来保存当前主窗体对象,例如: public static yourMainWindow pCurren原创 2006-03-18 15:34:00 · 25770 阅读 · 22 评论 -
如何向线程传递参数
很多人知道如何去开启一个线程,但是不知道如何正确的向线程中传递参数。 比较常见的错误是用全局变量来向线程传递参数,其实这样做的缺点一是不安全,二是比较麻烦,三是如果要开启多个线程,就更麻烦。 正确的做法是,把线程所需要的参数以及线程入口函数单独封装到一个类中,而且如果需要一些辅助函数的话,也封装到其中。这样代码既简洁,又清晰,同时复用起来很方便。 接着用一个线程类的例子原创 2006-03-21 15:16:00 · 13602 阅读 · 14 评论 -
如何在窗体以外的地方绘制图像
很多人都疑惑,如何在窗体以外的地方绘制图像,其实在以前VC中很方便。其实在C#中也很方便,需要调用DLL的方法,大致如下。 首先,定义DLL的函数,代码如下: [DllImport("User32.dll")] public extern static IntPtr GetDC(System.IntPtr hWnd); 然后就是原创 2006-03-20 17:27:00 · 3839 阅读 · 0 评论 -
如何把网络共享目录映射为本地驱动器
要映射一个网络目录为本地驱动器,需要调用系统DLL的WNetAddConnection2函数来进行添加。 首先,系统函数的申明如下:using System.Runtime.InteropServices; [DllImport("mpr.dll", EntryPoint="WNetAddConnection2")] public static extern原创 2006-03-21 16:06:00 · 16745 阅读 · 14 评论 -
如何用C#创建Windows Service
在.Net中用C#创建Windows Service,其实很简单,按照以下的步骤就可以做出一个简单的Windows Service。1.首先在创建工程的时候选择Windows Service,这样.Net会自动生成Windows Service的框架;2.完成Windows Service的相应事件,主要是OnStart和OnStop这两个事件,完成后大致代码如下:using Syst原创 2006-03-17 14:24:00 · 18521 阅读 · 24 评论 -
如何在DataGrid中进行添加、删除和修改操作
见于好多人在优快云上问如何在DataGrid中进行添加、删除和修改操作,我最近作了如下一个例子。 首先,例子所用的数据库是SQL Server2000,数据库表格如下: 字段名 类型原创 2006-03-17 17:28:00 · 10258 阅读 · 6 评论
分享