面向对象程序设计必知:深入理解类

人以类聚”,这个成语说明了类的概念,在面向对象设计中的类也是如此,一个类是一组东西的抽象,类可以有抽象出来的类(抽象类),也可以是具体的类,抽象类往往都有具体类,具体类负责实现抽象类定义的方法。一个类,里面定义了属于这个类别的东西共同拥有的属性和方法,比如Duck鸭子类,里面有叫声,羽毛等鸭子都有的属性,有游泳,叫等鸭子都有的方法。 在C#里类还分静态类和非静态类,最大的区别是静态类里必须都是静态方法,静态类必须用类名去访问里面的方法,静态类是编译时就确定的;非静态类必须先创建一个实例对象,然后才能去访问类里的成员和方法,非静态类是动态绑定的,也就是在执行的时候才确定要执行什么方法。 类有修饰它的关键字:Public、Protected,Private。这几个关键字代表的意思是: 1、Public:公共的类,这个类可以在外面的类被访问到; 2、Protected:私有的类,这个类可以在继承它的类被访问到; 3、Private:私有的类,这个类不能在任何其他外面的被类访问到。

May 21, 2010

Visual Studio常用快捷键

窗口快捷键 Ctrl+W,W: 浏览器窗口 Ctrl+W,S: 解决方案管理器 Ctrl+W,C: 类视图 Ctrl+W,E: 错误列表 Ctrl+W,O: 输出视图 Ctrl+W,P: 属性窗口 Ctrl+W,T: 任务列表 Ctrl+W,X: 工具箱 Ctrl+W,B: 书签窗口 Ctrl+W,U: 文档大纲 Ctrl+D,B: 断点窗口 Ctrl+D,I: 即时窗口 Ctrl+Tab: 活动窗体切换 Ctrl+Shift+N: 新建项目 Ctrl+Shift+O: 打开项目 Ctrl+Shift+S: 全部保存 Shift+Alt+C: 新建类 Ctrl+Shift+A: 新建项 编辑快捷键 Shift+Alt+Enter: 切换全屏编辑 Ctrl+B,T / Ctrl+K,K: 切换书签开关 Ctrl+B,N / Ctrl+K,N: 移动到下一书签 Ctrl+B,P: 移动到上一书签 Ctrl+B,C: 清除全部标签 Ctrl+I: 渐进式搜索 Ctrl+Shift+I: 反向渐进式搜索 Ctrl+F: 查找 Ctrl+Shift+F: 在文件中查找 F3: 查找下一个 Shift+F3: 查找上一个 Ctrl+H: 替换 Ctrl+Shift+H: 在文件中替换 Alt+F12: 查找符号(列出所有查找结果) Ctrl+Shift+V: 剪贴板循环 Ctrl+左右箭头键: 一次可以移动一个单词 Ctrl+上下箭头键: 滚动代码屏幕,但不移动光标位置。 Ctrl+Shift+L: 删除当前行 Ctrl+M,M: 隐藏或展开当前嵌套的折叠状态 Ctrl+M,L: 将所有过程设置为相同的隐藏或展开状态 Ctrl+M,P: 停止大纲显示 Ctrl+E,S: 查看空白 Ctrl+E,W: 自动换行 Ctrl+G: 转到指定行 Shift+Alt+箭头键: 选择矩形文本 Alt+鼠标左按钮: 选择矩形文本 Ctrl+Shift+U: 全部变为大写 Ctrl+U: 全部变为小写 ...

May 25, 2009

提高.NET性能的十大方法

