当前位置:首页 » 编程博文
开发技术指南» 文章正文
    引言: 每隔10年左右,编程人员就需要花费大量的时间和精力去学习新的编程技术。
 

 

 ·asp数据库连接    »显示摘要«
    摘要:asp数据库连接<%set conn = server.createobject("adodb.connection")conn.open "provider=sqloledb;network library=dbmssocn;data source=127.0.0.1;initial catalog=testdb;user id=sa;password=;&q......
    摘要:记得老版本的标题(发送/接收)中有中文会出现编码的问题,现在用新的javamail版本没有这个问题了。另外如果内容为html的话,一般要设置编码为gbk,即在addpart的时候要addpart(part, "text/html; charset=\"gbk\""); ......


由C++转向C#:我们需要注意哪些方面的变化?
每隔10年左右,编程人员就需要花费大量的时间与精力去学习新的编程技术.在80年代是unix与c,90年代是windows与c++,现在又轮到了微软的.netframework与c#.尽管需要学习新的技术,但由此带来的好处却远高于付出的劳动.幸运的是,使用c#与.net进行的大多数工程的分析与设计与在c++与windows中没有本质的变化.在本篇文章中,我将介绍如何实现由c++到c#的飞跃.

【程序编程相关:正则表达式经典

【推荐阅读:linux教程-网络应用

已经有许多文章介绍过c#对c++的改进,在这里我就不再重复这些问题了.在这里,我将重点讨论由c++转向c#时最大的变化:由不可管理的环境向可管理的环境的变化.此外,我还会提出一些c#编程人员容易犯的错误供大家参考,此外,还将说明一些c#语言的能够影响编程的新功能. 【扩展信息:存储过程介绍及asp存储过程的使用

转向可管理的环境

c++的设计目标是低级的.与平台无关的面向对象编程语言,c#则是一种高级的面向组件的编程语言.向可管理环境的转变意味着你编程方式思考的重大转变,c#不再处理细微的控制,而是让架构帮助你处理这些重要的问题.例如,在c++中,我们就可以使用new在栈中.堆中.甚至是内存中的某一特定位置创建一个对象.

在.net的可管理环境中,我们再不用进行那样细微的控制了.在选择了要创建的类型后,它的位置就是固定的了.简单类型(ints.double与long)的对象总是被创建在栈中(除非它们是被包含在其他的对象中),类总是被创建在堆中.我们无法控制对象是创建在堆中哪个位置的,也没有办法得到这个地址,不能将对象放置在内存中的某一特定位置.(当然也有突破这些限制的方法,但那是很另类的方法.)我们再也不能控制对象的生存周期,c#没有destructor.碎片收集程序会将对象所占用的内存进行回收,但这是非显性地进行的.

正是c#的这种结构反映了其基础架构,其中没有多重继承与模板,因为在一个可管理的碎片收集环境中,多重继承是很难高效地实现的.

c#中的简单类型仅仅是对通用语言运行库(clr)中类型的简单映射,例如,c#中的int是对system.int32的映射.c#中的数据类型不是由语言本身决定的,而是由clr决定的.事实上,如果仍然想在c#中使用在visualbasic中创建的对象,就必须使自己的编程习惯更符合clr的规定.

另一方面,可管理的环境与clr也给我们带来了好处.除了碎片收集与所有.net语言中统一的数据类型外,它还提供给我们一个功能强大的面向组件的编程语言,无须对后期绑定提供特别的支持,类型发现与后期绑定都是被内置在语言中的.属性是c#语言中的第一类的成员,事件与代理也是.

可管理环境最主要的优点是.netframework.尽管在所有的.net语文中都可以使用这种框架,但c#可以更好地使用.net框架中丰富的类.接口与对象.

traps

c#看起来与c++非常相似,这使得我们在由c++转向c#时比较轻松,但其中也有一些容易出错的地方.在c++中编写得非常漂亮的代码,在c#中会不能通过编译,甚至会出现意想不到的结果.c#与c++之间在语法上的变化并不大,编译器能够发现这二者之间大部分的差异,我在这里就不再多费笔墨了,在这里我介绍几个容易出问题的比较重要的变化:

引用类型与值类型

在c#中,值类型与引用类型数据是有区别的.简单类型(int.long.double等)与结构属于值类型数据,类与对象属于引用类型数据.除非是包含在引用类型的变量中,与在c++中一样,值类型变量的值存储在栈中.引用类型的变量也存储在栈中,但它的值是一个存储在堆中的对象的地址,这一点也与c++类似.值类型变量是将自己的值传递给方法,而引用类型变量则将自己的指针传递给方法.

结构

c#中的结构与c++中有非常明显的区别.在c++中,结构更象是类,除了缺省的继承外,其缺省的访问权限是public而不是private.在c#中,结构与类截然不同,它是用来封装轻型对象的,是值类型的数据类型,在传递时传送的是变量的值,而不是其地址.此外,它们也有一些不适用于类的限制,例如,它是不能继承的,也没有除system.valuetype之外的基本类.结构还不能定义一个缺省的constructor.

另一方面,由于结构比类的效率要高,因此它非常适合于创建轻型对象.因此,如果它的缺点对你的软件没有影响,使用结构比使用类效率要高得多,尤其是对于小对象而言.

所有的一切都是对象

在c#中,所有的东西都是由继承object得到的,包括创建的类与int.structs等值类型的变量.object类提供了一些有用的方法,例如tostring,使用tostring的一个例子是与system.console.writeline一起使用,它可以接受一个字符串与许多对象.与使用printf语句不同,要使用writeline,需要提供代换变量.假设myemployee是用户定义的employee类的一个实例,mycounter是用户定义的counter类的一个实例:

console.writeline("theemployee:{0},thecountervalue:{1}",

myemployee,mycounter);

其中的writeline会调用每个对象的object.tostring方法,替换作为参数返回的变量.如果employee类不覆盖tostring,就会调用缺省的实现(由system.object继承得到的),它将把类的名字作为一个字符串返回.counter会覆盖tostring,返回一个整型的变量,因此,上面代码的输出为:

theemployee:employee,thecountervalue:12

如果向writeline传递一个整型变量会发生什么情况呢?由于不能对整型变量调用tostring,编译器将自动将整型变量封装在一个对象的实例中.当writeline调用tostring时,对象就会返回表示整型变量值的字符串.下面的代码就说明了这个问题:

类的使用

usingsystem;

//不覆盖tostring的类

publicclassemployee

{

}

//覆盖了tostring的类

publicclasscounter

{

privateinttheval;

publiccounter(inttheval)

{

this.theval=theval;

}

publicoverridestringtostring()

{

console.writeline("callingcounter.tostring()");

returntheval.tostring();

}

}

publicclasstester

{

publicstaticvoidmain()

{

//创建类的实例

testert=newtester();

//调用非静态成员

//(mustbethroughaninstance)

t.run();

}

//演示调用tostring的非静态方法

publicvoidrun()

{

employeemyemployee=newemployee();

countermycounter=newcounter(12);

console.writeline("theemployee:{0},thecountervalue:{1}",

myemployee,mycounter);

intmyint=5;


...   下一页
 ·xp    »显示摘要«
    摘要:xp_cmdshell 新增信息 - 2001 年 9 月 以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出。授予非管理用户执行 xp_cmdshell 的权限。 说明 在 microsoft® windows® 98 操作系统中执行 xp_cmdshell 时,将不把 xp_cmdshell 的返回代码设置为唤醒调用的可执行文件的进程......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE