您好,欢迎访问三七文档
C#基础知识点1、数据类型1.1、值类型、引用类型1.2、预定义类型1.3、类型转换1.4、装箱和拆箱2、变量、常量2.1、变量2.2、常量3、运算符和表达式3.1、运算符、表达式3.2、特殊运算符3.3、优先级别4、流程控制4.1、条件语句4.2、循环语句4.3、跳转语句4.4、异常处理5、程序结构5.1、类5.2、命名空间5.3、Main方法6、程序例子7、作业一数据类型1.1值类型、引用类型C#的数据类型可以分成两大部分:值类型和引用类型。值类型的变量总是直接包含着自身的数据,而引用类型的变量是指向实际数据的地址。C#值类型包括:整型、布尔型、实型、十进制型、结构和枚举、接口和数组。从概念上看,其区别是值类型直接存储其值,而引用类型存储对值的引用。这两种类型存储在内存的不同地方:值类型存储在堆栈中,而引用类型存储在托管堆上。注意区分某个类型是值类型还是引用类型,因为这种存储位置的不同会有不同的影响。例如,int是值类型,这表示下面的语句会在内存的两个地方存储值20://i和j都是整型变量i=20;j=i;但考虑下面的代码。这段代码假定已经定义了一个类class1,class1是一个引用类型,它有一个int类型的成员变量Value:class1x,yx=newclass1();x.Value=30;y=x;Console.WriteLine(y.Value);//输出30y.Value=50;Console.WriteLine(x.Value);//输出50要理解的重要一点是在执行这段代码后,只有一个class1对象。x和y都指向包含该对象的内存位置。因为x和y是引用类型的变量,声明这两个变量只是保留了一个引用——而不会实例化给定类型的对象。因为x和y引用同一个对象,所以对x的修改会影响y,反之亦然。因此上面的代码会显式30和50。如果变量是一个引用,就可以把其值设置为null,确定它不引用任何对象:y=null;在C#中,基本数据类型如bool和long都是值类型。如果声明一个bool变量,并给它赋予另一个bool变量的值,在内存中就会有两个bool值。如果以后修改第一个bool变量的值,第二个bool变量的值也不会改变。这些类型是通过值来复制的。相反,大多数更复杂的C#数据类型,包括我们自己声明的类都是引用类型。它们分配在堆中,其生存期可以跨多个函数调用,可以通过一个或几个别名来访问。CLR(CommonLanguageRuntime公共语言运行库指.NET的运行时支持,包括一个面向对象类型系统和一些运行时服务)执行一种精细的算法来跟踪哪些引用变量仍是可以访问的,哪些引用变量已经不能访问了。CLR会定期进行清理,删除不能访问的对象,把它们占用的内存返回给操作系统。这是通过垃圾收集器实现的。1.2预定义类型C#认可的基本预定义类型并没有内置于语言中,而是内置于.NETFramework中。例如,在C#中声明一个int类型的数据时,声明的实际上是.NET结构System.Int32的一个实例。C#支持两个预定义的引用类型,如下表:CTS:公共类型系统名称CTS类说明ObjectSystem.Object根类型,其他类型都是从它派生而来的(包括值类型)StringSystem.StringUnicode字符串1.object类型在C#中,object类型就是最终的父类型,所有内在和用户定义的类型都从它派生而来。这是C#的一个重要特性,object类型就可以用于两个目的:●可以使用object引用绑定任何特定子类型的对象。●object类型执行许多基本的一般用途的方法,包括Equals()、GetHashCode()、GetType()和ToString()。用户定义的类可能需要使用一种面向对象技术——重写,提供其中一些方法的替代执行方法。例如,重写ToString()时,要给类提供一个方法,该方法可以提供类本身的字符串表示。如果类中没有提供这些方法的实现,编译器就会在对象中选择这些实现,它们在类中的执行不一定正确。2.string类型C#有string关键字,在翻译为.NET类时,它就是System.string。有了它,像字符串连接和字符串复制这样的操作就很简单了:stringstr1=Hello;stringstr2=World;stringstr3=str1+str2;//字符串连接尽管这是一个值类型的赋值,但string是一个引用类型。String对象保留在堆上,而不是堆栈上。因此,当把一个字符串变量赋给另一个字符串时,会得到对内存中同一个字符串的两个引用。但是,string与引用类型在常见的操作上有一些区别。例如,修改其中一个字符串,注意这会创建一个全新的string对象,而另一个字符串没有改变。考虑下面的代码:usingSystem;classStringExample{publicstaticintMain(){strings1=astring;strings2=s1;Console.WriteLine(s1is+s1);Console.WriteLine(s2is+s2);s1=anotherstring;Console.WriteLine(s1isnow+s1);Console.WriteLine(s2isnow+s2);return0;}}其输出结果为:s1isastrings2isastrings1isnowanotherstrings2isnowastring换言之,改变s1的值对s2没有影响,这与我们期待的引用类型正好相反。1.3类型转换1.隐式转换隐式转换就是系统默认的、不需要加以声明就可以进行的转换。隐式转换一般不会失败,转换过程中也不会导致信息丢失。隐式转换包括下面几种:2.显式转换显式类型转换,就是强制类型转换。与隐式转换正好相反,显式转换需要用户明确指定转换的类型,不如看下面例子:longl=5000;intI=(int)l;显式转换可以发生在表达式的计算过程中。它并不是总能成功,而且常常可能引起信息丢失。显式转换包括所有的隐式转换。显式转换包括下面几种:1.4装箱和拆箱装箱和拆箱使我们可以把一个值类型当作一个引用类型看待。装箱转换是指将一个值类型隐式的转换成一个Object类型,拆箱转换是指将一个Object类型显式地转换成一个值类型,他们互为逆过程。装箱(boxing)装箱转换是指将一个值类型隐式转换成一个object类型,或者把这个值类型转换成一个被该值类型应用的接口类型。把一个值类型的值装箱,也就是创建一个object实例并将这个值给这个objet.不如:Inti=10;Objectobj=i;拆箱(unboxing)拆箱转换是指将一个对象类型显式转换成一个值类型,或是将一个接口类型显示地转换成一个执行该接口的值类型。拆箱的过程分为两步:首先,检查这个对象的实例,看它是否为给定的值类型的装箱值。然后,把这个实例的值拷贝给值类型的变量。如:Inti=10;Objectobj=i;Intj=(int)obj;二变量、常量2.1、变量在C#中声明变量使用下述语法:datatypeidentifier;例如:inti;一旦它被声明之后,就可以使用赋值运算符(=)给它分配一个值:i=10;还可以在一行代码中声明变量,并初始化它的值:inti=10;如果在一个语句中声明和初始化了多个变量,那么所有的变量都具有相同的数据类型:intx=10,y=20;要声明类型不同的变量,需要使用单独的语句。在多个变量的声明中,不能指定不同的数据类型:intx=10;booly=true;intx=10,booly=true;//这样编译报错1.变量的初始化变量的初始化是C#强调安全性的另一个例子。简单地说,C#编译器需要用某个初始值对变量进行初始化,之后才能在操作中引用该变量。大多数现代编译器把没有初始化标记为警告,但C#编译器把它当作错误来看待。这就可以防止我们无意中从其他程序遗留下来的内存中获取垃圾值。C#有两个方法可确保变量在使用前进行了初始化:●变量是类或结构中的字段,如果没有显式进行初始化,在默认状态下当创建这些变量时,其值就是0。●方法的局部变量必须在代码中显式初始化,之后才能在语句中使用它们的值。此时,初始化不是在声明该变量时进行的,但编译器会通过方法检查所有可能的路径,如果检测到局部变量在初始化之前就使用了它的值,就会产生错误。同样的规则也适用于引用类型。考虑下面的语句:SomethingobjSomething;在C#中,这行代码仅会为Something对象创建一个引用,但这个引用还没有指向任何对象。对该变量调用方法或属性会导致错误。在C#中实例化一个引用对象需要使用new关键字。如上所述,创建一个引用,使用new关键字把该引用指向存储在堆上的一个对象:objSomething=newSomething();//ThiscreatesaSomethingontheheap2.变量的作用域变量的作用域是可以访问该变量的代码区域。一般情况下,确定作用域有以下规则:●只要字段所属的类在某个作用域内,其字段(也称为成员变量)也在该作用域内局部变量存在于表示声明该变量的块语句或方法结束的封闭花括号之前的作用域内。●在for、while或类似语句中声明的局部变量存在于该循环体内。局部变量的作用域冲突大型程序在不同部分为不同的变量使用相同的变量名是很常见的。只要变量的作用域是程序的不同部分,就不会有问题,也不会产生模糊性。但要注意,同名的局部变量不能在同一作用域内声明两次,所以不能使用下面的代码:intx=20;//其它代码intx=30;字段和局部变量的作用域冲突在某些环境下,可以区分名称相同(尽管不是经过完全限定的名称)、作用域相同的两个标识符。此时编译器允许声明第二个变量。原因是C#使得变量之间有一个基本的区分,它把声明为类型级的变量看作是字段,而把在方法中声明的变量看作局部变量。2.2、常量在声明和初始化变量时,在变量的前面加上关键字const,就可以把该变量指定为一个常量。顾名思义,常量是其值在使用过程中不会发生变化的变量:constinta=100;//变量的值不能改变C#中只能把局部变量和字段声明为常量。常量具有如下特征:●常量必须在声明时初始化。指定了其值后,就不能再修改了。●常量的值必须能在编译时用于计算。因此,不能用从一个变量中提取的值来初始化常量。如果需要这么做,应使用只读字段。●常量用易于理解的清楚的名称替代了“含义不明确的数字或字符串”,使程序更易于阅读。●常量使程序更易于修改。例如,在C#程序中有一个SalesTax常量,该常量的值为6%。如果以后销售税率发生变化,可以把新值赋给这个常量,就可以修改所有的税款计算,而不必查找整个程序,修改税率为0.06的每个项。●常量更容易避免程序出现错误。如果要把另一个值赋给程序中的一个常量,而该常量已经有了一个值,编译器就会报告错误。三运算符和表达式3.1、运算符、表达式算术操作符和算术表达式+加法操作符-减法操作符*乘法操作符/除法操作符%求余法操作符例:加法表达式EnumWeekday{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};Weekdayday1=weekday.Sunday;Weekdayday2=day1+2;Console.WriteLine(day2);结果是:Tuesday赋值运算符=+=-=*=/=&=^====是最简单的赋值运算符,其它的是复合赋值,X+=5等价于X=X+5;关系运算符==等于!=不等于小于大于=小于等于=大于等于Is运算符Is元算符被用于动态的检查运行时对象类型是否和给定的类型兼容。运算“eisT”的结果,其中,e是一个表达式,T是一个类型,返回值是一个布尔值。它表示,e是否能通过引用转换,装箱转换,成功的转换于T类型。如:1isint结果是:trueAs操作符As操作符通过引用转换或装箱转换将
本文标题:C#基础知识点
链接地址:https://www.777doc.com/doc-7515340 .html