版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
专题一C#与NET平台介绍
了解.NETFramework的结构理解.NETFramework的基本概念CLRJITCTSMSIL了解.NETFramework命名空间了解C#程序的基本结构教学目标C#简介任务1C#语言的由来在过去的二十年里,C和C++已经成为在商业软件的开发领域中使用最广泛的语言。它们为程序员提供了十分灵活的操作,不过同时也牺牲了一定的开发效率。与VB等语言相比,同等级别的C/C++应用程序往往需要更长时间来开发。由于C/C++语言的复杂性,许多程序员都试图寻找一种新的语言,希望能在功能与效率之间找到一个更为理想的权衡点。C#(Csharp)是对这一问题的解决方案。C#是一种新的、面向对象的编程语言。它使得程序员可以快速地编写各种基于Microsoft.NET平台的应用程序,Microsoft.NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。
.NET的语言互操作性:不同语言编写的代码可互相调用C#的平台移植性:框架JIT编译器(JustInTime,即时编译器)代码被执行C++VB编译器编译器可执行代码可执行代码RUNTIMERUNTIME.NET代码的编译
语言特定的编译器和运行库代码被执行C++VB编译器编译器可执行代码可执行代码RUNTIMERUNTIMEIL+元数据CLRIL和CLR的使用
IntermediateLanguage
CommonLanguageRuntime编译执行.NET程序MSIL+元数据机器代码代码被执行CLR第一次编译第二次编译.NET程序被编译两次,第一次编译很慢,而第二次编译较快!语言编译器.NET源代码Microsoft中间语言MSIL+元数据机器代码代码被执行CLRMSIL帮助语言实现互操作IL不是字节代码,但很接近字节代码。因此,执行应用程序时,IL到机器码的转换速度非常快!通过CLR将MSIL转换为具体CPU的代码CPU无关的指令集语言编译器.NET源代码程序集module通用语言运行时CLRCLR.NET源代码MSIL+元数据机器代码代码被执行管理内存易于设计组件和应用程序,其对象可以跨语言互动跨语言集成(特别是跨语言继承)JIT编译器:一次编译,就可运行在支持运行库的任何CPU和操作系统上语言编译器.NETFramework的体系结构VisualStudio.NETCLR通用语言运行时(CLR)BaseClassLibrary:IO,Drawing,ThreadingDataandXMLXMLWebservicesWindowsFormsWebForms通用语言规范(CLS)VBC++C#…JScript操作系统.NetFramework类库(FCL)CLS和CTS通用语言规范CLS CommonLanguageSpecification规定所有.NET语言都应遵循的规则生成可与其他语言互操作的应用程序通用类型系统(CommonTypeSystem,CTS)包含标准数据类型包含准则集CLS、CTS和MSIL紧密配合以实现语言互操作性编译和执行C#应用程序任务2第一个C#程序:HelloWorld
usingSystem;classHelloWorld{staticvoidMain(){Console.WriteLine(“Hello,World!”);console.readline();//此处用于观看输出结果;}}HelloWorld.cs输出用CSC编译搜索CSC.exe这个程序所在的文件路径将这个路径复制下来,右击“我的电脑”-》“属性”-》“高级”-》“环境变量”在“系统变量”选择“path”,点“编辑”,将刚才复制的路径添加到系统变量中,注意将不同路径之间用分号隔开环境变量设置完毕。点击开始-》运行-》输入cmd,进入控制台利用控制台命令写入当前存放代码文件的文件夹,键入“cscFirst。cs”,回车运行,这时在该文件夹下找到First.Exe文件输入First回车查看运行结果用CSC编译用CSC编译用CSC编译CSC命令的用法用CSC编译关于编译结果EXE文件的说明用VisualStudio编译单击“开始”“程序”“MicrosoftVisualStudio.NET2005”“MicrosoftVisualStudio.NET2005”此时将打开VS.NET2005的起始页要创建C#控制台应用程序,请从列表中选择“创建建”“项目”。此时将打开“新建项目”窗口选择“VisualC#项目”作为项目类型,选择“控制台应用程序”作为模板
HelloWorld.csprojAssemblyInfo.csProgram.cs“HelloWorld”应用程序文件用VisualStudio编译要生成C#项目,请从菜单中选择“生成”“生成解决方案”该过程将编译项目中包括的所有文件,编译结果显示在“输出”窗口中如果结果显示“生成:1成功或最新,0失败,0被跳过”,则说明已经成功生成,然后即可交付该应用程序用VisualStudio编译要运行刚才生成的应用程序,请从菜单中选择“调试”“开始执行(不调试)”输出结果显示在VS.NET控制台窗口中用VisualStudio编译C#应用程序文件夹结构VisualStudio.NET2005创建一个与项目同名的文件夹,此处为“HelloWorld”该文件夹包含项目文件“HelloWorld.csproj”和其他关联文件每个新项目都创建了bin、obj和Properties三个文件夹。Bin和obj这两个文件夹下都有一个Debug子目录,其中包含可执行文件HelloWorld.exe在“解决方案资源管理器”中启用“显示所有文件”选项,可查看“HelloWorld”项目的结构用VisualStudio编译C#的程序结构任务3//这是用C#
编写的一个简单的HelloWorld程序usingSystem;namespaceNotepad{ classHelloWorld {
staticvoidMain() { Console.WriteLine("HelloWorld"); } }}声明HelloWorld类描述代码的注释HelloWorld
程序程序入口点,Main的返回类型为void控制台类的WriteLine()方法用于显示输出结果导入System命名空间声明命名空间Notepad将文件保存为*.cs第一个C#程序:HelloWorld1:usingSystem;第1行:using关键字类似C/C++的#include用来引用.NET框架类库中的资源通常在程序文件的开头使用如果程序中需要多种资源,可以使用多次usingSystem命名空间System命名空间提供了构建应用程序所需的系统统能的访问1.HclassA{…}2.HclassA{…}3.cpp#include“1.h”#include“2.h”….3.cppclassA{…}classA{…}…第一个C#程序:HelloWorldC++的命名空间用法namespacea1{classA{…}}namespacea2{classA{…}}3.csusinga1;usinga2;a1.Aa2.A第一个C#程序:HelloWorldC#的命名空间用法常用命名空间命名空间说明System.Drawing处理图形和绘图,包括打印System.Data处理数据存取和管理,在定义ADO.NET技术中扮演重要角色System.IO管理对文件和流的同步和异步访问System.Windows处理基于窗体的窗口的创建System.Reflection
包含从程序集读取元数据的类System.Threading
包含用于多线程编程的类
System.Collections
包含定义各种对象集的接口和类第一个C#程序:HelloWorld第一个C#程序:HelloWorld2:classHelloWorld3:{………..8:}第2,3,8行:类在C#或其他面向对象语言中,需要编写类使用关键字class定义一个类,类的内容放在一对{}中示例中定义了一个名为HelloWorld的类第一个C#程序:HelloWorld4:staticvoidMain()5:{………..7:}第4,5,7行:Main方法Main方法是应用程序的入口点,编译器将由该处开始执行程序方法体也放在一对{}中每个C#的应用程序都必须包含Main方法4:staticvoidMain()5:{………..7:}第4,5,7行:Main方法static表示Main方法是一个全局方法void表示Main方法没有任何返回值,即返回值是空参数放在小括号中定义。此处括号内没有内容,表明Main方法没有任何参数第一个C#程序:HelloWorld6:Console.WriteLine(“Hello,World!”);第6行:语句在C#中要执行的指令语句之间用;分隔,编译器通过分号来区分多个语句使用大括号{}标识某个代码块的开始和结束,从而可以对语句进行组合。大括号必须成对匹配。第一个C#程序:HelloWorld6:Console.WriteLine(“Hello,World!”);第6行:语句
HelloWorld程序的主要目的就是在屏幕上显示一条问候 WriteLine方法用来将问候语写到标准输出设备上。
Console代表标准输出设备---屏幕,它属于System命名空间
WriteLine方法是Console类的方法。访问类或对象的方法使用 点取符.来完成。字符串用双引号“”表示字符串“Hello,World”是WriteLine方法的参数,表示屏幕输出 的内容第一个C#程序:HelloWorldC#的数据类型及变量任务4系统预定义数据类型类型描
述范围/精度例子object所有其它类型的最根本的基础类型objecto=null;string字符串类型,一个字符串是一个Unicode字符序列strings="Hello";sbyte8-bit有符号整数类型–128...127sbyteval=12;short16-bit有符号整数类型–32,768...32,767shortval=12;int32-bit有符号整数类型–2,147,483,648...2,147,483,647intval=12;long64-bit有符号整数类型–9,223,372,036,854,775,808...9,223,372,036,854,775,807longval1=12;longval2=34L;byte8-bit无符号整数类型0...255byteval1=12;byteval2=34U;ushort16-bit无符号整数类型0...65,535ushortval1=12;ushortval2=34U;uint32-bit无符号整数类型0...4,294,967,295uintval1=12;uintval2=34U;系统预定义数据类型类型描
述范围/精度例子ulong64-bit无符号整数类型0...18,446,744,073,709,551,615ulongval1=12;ulongval2=34U;ulongval3=56L;ulongval4=78UL;float单精度浮点数类型1.5
×
10−45
至
3.4
×
1038,7位精度floatval=1.23F;double双精度浮点数类型5.0
×
10−324至
1.7
×
10308,15位精度doubleval1=1.23;doubleval2=4.56D;bool布尔类型类型;一个布尔类型数据不是真就是假true,falseboolval1=true;boolval2=false;char字符类型;一个字符数据是一个Unicode字符charval='h';decimal精确十进制类型,有28个有效位1.0
×
10−28至
7.9
×
1028,28位精度decimalval=1.23M;[accessmodifiers]enum<identifier>[:enum_base]{enumbody}classMyApp{enumFabric:int{Cotton=1,Silk=2,Wool=4
}staticvoidMain(){Fabricfab=Fabric.Cotton;intfabNum=(int)fab;stringfabType=fab.ToString();Console.WriteLine(fab);}}整型,默认为int默认为internal用户自定义数据类型-枚举枚举和位标志namespaceMyHelloApp{classmyApp{[Flags]enumFabric{Cotton=1,Silk=2}staticvoidMain(){Fabricfab1=(Fabric)3;Console.WriteLine(fab1.ToString());
}}}用户自定义数据类型-枚举System.Enum的方法usingSystem;namespaceApp1{classmyApp{enumFabric{Cotton=1,Silk=2}staticvoidMain(){stringfabStr="Cotton";if(Enum.IsDefined(typeof(Fabric),fabStr)){Fabricfab=(Fabric)Enum.Parse(typeof(Fabric),fabStr);Console.WriteLine(Enum.GetName(typeof(Fabric),2));}}}}用户自定义数据类型-枚举structstructEx{publicintstructDataMember;
publicvoidstructMethod1(){ //structMethod1实现}}自定义数据类型可以在其内部定义方法无法实现继承属于值类型主要结构:structstudent{ publicintstud_id; publicstringstud_name; publicfloatstud_marks; publicvoidshow_details() { //显示学生详细信息 }}数据成员方法所有与Student关联的详细信息都可以作为一个整体进行存储和访问用户自定义数据类型-结构体变量
staticvoidMain(string[]args) {
//声明布尔型、字符串型、整型、短整型和浮点型变量
boolt=false;
shortn1=30;
intn2=1200;
stringstr="jeny";
floatn3=23.1f;
//显示变量值
Console.WriteLine("布尔值="+t);
Console.WriteLine("短整型值="+n1);
Console.WriteLine("整型值
="+n2);
Console.WriteLine("字符串值="+str);
Console.WriteLine("浮点值="+n3); }变量中存储的值取决于该变量的类型常量staticvoidMain(string[]args){
//PI常量PI
constfloat_pi=3.1415169F;
//由地球引力引起的加速度常量,单位为cm/s*s
constfloat_gravity=980;
//钟摆的长度
intlength=60;
//钟摆的周期
doubleperiod=0;
//钟摆周期的计算公式
period=2*_pi*Math.Sqrt(length/_gravity);
Console.WriteLine("钟摆的周期为{0}秒",period);}声明常量在表达式中使用常量const关键字用于声明常量变量的常见用法类型类别后缀示例/允许的值bool布尔无true或falseint整数无intx=100uint,ulog整数U或Uuintx=1000ulong,ulong长整型L或llongx=100000Lulong无符号长整型ul,uL,Ul,UL,lu,Lu,lU或LUulongx=4324ulfloat单精度浮点数类型F或ffloatx=34.76Fdouble双精度浮点数类型D或ddoublex=763.7245Ddecimal精确十进制类型M或mdecimalx=1.544Mchar字符无charx=‘a’string字符串无string=”abc”int:intiMax=int.MaxValue;intpVal=int.Parse(“100”);shorti16=50;inti32=i16;i16=i32;错误i16=(short)i32;decimaldecimaliRate=3.9834M;iRate=decimal.Round(iRate,2);//四舍五入iRate=decimal.Remainder(512.0M,51.0M);变量的常见用法boolboolbt=(bool)1;//错误charstringpattern=“123abcd?”;boolbt;bt=char.IsLetter(pattern,3);bt=char.IsNumber(pattern,3);bt=char.IsLower(pattern,3);bt=char.IsPunctuation(pattern,7);bt=char.IsLetterOrDigit(pattern,3);变量的常见用法single,doublefloatf=24567.66f;doubled=124.45;If(Single.IsNaN(1/0){…}使用Parse转换数字字符串shortshParse=Int16.Parse("100");intiParse=Int32.Parse("100");longshParse=Int64.Parse("100");decimaldParse=decimal.Parse(“99.99");floatsParse=float.Parse(“99.99");doubledParse=double.Parse(“99.99");变量的常见用法字符串直接量stringpath;path=@”C:\note.txt”;path=“C:\\note.txt”;字符串操作索引字符串中的单个字符stringstr=“abcd”;charc=str[0];字符串连接strings1=“Myage=“;intmyAge=28;stringcat=s1+myAge;变量的常见用法字符串操作抽取和定位子串stringpoem=“InXanadudidKublaKhan”;stringpoemSeg=poem.Substring(10);poemSeg=poem.Substring(0,9);intindex=poem.IndexOf(“I”);index=poem.LastIndexOf(“n”);比较字符串boolisMatch;stringtitle="AncientMariner";isMatch=(title=="ANCIENTAMRINER");isMatch=(title.ToUpper()=="ANCIENTMARINER");isMatch=title.Equals("AncientMariner");变量的常见用法C#中常用的字符串处理方法:Equals():比较两个字符串的值是否相等ToLower():将字符串转换成小写形式IndexOf():查找某个字符在字符串中的位置SubString():从字符串中截取子字符串Join():连接字符串Split():分割字符串Trim():去掉字符串两边的空格……变量的常见用法实例将一文件名的扩展名改为.dat。例:1.txt改为1.datusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespace_011{classProgram{staticvoidMain(string[]args){stringfilename=@"1.2.txt";intindexDot=filename.LastIndexOf('.');stringextendName="dat";filename=filename.Substring(0,indexDot+1);filename+=extendName;Console.WriteLine(filename);}}}变量的常见用法已有如下代码,按要求增加功能:staticvoidMain(string[]args){stringemail;//电子邮件地址
Console.WriteLine("请输入你的邮箱:");email=Console.ReadLine();Console.WriteLine("你的邮箱是
{0}",email);}需实现的功能:1、输入yes时,程序循环执行2、兼容以下各种形式yes(YES、yes、YeS…..)3、提取邮箱的用户名变量的常见用法usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespace_011{classProgram{staticvoidMain(string[]args){
while(1){stringemail;//电子邮件地址Console.WriteLine("请输入你的邮箱:");email=Console.ReadLine();Console.WriteLine("你的邮箱是{0}",email);Console.WriteLine("继续输入邮箱吗?");stringinput=Console.ReadLine();if(input.ToUpper()=="YES")continue;elsebreak;}}}}while(true)变量的常见用法String常用方法应用2输入一个字符串,输出每个单词,重新用下划线连接输出使用Split()方法分割字符串使用Join()方法连接字符串变量的常见用法Split()方法——分割字符串代码分析splitStrings=inputString.Split('');//将分割后的字符串使用下划线连接在一起joinString=string.Join("_",splitStrings);返回值为字符串数组字符串变量名参数:分隔符(char型)返回字符串静态方法参数1:连接符参数2:字符串数组关键代码:Join()方法——连接字符串变量的常见用法usingSystem;classProgram{staticvoidMain(string[]args){stringinputString;inputString=Console.ReadLine();
inputString=inputString.Trim();string[]splitStrings=inputString.Split('');stringjoinString=string.Join("_",splitStrings);Console.WriteLine(joinString);}}如果字符串两边有空格?变量的常见用法Format()方法两种输出字符串的方式:stringname="李四";Console.WriteLine("Mynameis"+name+",Iam"+18);stringname="李四";Console.WriteLine("Mynameis
{0},Iam{1}",name,18);格式字符串变量列表变量的常见用法String类的Format()方法用来格式化字符串关键代码:record=string.Format("姓名:{0}\n出生年月:{1}\n身高:{2}\n
血型:{3}\n星座:{4}\n最喜欢的食物:{5}",name,birthday,height,bloodType,planet,favourFood);Console.WriteLine("\n这是你的个人档案:");Console.WriteLine(record);参数与WritLine()方法相似变量的常见用法Format()的语法小结stringmyString=string.Format("格式字符串",参数列表);stringmyString=string.Format("{0}乘以
{1}等于
{2}",2,3,2*3);格式字符串代表参数列表2乘以3等于6包括占位符{x}变量的常见用法补充下划线处的占位符,输出五个成语stringyi="一";stringer="二";stringsan="三";stringword=string.Format("独
_无
_,_心
_意,垂涎
_尺,略知
__,举_反
_",
yi,er,san);Console.WriteLine(word);stringyi="一";stringer="二";stringsan="三";stringword=string.Format("独{0}无{1},{2}心{1}意,垂涎{2}尺,略知{0}{1},举{0}反{2}",
yi,er,san);Console .WriteLine(word);变量的常见用法示例数组任务5数组数组是同一数据类型的一组值数组属于引用类型,因此存储在堆内存中数组元素初始化或给数组元素赋值都可以在声明数组时或在程序的后面阶段中进行
语法:数据类型[,…]数组名称=new类型[n,…];
int[]arrayHere=newint[6];数组staticvoidMain(string[]args){
intcount;
Console.WriteLine(“请输入准备登机的乘客人数");
count=int.Parse(Console.ReadLine());
//声明一个存放姓名的字符串数组,其长度等于乘客人数
string[]names=newstring[count];
//用一个for循环来接受姓名
for(inti=0;i<count;i++) {
Console.WriteLine(“请输入第{0}个乘客的姓名",i+1);
names[i]=Console.ReadLine(); }
Console.WriteLine(“已登机的乘客有:");
//用foreach循环显示姓名
foreach(stringdispinnames) {
Console.WriteLine("{0}",disp); }}数组声明初始化数组元素的循环显示输出的循环一维数组和多维数组都属于矩形数组,而C#所特有的不规则数组是数组的数组,在它的内部,每个数组的长度可以不同,就像一个锯齿形状。(1)不规则数组的声明语法形式:type[][][]arrayName;方括号[]的个数与数组的维数相关。例如:int[][]jagged;//jagged是一个int类型的二维不规则数组(2)创建数组对象以二维不规则数组为例:3.不规则数组值类型和引用类型任务6C#的基本数据类型C#中的数据类型分为两个基本类别
值类型表示实际数据只是将值存放在内存中值类型都存储在堆栈中int、char、结构引用类型表示指向数据的指针或引用包含内存堆中对象的地址为null,则表示未引用任何对象类、接口、数组、字符串C#的基本数据类型staticvoidMain(string[]args){
//声明一个值类型的整型数据类型
intvalue=130;
Console.WriteLine("该变量的初始值为{0}",value);
Test(value);
//由于该数据类型属于值类型,所以将恢复其初始值
Console.WriteLine("该变量的值此时为{0}",value);
}staticvoidTest(intbyVal){
intt=20;
byVal=t*30;}将value的初始值传递给Test()方法不反映已经改变的val值,而保留原始值C#的基本数据类型staticvoidMain(string[]args){ DataTypeobjTest=newDataType(); objTest.Value=130; //传递属于引用类型的对象 Test(objTest); //由于该数据类型属于引用类型,所以会考虑新处理的值 Console.WriteLine("变量的值为{0}",objTest.Value);}staticvoidTest(DataType
data){ intt=20; data.Val=temp*30;}将DataTypeTest
的引用传递给Test()
被传递的value在Test()中改变反映已经改变的value值classDataType{publicintValue;}引用类型和值类型引用类型和值类型的内存分配值类型存储在运行栈,引用类型存储在托管堆ApparelmyApparel=newApparel();ApparelmyApparel1=myApparel;ClassApparel{publicdoublePrice=250.0;publicstringFabType=“Syn”;}栈托管堆装箱与拆箱装箱即将值类型转换为引用intage=17;ObjectrefAge=age拆箱即将引用类型转换为值类型。intnewAge=(int)refAge;doublenewAge=(double)refAge;//错误,要具有相同类型运算符和表达式任务7运算符和表达式类别运算符说明表达式算术运算符+执行加法运算(如果两个操作数是字符串,则该运算符用作字符串连接运算符,将一个字符串添加到另一个字符串的末尾)操作数1+操作数2-执行减法运算操作数1-
操作数2*执行乘法运算操作数1*
操作数2/执行除法运算操作数1/
操作数2%获得进行除法运算后的余数操作数1%
操作数2++将操作数加1操作数++或++操作数--将操作数减1操作数--
或--操作数~将一个数按位取反
~操作数运算符和表达式类别运算符说明表达式三元运算符(条件运算符)?:检查给出的第一个表达式expression是否为真。如果为真,则计算operand1,否则计算operand2。这是唯一带有三个操作数的运算符
表达式?操作数1:操作数2运算符和表达式类别运算符说明表达式比较运算符>检查一个数是否大于另一个数
操作数1>操作数2<检查一个数是否小于另一个数
操作数1<
操作数2>=检查一个数是否大于或等于另一个数
操作数1>=
操作数2<=检查一个数是否小于或等于另一个数
操作数1<=
操作数2==检查两个值是否相等
操作数1==
操作数2!=检查两个值是否不相等操作数1!=
操作数2运算符和表达式类别运算符说明表达式成员访问运算符.用于访问数据结构的成员数据结构.成员赋值运算符=给变量赋值操作数1=操作数2逻辑运算符&&对两个表达式执行逻辑“与”运算
操作数1&&
操作数2||对两个表达式执行逻辑“或”运算操作数1||
操作数2!对两个表达式执行逻辑“非”运算!操作数()将操作数强制转换为给定的数据类型
(数据类型)操作数运算符和表达式9-6赋值运算符(=)变量=表达式;例如:身高=177.5;体重=78;性别=“m”;运算符和表达式9-7一元运算符(++/--)Variable
++;
相当于
Variable=Variable+1;Variable
--;
相当于
Variable=Variable-1;运算符和表达式运算符计算方法表达式求值结果(设X=10)+=运算结果=操作数1+操作数2X+=2X=X+212-=运算结果=操作数1-操作数2X-=2X=X-28*=运算结果=操作数1*操作数2X*=2X=X*220/=运算结果=操作数1/操作数2X/=2X=X/25%=运算结果=操作数1%操作数2X%=2X=X%20运算符和表达式C#运算符的优先级优先级说明运算符结合性1括号()从左到右2自加/自减运算符++/--从右到左3乘法运算符除法运算符取模运算符*/%从左到右4加法运算符减法运算符+-从左到右5小于小于等于大于大于等于<<=>>=从左到右6等于不等于=!=从左到右从左到右7逻辑与&&从左到右8逻辑或||从左到右9赋值运算符和快捷运算符=+=*=/=%=-=从右到左控制结构任务8选择结构语法:
if(<条件>)
{
<语句块>
}
else
{
<语句块>
}选择结构用于根据表达式的值执行语句if…else条件:只能是bool类型(布尔类型)的值选择结构switch(“cotton”){ case“COTTON”: case“cotton”:
… break;
case值3:
case值4: …break;}switch…case表达式可以是int、字符或字符串C#不允许从一个case块继续执行到下一个case块。每个case块必须以一个跳转控制语句break、goto或return结束多个case标签可以对应一个代码块循环结构循环结构用于对一组命令执行一定的次数或反复执行一组命令,直到指定的条件为真。循环结构的类型while循环do循环for循环foreach循环条件:只能是bool类型的值while循环反复执行指定的语句,直到指定的条件为真语法:while(条件){//语句}break语句可用于退出循环continue
语句可用于跳过当前循环并开始下一循环while循环do…while循环
do…while循环与while循环类似,二者区别在于do…while循环中即使条件为假时也至少执行一次该循环体中的语句。语法:
do{//语句}while(条件)for循环for循环要求只有在对特定条件进行判断后才允许执行循环
这种循环用于将某个语句或语句块重复执行预定次数的情形语法:for(初始值;
条件;增/减){//语句}foreach循环2-1foreach循环用于遍历整个集合或数组语法:
foreach(数据类型元素(变量)in集合或者数组)
{
//语句
}foreach循环2-2staticvoidMain(string[]args){
//存放字母的个数
intLetters=0;
//存放数字的个数
intDigits=0;
//存放标点符号的个数
int
Punctuations=0;
//用户提供的输入
stringinstr;
Console.WriteLine("请输入一个字符串");
instr=Console.ReadLine();
//声明foreach循环以遍历输入的字符串中的每个字符。
foreach(charchininstr)
{
//检查字母
if(char.IsLetter(ch))
Letters++;
//检查数字
if(char.IsDigit(ch))
Digits++;
//检查标点符号
if(char.IsPunctuation(ch))
Punctuations++; }
Console.WriteLine(“字母个数为:{0}",Letters);
Console.WriteLine(“数字个数为:{0}",Digits);
Console.WriteLine(“标点符号个数为:{0}",Punctuations);}为所有计数器设置初始值接受输入对输入的每一个字符都进行循环使用了所有输入的字符之后,循环自动终止usingSystem;publicclassWriteTest{ publicstaticvoidMain() {int[]array={1,2,3,4,5};foreach(intiteminarray){Console.WriteLine(item);
} }}usingSystem;publicclassWriteTest{ publicstaticvoidMain() {int[]array={1,2,3,4,5};foreach(intiteminarray){
item+=item;
Console.WriteLine(item);} }}类和接口任务9为什么用类和接口
1、数据与方法分离
2、代码不能重用
3、代码不容易修改、扩充结构化程序设计的不足之处voidSpeedUp(int&speed){if(speed<100)++speed;}voidmain(){intspeed=0;SpeedUp(speed);}
voidmain()
{
intdoorN_car1=2;
intcolor_car1=0;
intspeed_car1=100;
printf("%d%d%d\n",doorN_car1,color_car1,
speed_car1);
intdoorN_car2=4;
intcolor_car2=1;
intspeed_car2=80;
printf("%d%d%d\n",doorN_car2,color_car2,
speed_car2);}C#的面向对象特性所有东西都是对象:变量和方法的集合。初级特性:OO最基本的概念,即类和对象。中级特性:OO最核心的概念,即封装、继承和多态。高级特性:由初级特性和中级特性引出的一些问题,如构造函数的使用、覆盖的规则、静态变量和函数等。初级特性面向对象技术最基本的概念是类和对象:– 类是一个样板,以操作、表示和算法的形式完整地定义了一组对象的行为。它通常也是面向对象语言中的模块化、封装和数据抽象的基础。– 对象是类的一个实例,是一个软件单元,它由一组结构化的数据和在其上的一组操作构成。抽象数据类型类实际上为实际的物体在计算机中定义了一种抽象数据类型。– 抽象数据类型是仅由数据类型和可能在这个数据类型上进行的操作定义的。– 使用者只能通过操作方法来访问其属性,不用知道这个数据类型内部各种操作是如何实现的。classCar{
publicintdoorN;
publicintcolor;
publicintspeed;
publicvoidSpeedUp(){speed+=10;}}classMyApp{ staticvoidMain(){ Carcar1; car1.doorN=2;car1.color=0;car1.speed=100; Carcar2; car2.doorN=4;car2.color=1;car2.speed=80; }}publicdoublespeed;面向对象程序设计—封装、代码重用类:C#所有的代码都是在某一个类中,因此不可能在类之外的全局区域有变量和方法。对象:C#中的对象相当于一块内存区域,保存对象特有的类中所定义的数据。引用:C#中对于对象的操作全部通过引用进行。
类、对象和引用的声明声明一个类:访问修饰字class类名{变量声明,方法声明}classStudent{longid;//学号
chargender;//性别
intclassID;//班级号,注意不能用class作属性名
voidChangeClass(intaClassID)//更改班级{…}
}声明一个对象引用:类名引用名Studentstudent;创建一个对象:new类构造函数student=newStudent();//如果缺少这一步编译器会报错使用对象:引用名.变量名/方法名(参数)student.id=200328013203194;引用与对象举例引用类似于C++中的对象指针。但又有区别:在C#中”引用“是指向一个对象在内存中的位置,在本质上是一种带有很强的完整性和安全性的限制的指针。当声明某个类、接口或数组类型的一个变量时,变量的值总是某个对象的引用或者是null引用。指针就是简单的地址而已,而引用除了表示地址而外,还是被引用的数据对象的缩影,可以提供其他信息。指针可以有++、--运算,引用不可以运算。publicclassFurniture{constdoublesalesTax=.065;privatedoublepurchPrice;privatestringvendor,inventoryID;publicFurniture(stringvendor,stringinventID,double
purchPrice){this.vendor=vendor;this.inventoryID=inventID;this.purchPrice=purchPrice;}publicstringMyVendor{get{returnvendor;}}publicdoubleCalcSalesTax(doublesalePrice){returnsalePrice*salesTax;}}类声明常量字段构造函数成员属性方法类的成员类成员的可访问性类或结构的默认访问类型是internal。类中所有的成员,默认均为private。classFurniture{constdoublesalesTax=.065;privatedoublepurchPrice;privatestringvendor,inventoryID;publicFurniture(stringvendor,stringinventID,double
purchPrice){this.vendor=vendor;this.inventoryID=inventID;this.purchPrice=purchPrice;}publicstringMyVendor{get{returnvendor;}}publicdoubleCalcSalesTax(doublesalePrice){returnsalePrice*salesTax;}}internalprivate类成员的可访问性classMyApp{staticvoidMain(){Furnituref=newFurniture("aaa","001",1.2);
Console.WriteLine(f.salesTax);Console.WriteLine(Furniture.salesTax);f.purchPrice=10;stringstr=f.MyVendor;}}错误类成员的可访问性示例构造函数构造函数是一种用于对象初始化的特殊方法,有以下特点。
–构造函数只能在对象创建时调用,即和new运算符一起被调用。
–构造函数和类具有相同的名字。
–构造函数可以有0个、1个或多个参数。
–构造函数没有返回值。
–每个类至少有一个构造函数,一个类可以有多个构造函数。
–如果没有为类定义构造函数,系统会自动为其定义一个缺省的构造函数。缺省构造函数不带参数,作用是将实例变量都清零。
–一旦为类定义了构造函数,则系统不会再为其定义缺省构造函数。C#中构造函数有三种:实例构造,私有构造和静态构造创建对象与构造函数类声明后,可以创建类的实例,即对象。创建类的实例需要使用new关键字。类的实例相当于一个变量,创建类实例的格式如下:类名对象名=new构造函数(参数类表);例如:PointmyPoint=newPoint();类的构造函数可通过初始值设定项来调用基类的构造函数,例如:publicStudent(stringno,stringname,charsex,intage):base(name,sex,age){…}类的构造函数也可通过关键字this调用同一个类的另一个构造函数,例如:publicPoint():this(0,20){…}构造函数举例classStudent{longid;chargender;intclassID;publicStudent():this(0,'F',0){}publicStudent(longaID,charaGender,intaClassID){id=aID;gender=aGender;classID=aClassID;}}私有构造函数在某些特殊的情况下,使用私有构造函数能够达到意想不到的效果。比如,想建立这样一个类:不允许被其他类实例化,但提供对外的静态接口成员。在.NET框架类库中就存在这样的类,如System.Math类就不能够实例化,它的所有成员都是静态的。用关键字private修饰的构造函数就是私有构造函数。析构函数C#支持析构函数。虽然C#能够自动进行垃圾回收,但对于某些资源,.Net不知道如何回收,所以需要人工的内存回收。在.net编程环境中,系统的资源分为托管资源和非托管资源。–托管资源,如简单的int,string,float,DateTime等等,是不需要人工干预回收的。–非托管资源,例如文件,窗口或网络连接,对于这类资源虽然垃圾回收器可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。在使用完之后,必须显式的释放他们,否则会占用系统的内存和资源,而且可能会出现意想不到的错误。.net中超过80%的资源都是托管资源。析构函数与Finalize.NETFramework提供Object.Finalize方法,默认情况下,Finalize方法不执行任何操作。如果需要可以覆盖Finalize方法。通过析构函数可以自动生成Finalize方法和对基类的Finalize方法的调用。publicclassChair{publicChair(){...}~Chair(){...}
voidFinalize(){…}}如果试图既编写析构函数又编写Finalize方法,将导致编译器出错。析构函数Dispose方法意义销毁对象销毁对象调用方式不能被显示调用,在GC回收是被调用需要显示调用或者通过using语句调用时机不确定确定,在显示调用或者离开using程序块非托管资源:Dispose方法对象析构举例•Dispose方法是编程人员需要立即释放资源时调用,所以在Dispose方法中调用Close,并通知GC在回收垃圾时不需要再释放资源。•析构函数是编程人员在没有调用Dispose方法释放资源的情况下由GC在回收垃圾时调用。1.一般不要提供析构函数,因为它不能及时地被执行;2.实现Dispose方法的时候,一定要加上“GC.SuppressFinalize(this)”语句。usingSystem;classMyFile{publicMyFile(){//…OpenFile}publicvoidClose(){//…CloseFile}publicvoidDispose(){
Close();GC.SuppressFinalize(this);}~MyFile(){Close();}}classMyApp{publicstaticvoidMain(){MyFilefile=newFile();...file.Dispose();}}问题:–用Student对象保存学生信息,希望每个对象有一个单独的编号。第一个创建的对象编号为0,第二个对象编号为1,以此类推。–这就需要有一个所有Student对象都能访问的变量counter,而且变量counter在所有实例中共享。当一个对象创建时,构造函数增加counter值,下一个对象创建时使用增加过的值。解决方法:–C#编程语言没有这样的全局变量,但类变量是可以从类的任何实例访问的单个变量。–类变量在某种程度上与其它语言中的全局变量相似。但仅限于同类型的对象访问。类中的静态问题静态变量类变量是在所有类的实例(对象)中共享的变量,在变量声明中用static关键字表示。类变量可以被标记为public或private。如果被标记为public,不需要类的实例就可以访问。publicclassStudent{privateintserialNumber;
privatestaticintcounter=0;publicStudent(){serialNumber=counter;counter++;}}classMyApp{staticvoidMain(){Studentstu=newStudent();Console.WriteLine(stu.serialNumber);Studentstu1=newStudent();Console.WriteLine(stu1.serialNumber);}}静态方法类方法是不需要类的任何实例就可以被调用的方法,在方法声明中用static关键字表示。类方法只能访问静态变量,访问非静态变量的尝试会引起编译错误。静态方法不能被覆盖成非静态的。main是静态的,因为它必须在任何实例化发生前被访问,以便应用程序的运行。publicclassGeneralFunction{publicstaticintAddUp(intx,inty){//静态方法
returnx+y;}}publicclassUseGeneral{publicvoidmethod(){intc=GeneralFunction.AddUp(9,10);//调用静态方法
System.Console.WriteLine("addUp()gives"+c);}
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 陕西艺术职业学院《专题设计1》2023-2024学年第一学期期末试卷
- 装运垃圾合同范例
- 抽水合同范例
- 2024至2030年内热式电烙铁项目投资价值分析报告
- 政府采购临时采购合同范例
- 陕西铁路工程职业技术学院《教师职业道德与教育法律法规》2023-2024学年第一学期期末试卷
- 灯具拆除服务合同范例
- 贸易用工合同范例
- 2024年贴面刨花板项目可行性研究报告
- 正规临时聘用合同范例
- 2024版国开电大专科《ECEL在财务中的应用》在线形考(形考作业一至四)试题及答案
- 英国文学史及选读试题及答案
- 新国际政治学概论(第三版)-教学课件-陈岳-109503国际政治学概论(第三版)
- 知识产权维权授权书
- 焊接工艺优化与提高焊接效率
- 整理收纳师职业规划
- 工商管理就业去向分析报告
- 2024年度医院心胸外科护士长述职报告课件
- (期末押题最后一卷)期末综合测试预测卷-2023-2024学年六年级上学期科学高频易错期末提高必刷卷(苏教版)
- 博鳌机场控制区证件培训试题 C
- 剪映专业版使用方法教程大全
评论
0/150
提交评论