第一、返回多个数据集 如果你是用动态的SQL语句来返回多个数据集,那我建议你用存储过程来替代动态的SQL语句。是否把业务逻辑写到存储过程中,这个有点争议。但是我认为,把业务逻辑写到存储过程里面可以限制返回结果集的大小,减小网络数据的流量,在逻辑层也不用在过滤数据,这是一个好事情。 用SqlCommand对象的ExecuteReader方法返回一个强类型的业务对象,再调用NextResult方法来移动数据集指针来定位数据集。示例一演示了一个返回多个ArrayList强类型对象的例子。只从数据库中返回你需要的数据可以大大的减小你的服务器所耗用的内存。 第二、对数据进行分页 一个好的解决方案是写一个分页的存储过程,例子2是一个用于对Northwind数据库orders表的分页存储过程。你只需要传当前页码,每页显示的条数两个参数进来,存储过程会返回相应的结果。 在服务器端,我专门写了一个分页的控件来处理数据的分页,在这里,我用了第一个方法,在一个存储过程里面返回了两个结果集:数据记录总数和要求的结果集。 返回的记录总数取决于要执行查询,例如,一个where条件可以限制返回的结果集的大小。因为在分页界面中必须要根据数据集记录的大小来计算总的页数,所以必须要返回结果集的记录数。例如,如果一共有1000000条记录,如果用where条件就可以过滤成只返回1000条记录,存储过程的分页逻辑应该知道返回那些需要显示的数据。 第三、使用连接池 要用连接池优化,有两条规则,第一,打开连接,处理数据,然后关闭连接。如果你必须在每次请求中多次打开或关闭连接,这好过一直打开一个边接,然后把它传到各个方法中。第二,用相同的连接字符串(或者用相同的用户标识,当你用集成认证的时候)。如果你没有用相同的连接字符串,如你用基于登录用户的连接字符串,这将不能利用连接池的优化功能。如果你用的是集成的论证,因为用户很多,所以你也不能充分利用连接池的优化功能。.NET CLR提供了一个数据性能计数器,它在我们需要跟踪程序性能特性的时候非常有用,当然也包括连接池的跟踪了。 无论你的应用程序什么时候要连在另一台机子的资源,如数据库,你都应该重点优化你连资源所花的时间,接收和发送数据的时间,以及往返回之间的次数。优化你的应用程序中的每一个处理点(process hop),它是提高你的应用的性能的出发点。 应用程序层包含与数据层连接,传送数据到相应的类的实例以及业务处理的逻辑。例如,在Community Server中,要组装一个Forums或者Threads集合,然后应用业务逻辑,如授权,更重要的,这里要完成缓存逻辑。 第四、充分利用ASP.NET缓存机制 如果你的组件是要在Asp.net应用程序中运行,你只要把System.Web.dll引用到你的项目中就可以了。然后用HttpRuntime.Cache属性就可访问Cache了(也可以通过Page.Cache或HttpContext.Cache访问)。 有以下几条缓存数据的规则。第一,数据可能会被频繁的被使用,这种数据可以缓存。第二,数据的访问频率非常高,或者一个数据的访问频率不高,但是它的生存周期很长,这样的数据最好也缓存起来。第三是一个常常被忽略的问题,有时候我们缓存了太多数据,通常在一台X86的机子上,如果你要缓存的数据超过800M的话,就会出现内存溢出的错误。所以说缓存是有限的。换名话说,你应该估计缓存集的大小,把缓存集的大小限制在10以内,否则它可能会出问题。在Asp.net中,如果缓存过大的话也会报内存溢出错误,特别是如果缓存大的DataSet对象的时候。 第五、预请求缓存 虽然Cache设计成用来保存某段时间的数据,而预请求缓存只是保存某个时期的某个请求的内容。如果某个请求的访问频率高,而且这个请求只需要提取,应用,修改或者更新数据一次。那么就可以预缓存该请求。我们举个例子来说明。 在CS的论坛应用程序中,每一个页面的服务器控件都要求得到用于决定它的皮肤(skin)的自定义的数据,以决定用哪个样式表及其它的一些个性化的东西。这里面的某些数据可能要长时间的保存,有些时间则不然,如控件的skin数据,它只需要应用一次,而后就可以一直使用。 要实现预请求缓存,用Asp.net 的HttpContext类,HttpContext类的实例在每一个请求中创建,在请求期间的任何地方都可以通过HttpContext.Current属性访问。HttpContext类有一个Items集合属性,在请求期间所有的对象和数据都被添加到这个集合中缓存起来。和你用Cache缓存访问频率高数据一样,你可以用HttpContext.Items缓存那些每个请求都要用到的基础数据。它背后的逻辑很简单:我们向HttpContext.Items中添加一个数据,然后再从它里面读出数据。 第六、后台处理优化 你只要简单的把下面的这一行代码复制到你的页面中就可以实现了:<%@ PageOutputCache VaryByParams=”none” Duration=”60” %> 你就可以有效的利用第一次请求里生成的页面输出缓存内容,60秒后重新生成一道页面内容。这种技术其实也是运用一些低层的Cache API来实现。用页面输出缓存有几个参数可以配置,如上面所说的VaryByParams参数,该参数表示什么时候触发重输出的条件,也可以指定在Http Get或Http Post 请求模式下缓存输出。例如当我们设置该参数为VaryByParams=”Report”的时候,default.aspx?Report=1或者default.aspx?Report=2请求的输出都会被缓存起来。参数的值可以是多个用分号隔开参数。 许多人都没有意识到当用页面输出缓存的时候,asp.net也会生成HTTP头集(HTTP Header)保存在下游的 虽然用页面输出缓存不提高你的应用程序性能,但是它能减少了从的服务器中加载已缓存页面内容的次数。当然,这仅限于缓存匿名用户可以访问的页面。因为一旦页面被缓存后,就不能再执行授权操作了。 第八、 用IIS6.0的Kernel Caching 如果你的应用程序没用运行在IIS6.0(windows server 2003)中,那么你就失去了一些很好的提高应用程序性能的方法。在第七个方法中,我讲了用页面输出缓存提高应用程序的性能的方法。在IIS5.0中,当一个请求到来到IIS后,IIS会把它转给asp.net,当应用了页面输出缓存时,ASP.NET中的HttpHandler会接到该请求,HttpHandler从缓存中把内容取出来并返回。 第九、 用Gzip压缩数据 除非你的CPU占用率太高了,才有必要用提升服务器性能的技巧。用gzip压缩数据的方法可以减少你发送到服务端的数据量,也可以提高页面的运行速度,同时也减少了网络的流量。怎么样更好的压缩数据取决于你要发送的数据,还有就是客户端的浏览器支不支持(IIS把用gzip压缩后的数据发送到客户端,客户端要支持gzip才能解析,IE6.0和Firefox都支持)。这样你的服务器每秒能多响应一些请求,同样,你也减少了发送响应的数据量,也就能多发送一些请求了。 好消息,gzip压缩已经被集成在IIS6.0中了,它比IIS5.0中gzip更好。不幸的是,在IIS6.0中启用gzip压缩,你不能在IIS6.0的属性对话中设置。IIS开发团队把gzip压缩功能开发出来了,但他们却忘了在管理员窗口中让管理员能很方便的启用它。要启用gzip压缩,你只能深入IIS6.0的xml配置文件中修改它的配置。 第十、 合理选择服务器控件的ViewState ViewState是asp.net中的一个特性,它用于把生成页面要用的一状态值保存在一个隐藏域中。当页面被回传到服务器时,服务器要解析,校验和应用ViewState中的数据以还原页面的控件树。ViewState是一个非常有用的特性,它能持久化客户端的状态而不用cookie或者服务器的内存。大部分的服务器控件都是用ViewState来持久化那些在页面中与用户交互的元素的状态值。例如,用以保存用于分页的当前页的页码。 用ViewState会带来一些负面的影响。首先,它加大的服务器的响应和请求的时间。其次,每次回传时都增加了序列化和反序列化数据的时间。最后,它还消耗了服务器更多的内存。

