C#学习心得

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

C#速成一、绪论C#是这样的一种语言,具有C++的特点,象Java一样的编程风格,并且象Basic一样的快速开发模型。如果你已经知道了C++,本文会在不到一个小时的时间内让你迅速掌握C#的语法。熟悉Java的括会更好,因为Java的程序结构、打包(Packages)和垃圾收集的概念有助于你更快的了解C#。因此在讨论C#的构造时,我会假定你了解C++。本文会讨论C#语言的构造与特点,同时会采取简洁的和你能理解的方式使用些代码示例,我们会尽量让你能稍微看看这些代码就能理解这些概念。注意:本文不是为C#高手(C#gurus)所写.这是针对在C#学习上还是初学者的文章。下面是将要讨论的C#问题的目录:程序结构命名空间数据类型变量运算符和表达式枚举语句(Statements)类(Classes)和结构(Structs)修饰符(Modifiers)属性(Properties)接口(Interfaces)方法参数(FunctionParameters)数组(Arrays)索引器(Indexers)装箱及拆箱操作委托(Delegates)继承和多态下面的内容将不会在被讨论之列:C++与C#谁更通用诸如垃圾回收、线程以及文件处理等概念数据的类型转换异常处理.NET库二、程序结构这一点象C++,C#是一种对大小写字母敏感的语言,分号“;”是语句间的分隔符。与C++不同的是,C#当中声明代码文件(头文件)与实现代码文件(cpp文件)不是独立存在的,所有代码(类声明和类实现)都位于一个扩展名为cs的文件内。让我们瞧瞧C#当中的Helloworld程序是怎样的。usingSystem;namespaceMyNameSpace{classHelloWorld{staticvoidMain(string[]args){Console.WriteLine(HelloWorld);}}}在C#当中的每样东西都被封装到一个类中,C#的类又被封装到一个命名空间当中(就象一个文件夹中的文件)。类似于C++,main方法是你的程序的入口点。C++的main函数调用名称是main,而C#的main函数是以大写字母M为起点的名称是Main。没有必要把分号分隔符放在类语句块或者结构定义语句块后。这在C++当中被要求,但在C#当中却不是。三、命名空间每一个类都被包装进一个命名空间。命名空间的概念与C++的完全相同,但在C#当中使用命名空间的频率较C++还高。你可以使用点限定符(dotqulifier)访问一个类。在上面的helloworld程序当中MyNameSpace就是一个命名空间。现在思考这样的一个问题,你想从某些别的类的命名空间当中来访问HelloWorld这个类该如何操作。这有一个例子:usingSystem;namespaceAnotherNameSpace{classAnotherClass{publicvoidFunc(){Console.WriteLine(HelloWorld);}}}现在,从你的HelloWorld类里你能象这样去访问上面的这个AnotherNameSpace的命名空间:usingSystem;usingAnotherNameSpace;//youwilladdthisusingstatementnamespaceMyNameSpace{classHelloWorld{staticvoidMain(string[]args){AnotherClassobj=newAnotherClass();obj.Func();}}}在.NET库当中,System是位于顶层的命名空间,别的命名空间都存在这个命名空间之下。默认状态下,存在一个全局的命名空间,因此一个在命名空间外定义的类将直接在这个全局命名空间之下;因此,你能在没有任何点限定符的情况下访问这个类。四、变量除以下区别外,C#当中的变量几乎与C++同:与C++不同,C#变量被访问之前必须被初始化;否则编译时会报错。因此,访问一个未初始化变量是不可能的事。C#中你不会访问到一个不确定的指针。(译者注:严格说起来C#已经把指针概念异化,限制更严格。所以有些资料上会说C#取消了指针概念)一个超出数组边界的表达式是不可访问的。C#中没有全局(整个Application)的变量或全局函数,全局方式的操作是通过静态函数和静态变量来实现的。五、数据类型所有C#数据类型都派生自基类Object。这里有两类数据类型:基本型/内置型用户自定义型下面一个C#内置类型列表:类型字节数解释byte1无符号字节型sbyte1有符号字节型short2有符号短字节型ushort2无符号短字节型int4有符号整型uint4无符号整型long8有符号长整型ulong8无符号长整型float4浮点数double8双精度数decimal8固定精度数stringunicode字串型charunicode字符型bool真假布尔型注意:C#当中的类型范围与C++有所不同;例如,C++的long型是4个字节,而在C#当中是8个字节。同样地,bool型和string型都不同于C++。bool型只接受true和false两种值。不接受任何整数类型。用户定义类型包括:类类型(class)结构类型(struct)接口类型(interface)数据类型的内存分配形式的不同又把它们分成了两种类型:值类型(ValueTypes)引用类型(ReferenceTypes)值类型:值类型数据在栈中分配。他们包括:所有基本或内置类型(不包括string类型)、结构类型、枚举类型(enumtype)引用类型:引用类型在堆中分配,当它们不再被使用时将被垃圾收集。它们使用new运算符来创建,对这些类型而言,不存在C++当中的delete操作符,根本不同于C++会显式使用delete这个运算符去释放创建的这个类型。C#中,通过垃圾收集器,这些类型会自动被收集处理。引用类型包括:类类型、接口类型、象数组这样的集合类型类型、字串类型、枚举类型枚举类型与C++当中的概念非常相似。它们都通过一个enum关键字来定义。示例:enumWeekdays{Saturday,Sunday,Monday,Tuesday,Wednesday,Thursday,Friday}类类型与结构类型的比较除了在内存分配形式上外,类与结构的概念完全与C++相同。类的对象被分配在堆中,并且通过new来创建,结构也是被new创建但却被分配在栈当中。C#当中,结构型适于快速访问和拥有少量成员的数据类型。如果涉及量较多,你应该创建一个类来实现他。(译者注:这与堆和栈内存分配结构的特点有关。简而言之,栈是一种顺序分配的内存;堆是不一定是连续的内存空间。具体内容需要大家参阅相关资料)示例:structDate{intday;intmonth;intyear;}classDate{intday;intmonth;intyear;stringweekday;stringmonthName;publicintGetDay(){returnday;}publicintGetMonth(){returnmonth;}publicintGetYear(){returnyear;}publicvoidSetDay(intDay){day=Day;}publicvoidSetMonth(intMonth){month=Month;}publicvoidSetYear(intYear){year=Year;}publicboolIsLeapYear(){return(year/4==0);}publicvoidSetDate(intday,intmonth,intyear){}...}六、属性如果你熟悉C++面象对象的方式,你就一定有一个属性的概念。在上面示例当中,以C++的观点来看,Data类的属性就是day、month和year。用C#方式,你可以把它们写成Get和Set方法。C#提供了一个更方便、简单、直接的方式来访问属性。因此上面的类可以被写成:usingSystem;classDate{intday;publicintDay{get{returnday;}set{day=value;}}intmonth;publicintMonth{get{returnmonth;}set{month=value;}}intyear;publicintYear{get{returnyear;}set{year=value;}}publicboolIsLeapYear(intyear){returnyear%4==0?true:false;}publicvoidSetDate(intday,intmonth,intyear){this.day=day;this.month=month;this.year=year;}}你可在这里得到并设置这些属性:classUser{publicstaticvoidMain(){Datedate=newDate();date.Day=27;date.Month=6;date.Year=2003;Console.WriteLine(Date:{0}/{1}/{2},date.Day,date.Month,date.Year);}}七、修饰符你必须已经知道public、private、protected这些常在C++当中使用的修饰符。这里我会讨论一些C#引入的新的修饰符。readonly(只读)readonly修饰符仅在类的数据成员中使用。正如这名字所提示的,readonly数据成员仅能只读,它们只能在构造函数或是直接初始化操作下赋值一次。readonly与const数据成员不同,const要求你在声明中初始化,这是直接进行的。看下面的示例代码:classMyClass{constintconstInt=100;//直接初始化readonlyintmyInt=5;//直接初始化readonlyintmyInt2;//译者注:仅做声明,未做初始化publicMyClass(){myInt2=8;//间接的}publicFunc(){myInt=7;//非法操作(译者注:不得赋值两次)Console.WriteLine(myInt2.ToString());}}sealed(密封)密封类不允许任何类继承,它没有派生类。因此,你可以对你不想被继承的类使用sealed关键字。sealedclassCanNotbeTheParent{inta=5;}unsafe(不安全)你可使用unsafe修饰符来定义一个不安全的上下文。在不安全的上下文里,你能写些如C++指针这样的不安全的代码。看下面的示例代码:publicunsafeMyFunction(int*pInt,double*pDouble){int*pAnotherInt=newint;*pAnotherInt=10;pInt=pAnotherInt;...*pDouble=8.9;}八、interface(接口)如果你有COM方面的概念,你会立亥明白我要谈论的内容。一个接口就是一个抽象的基类,这个基类仅仅包含功能描述,而这些功能的实现则由子类来完成。C#中你要用interface关键字来定义象接口这样的类。.NET就是基于这样的接口上的。C#中你不支持C++所允许的类多继承(译者注:即一个派生类可以从两个或两个以上的父类中派生)。但是多继承方式可以通过接口获得。也就是说你的一个子类可以从多个接口中派生实现。interfacemyDrawing{intoriginx{get;set;}intoriginy{get;set;}voidDraw(objectshape);}classShape:myDrawing{intOriX;intOriY;publicintoriginx{get{returnOriX;}set{OriX=value;}}publicintoriginy{get{returnOriY;}set{OriY=value;}}publicv

1 / 26
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功