C语言 入门资料编程入门1Word文件下载.docx
《C语言 入门资料编程入门1Word文件下载.docx》由会员分享,可在线阅读,更多相关《C语言 入门资料编程入门1Word文件下载.docx(53页珍藏版)》请在冰豆网上搜索。
版本支持:
系统中的组件或动态联接库可能要升级,由于这些组件或动态联接库都要在注册表中注册,由此可能带来一系列问题,例如,安装新程序时自动安装新组件替换旧组件,有可能使某些必须使用旧组件才可以运行的程序,使用新组件运行不了。
在.NET中这些组件或动态联接库不必在注册表中注册,每个程序都可以使用自带的组件或动态联接库,只要把这些组件或动态联接库放到运行程序所在文件夹的子文件夹bin中,运行程序就自动使用在bin文件夹中的组件或动态联接库。
由于不需要在注册表中注册,软件的安装也变得容易了,一般将运行程序及库文件拷贝到指定文件夹中就可以了。
完全面向对象:
不象C++语言,即支持面向过程程序设计,又支持面向对象程序设计,C#语言是完全面向对象的,在C#中不再存在全局函数、全区变量,所有的函数、变量和常量都必须定义在类中,避免了命名冲突。
C#语言不支持多重继承。
1.2编写控制台应用程序
1.2.1使用SDK命令行工具编写控制台程序
第一个程序总是非常简单的,程序首先让用户通过键盘输入自己的名字,然后程序在屏幕上打印一条欢迎信息。
程序的代码是这样的:
usingSystem;
//导入命名空间。
//为C#语言新增解释方法,解释到本行结束
classWelcome//类定义,类的概念见下一节
{/*解释开始,和C语言解释用法相同
解释结束*/
staticvoidMain()//主程序,程序入口函数,必须在一个类中定义
{Console.WriteLine("
请键入你的姓名:
"
);
//控制台输出字符串
Console.ReadLine();
//从键盘读入数据,输入回车结束
Console.WriteLine("
欢迎!
}
可以用任意一种文本编辑软件完成上述代码的编写,然后把文件存盘,假设文件名叫做welcome.cs,C#源文件是以cs作为文件的扩展名。
和C语言相同,C#语言是区分大小写的。
高级语言总是依赖于许多在程序外部预定义的变量和函数。
在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#中的复合名字一律通过.来连接。
System是.Net平台框架提供的最基本的名字空间之一,有关名字空间的详细使用方法将在以后详细介绍,这里只要学会怎样导入名字空间就足够了。
程序的第二行classWelcome声明了一个类,类的名字叫做Welcome。
C#程序中每个变量或函数都必须属于一个类,包括主函数Main(),不能象C或C++那样建立全局变量。
C#语言程序总是从Main()方法开始执行,一个程序中不允许出现两个或两个以上的Main()方法。
请牢记C#中Main()方法必须被包含在一个类中,Main第一个字母必须大写,必须是一个静态方法,也就是Main()方法必须使用static修饰。
staticvoidMain()是类Welcome中定义的主函数。
静态方法意义见以后章节。
程序所完成的输入输出功能是通过Console类来完成的,Console是在名字空间System中已经定义好的一个类。
Console类有两个最基本的方法WriteLine和ReadLine。
ReadLine表示从输入设备输入数据,WriteLine则用于在输出设备上输出数据。
如果在电脑上安装了VisualStudio.Net,则可以在集成开发环境中直接选择快捷键或菜单命令编译并执行源文件。
如果您不具备这个条件,那么至少需要安装Microsoft.NetFrameworkSDK,这样才能够运行C#语言程序。
Microsoft.NetFrameworkSDK中内置了C#的编译器csc.exe,下面让我们使用这个微软提供的命令行编译器对程序welcome.cs进行编译。
假设已经将welcome.cs文件保存在d:
\Charp目录下,启动命令行提示符,在屏幕上输入一行命令:
d:
回车,cdCharp回车,键入命令:
C:
\WINNT\Microsoft.NET\Framework\v1.0.3705\cscwelcome.cs
如果一切正常welcome.cs文件将被编译,编译后生成可执行文件Welcome.exe。
可以在命令提示符窗口运行可执行文件Welcome.exe,屏幕上出现一行字符提示您输入姓名:
输入任意字符并按下回车键,屏幕将打印出欢迎信息:
注意,和我们使用过的绝大多数编译器不同,在C#中编译器只执行编译这个过程,而在C和C++中要经过编译和链接两个阶段。
换而言之C#源文件并不被编译为目标文件.obj,而是直接生成可执行文件.exe或动态链接库.dll,C#编译器中不需要包含链接器。
1.2.1使用VisualStudio.Net建立控制台程序
(1)运行VisualStudio.Net程序,出现如图1.2.2A界面。
(2)单击新建项目按钮,出现如图1.2.2B对话框。
在项目类型(P)编辑框中选择VisualC#项目,在模板(T)编辑框中选择控制台应用程序,在名称(N)编辑框中键入e1,在位置(L)编辑框中键入D:
\csarp,必须预先创建文件夹D:
\csarp。
也可以单击浏览按钮,在打开文件对话框中选择文件夹。
单击确定按钮,创建项目。
出现如图1.2.2C界面。
编写一个应用程序,可能包含多个文件,才能生成可执行文件,所有这些文件的集合叫做一个项目。
(3)修改class1.cs文件如下,有阴影部分是新增加的语句,其余是集成环境自动生成的。
namespacee1
{
///<
summary>
///Class1的摘要说明。
/summary>
classClass1
{
///<
///应用程序的主入口点。
[STAThread]
staticvoidMain(string[]args)
{
//
//TODO:
在此处添加代码以启动应用程序
Console.WriteLine("
Console.ReadLine();
}
}
(4)按CTRL+F5键,运行程序,如右图,和1.2.1节运行效果相同。
屏幕上出现一行字符,提示您输入姓名:
输入回车退出程序。
图1.2.2A
图1.2.2B
图1.2.2C(下载源码就到源码网:
1.3类的基本概念
C#语言是一种现代、面向对象的语言。
面向对象程序设计方法提出了一个全新的概念:
类,它的主要思想是将数据(数据成员)及处理这些数据的相应方法(函数成员)封装到类中,类的实例则称为对象。
这就是我们常说的封装性。
1.3.1类的基本概念
类可以认为是对结构的扩充,它和C中的结构最大的不同是:
类中不但可以包括数据,还包括处理这些数据的函数。
类是对数据和处理数据的方法(函数)的封装。
类是对某一类具有相同特性和行为的事物的描述。
例如,定义一个描述个人情况的类Person如下:
classPerson//类的定义,class是保留字,表示定义一个类,Person是类名
{privatestringname="
张三"
;
//类的数据成员声明
privateintage=12;
//private表示私有数据成员
publicvoidDisplay()//类的方法(函数)声明,显示姓名和年龄
姓名:
{0},年龄:
{1}"
name,age);
publicvoidSetName(stringPersonName)//修改姓名的方法(函数)
{name=PersonName;
publicvoidSetAge(intPersonAge)
{age=PersonAge;
name,age)的意义是将第二个参数变量name变为字符串填到{0}位置,将第三个参数变量age变为字符串填到{1}位置,将第一个参数表示的字符串在显示器上输出。
大家注意,这里我们实际定义了一个新的数据类型,为用户自己定义的数据类型,是对个人的特性和行为的描述,他的类型名为Person,和int,char等一样为一种数据类型。
用定义新数据类型Person类的方法把数据和处理数据的函数封装起来。
类的声明格式如下:
属性类修饰符class类名{类体}
其中,关键字class、类名和类体是必须的,其它项是可选项。
类修饰符包括new、public、protected、internal、private、abstract和sealed,这些类修饰符以后介绍。
类体用于定义类的成员。
1.3.2类成员的存取控制
一般希望类中一些数据不被随意修改,只能按指定方法修改,既隐蔽一些数据。
同样一些函数也不希望被其它类程序调用,只能在类内部使用。
如何解决这个问题呢?
可用访问权限控制字,常用的访问权限控制字如下:
private(私有),public(公有)。
在数据成员或函数成员前增加访问权限控制字,可以指定该数据成员或函数成员的访问权限。
私有数据成员只能被类内部的函数使用和修改,私有函数成员只能被类内部的其它函数调用。
类的公有函数成员可以被类的外部程序调用,类的公有数据成员可以被类的外部程序直接使用修改。
公有函数实际是一个类和外部通讯的接口,外部函数通过调用公有函数,按照预先设定好的方法修改类的私有成员。
对于上述例子,name和age是私有数据成员,只能通过公有函数SetName()和SetAge()修改,既它们只能按指定方法修改。
这里再一次解释一下封装,它有两个意义,第一是把数据和处理数据的方法同时定义在类中。
第二是用访问权限控制字使数据隐蔽。
1.3.3类的对象
Person类仅是一个用户新定义的数据类型,由它可以生成Person类的实例,C#语言叫对象。
用如下方法声明类的对象:
PersonOnePerson=newPerson();
此语句的意义是建立Person类对象,返回对象地址赋值给Person类变量OnePerson。
也可以分两步创建Person类的对象:
PersonOnePerson;
OnePerson=newPerson();
OnePerson虽然存储的是Person类对象地址,但不是C中的指针,不能象指针那样可以进行加减运算,也不能转换为其它类型地址,它是引用型变量,只能引用(代表)Person对象,具体意义参见以后章节。
和C、C++不同,C#只能用此种方法生成类对象。
在程序中,可以用OnePerson.方法名或OnePerson.数据成员名访问对象的成员。
例如:
OnePerson.Display(),公用数据成员也可以这样访问。
注意,C#语言中不包括C++语言中的->
符号。
1.3.4类的构造函数和析构函数
在建立类的对象时,需做一些初始化工作,例如对数据成员初始化。
这些可以用构造函数来完成。
每当用new生成类的对象时,自动调用类的构造函数。
因此,可以把初始化的工作放到构造函数中完成。
构造函数和类名相同,没有返回值。
例如可以定义Person类的构造函数如下:
publicPerson(stringName,intAge)//类的构造函数,函数名和类同名,无返回值。
{name=Name;
age=Age;
当用PersonOnePerson=newPerson(“张五”,20)语句生成Person类对象时,将自动调用以上构造函数。
请注意如何把参数传递给构造函数。
变量和类的对象都有生命周期,生命周期结束,这些变量和对象就要被撤销。
类的对象被撤销时,将自动调用析构函数。
一些善后工作可放在析构函数中完成。
析构函数的名字为~类名,无返回类型,也无参数。
Person类的析构函数为~Person()。
C#中类析构函数不能显示地被调用,它是被垃圾收集器撤销不被使用的对象时自动调用的。
1.3.5类的构造函数的重载
在C#语言中,同一个类中的函数,如果函数名相同,而参数类型或个数不同,认为是不同的函数,这叫函数重载。
仅返回值不同,不能看作不同的函数。
这样,可以在类定义中,定义多个构造函数,名字相同,参数类型或个数不同。
根据生成类的对象方法不同,调用不同的构造函数。
例如可以定义Person类没有参数的构造函数如下:
publicPerson()//类的构造函数,函数名和类同名,无返回值。
{name="
age=12;
用语句PersonOnePerson=newPerson("
李四"
30)生成对象时,将调用有参数的构造函数,而用语句PersonOnePerson=newPerson()生成对象时,调用无参数的构造函数。
由于析构函数无参数,因此,析构函数不能重载。
1.3.6使用Person类的完整的例子
下边用一个完整的例子说明Person类的使用:
(VisualStudio.Net编译通过)
namespacee1//定义以下代码所属命名空间,意义见以后章节
{classPerson
{privateStringname="
publicvoidSetName(stringPersonName)//指定修改姓名的方法(函数)
publicvoidSetAge(intPersonAge)//指定修改年龄的方法(函数)
publicPerson(stringName,intAge)//构造函数,函数名和类同名,无返回值
publicPerson()//类的构造函数重载
田七"
classClass1
{staticvoidMain(string[]args)
{PersonOnePerson=newPerson("
30);
//生成类的对象
OnePerson.Display();
//下句错误,在其它类(Class1类)中,不能直接修改Person类中的私有成员。
//OnePerson.name="
王五"
//只能通过Person类中公有方法SetName修改Person类中的私有成员name。
OnePerson.SetName("
OnePerson.SetAge(40);
OnePerson=newPerson();
键入CTRL+F5运行后,显示的效果是:
李四,年龄:
30
王五,年龄:
40
田七,年龄:
12
1.4C#的数据类型
从大的方面来分,C#语言的数据类型可以分为三种:
值类型,引用类型,指针类型,指针类型仅用于非安全代码中。
本节重点讨论值类型和引用类型。
1.4.1值类型和引用类型区别
在C#语言中,值类型变量存储的是数据类型所代表的实际数据,值类型变量的值(或实例)存储在栈(Stack)中,赋值语句是传递变量的值。
引用类型(例如类就是引用类型)的实例,也叫对象,不存在栈中,而存储在可管理堆(ManagedHeap)中,堆实际上是计算机系统中的空闲内存。
引用类型变量的值存储在栈(Stack)中,但存储的不是引用类型对象,而是存储引用类型对象的引用,即地址,和指针所代表的地址不同,引用所代表的地址不能被修改,也不能转换为其它类型地址,它是引用型变量,只能引用指定类对象,引用类型变量赋值语句是传递对象的地址。
见下例:
classMyClass//类为引用类型
{publicinta=0;
classTest
{f1();
staticpublicvoidf1()
{intv1=1;
//值类型变量v1,其值1存储在栈(Stack)中
intv2=v1;
//将v1的值(为1)传递给v2,v2=1,v1值不变。
v2=2;
//v2=2,v1值不变。
MyClassr1=newMyClass();
//引用变量r1存储MyClass类对象的地址
MyClassr2=r1;
//r1和r2都代表是同一个MyClass类对象
r2.a=2;
//和语句r1.a=2等价
存储在栈中的变量,当其生命周期结束,自动被撤销,例如,v1存储在栈中,v1和函数f1同生命周期,退出函数f1,v1不存在了。
但在堆中的对象不能自动被撤销。
因此C和C++语言,在堆中建立的对象,不使用时必须用语句释放对象占用的存储空间。
.NET系统CLR内建垃圾收集器,当对象的引用变量被撤销,表示对象的生命周期结束,垃圾收集器负责收回不被使用的对象占用的存储空间。
例如,上例中引用变量r1及r2是MyClass类对象的引用,存储在栈中,退出函数f1,r1和r2都不存在了,在堆中的MyClass类对象也就被垃圾收集器撤销。
1.4.2值类型变量分类
C#语言值类型可以分为以下几种:
简单类型(Simpletypes)
简单类型中包括:
数值类型和布尔类型(bool)。
数值类型又细分为:
整数类型、字符类型(char)、浮点数类型和十进制类型(decimal)。
结构类型(Structtypes)
枚举类型(Enumerationtypes)
C#语言值类型变量无论如何定义,总是值类型变量,不会变为引用类型变量。
1.4.3结构类型
结构类型和类一样,可以声明构造函数、数据成员、方法、属性等。
结构和类的最根本的区别是结构是值类型,类是引用类型。
和类不同,结构不能从另外一个结构或者类派生,本身也不能被继承,因此不能定义抽象结构,结构成员也不能被访问权限控制字protected修饰,也不能用virtual和abstract修饰结构方法。
在结构中不能定义析构函数。
虽然结构不能从类和结构派生,可是结构能够继承接口,结构继承接口的方法和类继承接口的方法基本一致。
下面例子定义一个点结构point:
structpoint//结构定义
{publicintx,y;
//结构中也可以声明构造函数和方法,变量不能赋初值
{pointP1;
P1.x=166;
P1.y=111;
pointP2;
P2=P1;
//值传递,使P2.x=166,P2.y=111
pointP3=newpoint();
//用new生成结构变量P3,P3仍为值类型变量
}//用new生成结构变量P3仅表示调用默认构造函数,使x=y==0。
1.4.4简