May 22, 2009

.NET框架简单介绍

我第一次接触.NET是在大一暑假(2005年),那时候学校有自己专门的网站,也是用ASP.NET开发的,而且全部由学生来管理开发,刚开始仅仅是出于对网站和编程的兴趣(当然也是为了能够谋求一个勤工助学的岗位)。 那个夏天很热,不过参加培训的地方很舒服,在一个大教室里,有空调。那时候对于网站开发、项目开发和.NET都是第一次。第一次接触css,第一次接触html,第一次接触C#,第一次接触.NET框架,第一次接触IIS,第一次接触项目概念… 之前我自学过面向对象,对“类、对象、继承、多态”这些概念是懵懵懂懂的,培训之后也还是一知半解。 什么是.NET?这个问题解释太多了,我还是引用微软官方的解释: “.NET 是 Microsoft 的用以创建 XML Web 服务(下一代软件)平台,该平台将信息、设备和人以一种统一的、个性化的方式联系起来 “借助于 .NET 平台,可以创建和使用基于 XML 的应用程序、进程和 Web 站点以及服务,它们之间可以按设计、在任何平台或智能设备上共享和组合信息与功能,以向单位和个人提供定制好的解决方案 “.NET 是一个全面的产品家族,它建立在行业标准和 Internet 标准之上,提供开发(工具)、管理(服务器)、使用(构造块服务和智能客户端)以及 XML Web 服务体验(丰富的用户体验)。.NET 将成为您今天正在使用的 Microsoft 应用程序、工具和服务器的一部分,同时,新产品不断扩展 XML Web 的服务能力以满足您的所有业务需求。” 历史永远记住这一刻,美国时间2000年6月22日,全球IT界为之关注。 后来又学习C++,学习MFC,综合MFC和.NET框架,然后又看了侯捷先生的文章,终于对于框架编程有了比较深的理解,所以后来学习JavaScript框架等等都可以站在一个高度上理解了。

