在C#中不再存在全局函数、全区变量,所有的函数、变量和常量都必须定义在类中,避免了命名冲突。C#语言不支持多重继承。编写控制台应用程序使用SDK命令行工具编写控制台程序usingSystem;//导入命名空间。//为C#语言新增解释方法,解释到本行结束classWelcome//类定义,类的概念见下一节{/*解释开始,和C语言解释用法相同解释结束*/staticvoidMain()//主程序,程序入口函数,必须在一个类中定义{Console.WriteLine(请键入你的姓名:);//控制台输出字符串Console.ReadLine();//从键盘读入数据,输入回车结束Console.WriteLine(欢迎!);}}在C或C++中这些定义一般放到头文件中,用#include语句来导入这个头文件。而在C#语言中使用using语句导入名字空间,usingSystem语句意义是导入System名字空间,C#中的using语句的用途与C++中#include语句的用途基本类似,用于导入预定义的变量和函数,这样在自己的程序中就可以自由地使用这些变量和函数。如果没有导入名字空间的话我们该怎么办呢?程序还能保持正确吗?答案是肯定的,那样的话我们就必须把代码改写成下面的样子:classWelcome{staticvoidMain(){System.Console.WriteLine(请键入你的姓名:);System.Console.ReadLine();System.Console.WriteLine(欢迎!);}}也就是在每个Console前加上一个前缀System.,这个小原点表示Console是作为System的成员而存在的。C#中抛弃了C和C++中繁杂且极易出错的操作符象::和-等,C#中的复合名字一律通过.来连接。程序的第二行classWelcome声明了一个类,类的名字叫做Welcome。C#程序中每个变量或函数都必须属于一个类,包括主函数Main(),不能象C或C++那样建立全局变量。C#语言程序总是从Main()方法开始执行,一个程序中不允许出现两个或两个以上的Main()方法。staticvoidMain()是类Welcome中定义的主函数。1.2类的基本概念类,它的主要思想是将数据(数据成员)及处理这些数据的相应方法(函数成员)封装到类中,类的实例则称为对象。这就是我们常说的封装性。1.3.1类的基本概念类可以认为是对结构的扩充,它和C中的结构最大的不同是:类中不但可以包括数据,还包括处理这些数据的函数。类是对数据和处理数据的方法(函数)的封装。类是对某一类具有相同特性和行为的事物的描述。封装,它有两个意义,第一是把数据和处理数据的方法同时定义在类中。第二是用访问权限控制字使数据隐蔽。类的声明格式如下:属性类修饰符class类名{类体}其中,关键字class、类名和类体是必须的,其它项是可选项。类修饰符包括new、public、protected、internal、private、abstract和sealed,这些类修饰符以后介绍。类体用于定义类的成员。classPerson//类的定义,class是保留字,表示定义一个类,Person是类名1.3.2类成员的存取控制一些函数也不希望被其它类程序调用,只能在类内部使用。这就需要访问权限控制字,常用的访问权限控制字如下:private(私有),public(公有)。在数据成员或函数成员前增加访问权限控制字,可以指定该数据成员或函数成员的访问权限。私有数据成员只能被类内部的函数使用和修改,私有函数成员只能被类内部的其它函数调用。类的公有函数成员可以被类的外部程序调用,类的公有数据成员可以被类的外部程序直接使用修改。usingSystem;classPerson//类的定义,class是保留字,表示定义一个类,Person是类名{privatestringname=张三;//类的数据成员声明privateintage=12;//private表示私有数据成员publicvoidDisplay()//类的方法(函数)声明,显示姓名和年龄{Console.WriteLine(姓名:{0},年龄:{1},name,age);}publicvoidSetName(stringPersonName)//修改姓名的方法(函数){name=PersonName;}publicvoidSetAge(intPersonAge){age=PersonAge;}}公有函数实际是一个类和外部通讯的接口,外部函数通过调用公有函数,按照预先设定好的方法修改类的私有成员。对于上述例子,name和age是私有数据成员,只能通过公有函数SetName()和SetAge()修改,既它们只能按指定方法修改。Person类仅是一个用户新定义的数据类型,由它可以生成Person类的实例,C#语言叫对象。用如下方法声明类的对象:1.PersonOnePerson=newPerson();此语句的意义是建立Person类对象,返回对象地址赋值给Person类的变量OnePerson。2.也可以分两步创建Person类的对象:PersonOnePerson;OnePerson=newPerson();在程序中,可以用OnePerson.方法名或OnePerson.数据成员名访问对象的成员。例如:OnePerson.Display(),公用数据成员也可以这样访问。注意,C#语言中不包括C++语言中的-符号。1.3.3类的构造函数和析构函数在建立类的对象时,需做一些初始化工作,例如对数据成员初始化。这些可以用构造函数来完成。每当用new生成类的对象时,自动调用类的构造函数。因此,可以把初始化的工作放到构造函数中完成。构造函数和类名相同,没有返回值。例如可以定义Person类的构造函数如下:publicPerson(stringName,intAge)//类的构造函数,函数名和类同名,无返回值。{name=Name;age=Age;}当用PersonOnePerson=newPerson(“张五”,20)语句生成Person类对象时,将自动调用以上构造函数。请注意如何把参数传递给构造函数。变量和类的对象都有生命周期,生命周期结束,这些变量和对象就要被撤销。类的对象被撤销时,将自动调用析构函数。一些善后工作可放在析构函数中完成。析构函数的名字为~类名,无返回类型,也无参数。Person类的析构函数为~Person()。C#中类析构函数不能显示地被调用,它是被垃圾收集器撤销不被使用的对象时自动调用的。publicPerson(stringName,intAge)这是有参数的构造函数,可以用PersonOnePerson=newPerson(“张五”,20)的方法进行调用,publicPerson()这是无参数的构造函数。下边用一个完整的例子说明Person类的使用:(VisualStudio.Net编译通过)usingSystem;namespacee1//定义以下代码所属命名空间,意义见以后章节{classPerson{privateStringname=张三;//类的数据成员声明privateintage=12;publicvoidDisplay()//类的方法(函数)声明,显示姓名和年龄{Console.WriteLine(姓名:{0},年龄:{1},name,age);}publicvoidSetName(stringPersonName)//指定修改姓名的方法(函数){name=PersonName;}publicvoidSetAge(intPersonAge)//指定修改年龄的方法(函数){age=PersonAge;}publicPerson(stringName,intAge)//构造函数,函数名和类同名,无返回值{name=Name;age=Age;}//,本人注一publicPerson()//类的构造函数重载{name=田七;age=12;//本人注二}}//以上是一个类的完整定义,本人注三classClass1{staticvoidMain(string[]args){PersonOnePerson=newPerson(李四,30);//生成类的对象OnePerson.Display();//这个语句格式将调用有参数的构造函数,即本人注一的红色部分,本人注四。OnePerson.Display();是调用类的方法,即显示信息。//下句错误,在其它类(Class1类)中,不能直接修改Person类中的私有成员。//OnePerson.name=王五;//只能通过Person类中公有方法SetName修改Person类中的私有成员name。OnePerson.SetName(王五);OnePerson.SetAge(40);OnePerson.Display();//这个语句是对类成员信息修改后,在调用类方法显示出来,本人注五OnePerson=newPerson();OnePerson.Display();//这个语句格式调用无参数的构造函数,即本人注二的部分,本人注六}}}键入CTRL+F5运行后,显示的效果是:姓名:李四,年龄:30姓名:王五,年龄:40姓名:田七,年龄:121.3C#的数据类型C#语言的数据类型可以分为三种:值类型,引用类型,指针类型,指针类型仅用于非安全代码中。1.4.1值类型和引用类型区别在C#语言中,值类型变量存储的是数据类型所代表的实际数据,值类型变量的值(或实例)存储在栈(Stack)中,赋值语句是传递变量的值。引用类型(例如类就是引用类型)的实例,也叫对象,不存在栈中,而存储在可管理堆(ManagedHeap)中,堆实际上是计算机系统中的空闲内存。引用类型变量的值存储在栈(Stack)中,但存储的不是引用类型对象,而是存储引用类型对象的引用,即地址,和指针所代表的地址不同,引用所代表的地址不能被修改,也不能转换为其它类型地址,它是引用型变量,只能引用指定类对象,引用类型变量赋值语句是传递对象的地址。1.4.2值类型变量分类C#语言值类型可以分为以下几种:简单类型(Simpletypes)简单类型中包括:数值类型和布尔类型(bool)。数值类型又细分为:整数类型、字符类型(char)、浮点数类型和十进制类型(decimal)。结构类型(Structtypes)枚举类型(Enumerationtypes)C#语言值类型变量无论如何定义,总是值类型变量,不会变为引用类型变量。1.4.3结构类型结构类型和类一样,可以声明构造函数、数据成员、方法、属性等。结构和类的最根本的区别是结构是值类型,类是引用类型。和类不同,结构不能从另外一个结构或者类派生,本身也不能被继承,因此不能定义抽象结构,结构成员也不能被访问权限控制字protected修饰,也不能用virtual和abstract修饰结构方法。在结构中不能定义析构函数。虽然结构不能从类和结构派生,可是结构能够继承接口,结构继承接口的方法和类继承接口的方法基本一致。下面例子定义一个点结构point:usingSystem;structpoint//结构定义{publicintx,y;//结构中也可以声明构造函数和方法,变量不能赋初值}classTest{staticvoidMain(){pointP1;P1.x=166;P1.y=111;pointP2;P2=P1;//值传递,使P2.x=166,P2.y=111pointP3=newpoint();//用new生成结构变量P3,P3仍为值类型变量}//用new生成结构变量P3仅表示调用默认构造函数,使x=y==0。}1.4.4简单类型简单类型包括:整数类型、字符类型、布尔类型、浮点数类型、十进制类型。见下表:保留字System命名空间中的字节取值范围名字数sbyteSystem.Sbyte1-128~127byteSystem.Byte10~255sho