May 21, 2009

.NET程序员重点学习和积累的技术要点

我知道,一个人的生命是有限的,而工作时间更加有限(我的价值观是工作和事业是为了让生活更好)。基于此,我现在只能在有限的时间里做有限的事情,下面是自己对自己的规划: 一、职业规划 首先,踏踏实实做一个技术人员,在工作总学习和提高自己;然后,能够凭借自己的能力做到项目开发经理;最后,要么能够在企业里做管理层,要么回学校讲课,无论如何最好能够出一本技术书籍。 二、深入学习的技术 1、最重要的:C#和ASP.NET技术,JQuery技术,设计模式,面向对象技术,css和页面布局技术,网站架构技术(squid,memcached等),SQL Sever数据库技术; 2、其次的:PHP技术,Linux技术、MySQL技术; 3、最为基础和技术提高的:C语言技术,数据结构,算法技术,计算机技术(cpu,内存,IO等和程序设计相关的技术)。 三、最值得我去深入研究的技术 以下这些技术是我必须要去深入研究的,而且要花功夫研究: 1、C#语言、.NET框架、C语言; 2、数据结构、面向对象、设计模式、软件工程; 3、Memcached、JQuery(相当于JavaScript)、css。

May 21, 2009

c# params,params用法,代码

在C#语言里,params 关键字可以指定在参数数目可变处采用参数的方法参数。 把数组作为参数的一个关键字,目的是做出如 a(parm1,parm2.parm3,….parmn) ,这样调用方式的函数,也就是同一种类型的不定个数参数列表,如果声明时没用parms关键字就如下调用,实际上是一样的 a(new type[]{parm1,parm2.parm3,….parmn}); 在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字,下面是具体示例代码: using System; public class MyClass { public static void UseParams(params int[] list) { for (int i = 0 ; i < list.Length; i++) { Console.WriteLine(list[i]); } Console.WriteLine(); } public static void UseParams2(params object[] list) { for (int i = 0 ; i < list.Length; i++) { Console.WriteLine(list[i]); } Console.WriteLine(); } static void Main() { UseParams(1, 2, 3); UseParams2(1, ‘a’, “test”); // An array of objects can also be passed, as long as // the array type matches the method being called. int[] myarray = new int[3] {10,11,12}; UseParams(myarray); } }

May 21, 2009

C#基础学习:深入理解什么是委托

深入理解什么是委托 委托就是函数指针,先定义了一个委托,然后将它的实例指向某个特定的方法(函数),通过这个委托的实例就可以调用其方法。 1、要想使得委托可以工作,必须有定义好的方法(函数),这是一种方式; 2、可以通过匿名方法来作为委托参数的一个代码块。 匿名方法其实就是在实例化委托的时候给委托定义了代码块,可以实现某些功能,再调用委托的时候就可以直接使用这些代码块了。 注意:匿名方法不能跳转到外部,外部也不能跳转到匿名方法;匿名方法内部不能访问安全代码,也不能在外部使用ref和out参数。 深入理解集合 在C#中应该能够灵活地使用数组列表、字典和集合,这样才可以获取程序的最佳性能。最主要的有下面这些:集合;数组列表;栈;队列;有序列表;字典。集合大都可以通过语句来实现访问: forreach(string item in Items) { writeline(item); } 1、数组列表(ArrayList) 常用的方法Add,Insert,RemoveAt,AddRange。 2、Stack类 适合于处理应用程序使用完后就删除的临时数据项,先进后出。 3、Queue类 和Stack差不多,只不过是先进先出。 4、SortedList类 在使用SortedList类的时候,每一项都会指定一个用于引用改项的标识键。可以通过GetKeyList()和GetValueList()来获取键和值。 5、字典和散列 字典和散列总是会跟HashTable联系起来。 深入理解泛型 引入泛型最大的好处就是避免大量的装箱和拆箱操作,而且能够简化大量代码。

May 21, 2009

C#常用函数列表(二)

11、string str=Request.QueryString[“变量”]; 用超链接传送变量。如在任一页中建超链接href=“Edit.aspx?fbid=“23"点击.在Edit.aspx页中取值:String str=Request.QueryString[“fdid”]; 12、DOC对象.CreateElement(“新建节点名”); 创建XML文档新节点 13、父节点.AppendChild(子节点); 将新建的子节点加到XML文档父节点下 14、 父节点.RemoveChild(节点); 删除节点 15、Response Response.Write(“字串”);Response.Write(变量);向页面输出。Response.Redirect(“URL地址”); 跳转到URL指定的页面 16、char.IsWhiteSpce(字串变量,位数)–逻辑型 查指定位置是否空字符;如:string str=“中国人"Response.Write(char.IsWhiteSpace(str,2));//结果为:True, 第一个字符是0位,2是第三个字符。 17、char.IsPunctuation(‘字符’) –逻辑型 查字符是否是标点符号如:Response.Write(char.IsPunctuation(‘A’)); //返回:False 18、(int)‘字符’ 把字符转为数字,查代码点,注意是单引号。如:Response.Write((int)‘中’); //结果为中字的代码:20013 19、(char)代码 把数字转为字符,查代码代表的字符。如:Response.Write((char)22269); //返回“国”字。 20、 Trim() 清除字串前后空格

May 21, 2009

C#最常用函数

以下是我们在开发过程中最为常用的一些函数: 1、DateTime 数字型 System.DateTime currentTime=new System.DateTime(); 1.1 取当前年月日时分秒 currentTime=System.DateTime.Now; 1.2 取当前年 int 年=currentTime.Year; 1.3 取当前月 int 月=currentTime.Month; 1.4 取当前日 int 日=currentTime.Day; 1.5 取当前时 int 时=currentTime.Hour; 1.6 取当前分 int 分=currentTime.Minute; 1.7 取当前秒 int 秒=currentTime.Second; 1.8 取当前毫秒 int 毫秒=currentTime.Millisecond; (变量可用中文) 2、Int32.Parse(变量) Int32.Parse(“常量”) 字符型转换 转为32位数字型 3、 变量.ToString() 字符型转换 转为字符串 12345.ToString(“n”); //生成 12,345.00 12345.ToString(“C”); //生成 ¥12,345.00 12345.ToString(“e”); //生成 1.234500e+004 12345.ToString(“f4”); //生成 12345.0000 12345.ToString(“x”); //生成 3039 (16进制) 12345.ToString(“p”); //生成 1,234,500.00% 4、变量.Length 数字型 取字串长度: 如: string str=“中国” int Len = str.Length ; //Len是自定义变量, str是求测的字串的变量名 5、System.Text.Encoding.Default.GetBytes(变量) 字码转换 转为比特码 如:byte[] bytStr = System.Text.Encoding.Default.GetBytes(str); 然后可得到比特长度: len = bytStr.Length; 6、System.Text.StringBuilder("") 字符串相加,(+号是不是也一样?) 如:System.Text.StringBuilder sb = new System.Text.StringBuilder(""); sb.Append(“中华”); sb.Append(“人民”); sb.Append(“共和国”); 7、变量.Substring(参数1,参数2); 截取字串的一部分,参数1为左起始位数,参数2为截取几位。 如:string s1 = str.Substring(0,2); 8、String user_IP=Request.ServerVariables[“REMOTE_ADDR”].ToString(); 取远程用户IP地址 9、穿过代理服务器取远程用户真实IP地址: if(Request.ServerVariables[“HTTP_VIA”]!=null){ string user_IP=Request.ServerVariables[“HTTP_X_FORWARDED_FOR”].ToString(); }else{ string user_IP=Request.ServerVariables[“REMOTE_ADDR”].ToString(); } 10、 Session[“变量”]; 存取Session值; 如,赋值: Session[“username”]=“小布什” 取值: Object objName=Session[“username”]; String strName=objName.ToString(); 清空: Session.RemoveAll();

May 21, 2009

IE下页面只有一个text回车将自动submit提交

IE下页面只有一个text回车将自动submit提交 这是IE的一个缺陷,不过还是有解决的办法的: 1、解决办法一:再增加一个text,然后隐藏这个text; 2、解决办法二:可以在这个页面的form里面加上onsubmit=“return false;” 。

May 21, 2009