基础
.NET概述
参考:http://www.cnblogs.com/yplong/p/3279934.html
什么是.NET框架
.NET框架(.NET
Framework)是由微软开发,一个软件开发平台。
.NET框架是以一种采用系统虚拟机运行的编程平台,以公共语言运行时(Common Language Runtime)为基础,支持多种语言(C#、VB.NET、C++、Python等)的开发。
.NET Framework具有两个主要组件:公共语言运行库和.NET Framework类库。
.NET框架结构图
语言
Visual Studio .NET自身包含四种语言:Visual
Basic、Visual C++、Visual C#和JScript。然而,.NET框架的模块化特性使得由第三方创作的其他语言也可以集成到Visual Studio .NET中。此类语言有20多种,包括Perl、Component Pascal、SmallScript和Smalltalk。
公共语言规范
此规范是实现.NET框架的所有语言的基础,定义了公共类型系统的标准和所有语言必须实现的功能。这是第三方语言与框架集成的基础。
Windows窗体
所有语言都共享公共Windows窗体引擎。窗体设计器在所有语言中都是一致的,因此所有语言都可以访问提供相同属性和方法的相同固有控件。即使使用不同的语言开发,其界面也都具有相同的外观。
ASP.NET
这是Web窗体和XML Web services的基础技术。Web窗体用于前端Web开发,而XML Web services通过Intranet或Internet提供相应的功能。
数据管理
ADO.NET代替ADO作为.NET框架中的数据处理机制,它是使用XML进行数据传输的高度可伸缩技术。
基类库
这些类提供了一致且易于使用的方法,用于访问各种信息(例如,系统信息、用户信息等),而以前要访问这些信息,必须使用特殊的组件或API。
公共语言运行时(CLR)
CLR为编译器提供了托管执行环境和编译服务。CLR编译器将源代码编译成中间语言(IL),然后再以实时(JIT)方式执行IL。所有源语言都共享CLR,并编译成相同的IL。
什么是公共语言架构
通用语言架构(Common Language Infrastructure,简称CLI)是一个开放的技术规范。
CLI有时候会和CLR混用。但严格意义上说,这是错误的。因为CLI是一种规范,而CLR则是对这种规范的一个实现。
CLI标准包包含以下更详细的规范
l通用类型系统(CommonType System, CTS)
l元数据系统(Metadata)
l通用语言规范(CommonLanguage Specification, CLS)
l虚拟执行系统(VirtualExecution System, VES)
l通用中间语言(CommonIntermediate Language, CIL)
l框架(Framework)
适合CLI规范的程序都会被编译成通用中间语言(CIL),一种特殊的字节代码。而不是能直接在你的电脑上运行的机器码。
什么是公共语言运行时
通用语言运行库(Common
Language Runtime,简称CLR)是微软为他们的.NET的虚拟机所选用的名称。这是通用语言架构(简称CLI)的微软实现版本,它定义了一个代码运行的环境。CLR运行一种被称为通用中间语言的字节代码,这个是微软的通用中间语言的实现版本。
CLR的主要功能如下
l基类库支持BaseClass Libray Support
l存储器管理MemoryManagement
l线程管理ThreadManagement
l存储器自动回收Garbage Collection
l安全性Security
l类型检查TypeChecker
l例外管理Exception Manager
l除错管理DebugEngine
l中间码(MSIL)到机器码(Native)编译
l类型装载ClassLoader
开发人员使用高级编程语言撰写程序。接下来编译器将代码编译成微软的中间语言(CIL)。之后在执行过程中CLR会将CIL编译为操作系统的原生码(Native code)从而执行。CLR自带有实时编译器(JIT)。
CLR运行在windows上。查看通用语言架构可以找到该规格的实现版本列表。其中有一些版本是运行在非Windows的操作系统中。
什么是中间语言
通用中间语言(Common Intermediate Language,简称CIL,原名叫做MSIL)是一种属于公共语言规范和.NET框架的低阶(lowest-level)的人类可读的编程语言,一种特殊的字节代码。CIL类似一个面向对象的汇编语言,并且它是完全基于堆栈的。面向.NET框架的语言都会被各自的编译器编译为中间语言(CIL),运行时再经由特定的编译器(JIT编译器,Just In tIME,JITer)编译为机器代码,以供操作系统执行。
什么是托管代码
所有.NET语言都可以编写面向CLR的程序代码,这种代码在.NET中被称为托管代码(Managed
Code),所有的Managed Code都直接运行在CLR上
简单点说就是:所有运行在CLR上的代码就叫做托管代码,具有与平台无关的特性。
什么是程序集
程序集:顾名思义就是一个集合。
其中包括了:
l程序清单
描述了程序集的版本,语言文化,发布者,共有导出类型,以及组成该程序集的所有文件。
l元数据
提供有关程序集中定义的类型的信息,包括类型的名称,可见性,基类和类型所实现的接口。注意:程序集清单和元数据说明了程序集是自我描述的。
lCIL:中间语言
l资源集:诸如位图,指针,静态文本等。
程序集有两种:
一种是可执行的应用程序文件(.exe扩展名文件)
一种是供其他应用程序使用的库(.dll扩展名文件)
编译器生成的中间语言(CIL)就被封装在程序集中,该程序集中包含了描述你所创建的类,方法和属性(例如安全需求)的所有元数据。你可以拷贝这个程序集到另一台服务器上部署它。
C#与.NET的关系
C#是一个程序设计语言,仅仅是一个语言,是.NET框架中众多开发语言中的一种。
C#程序的开发执行流程
1)编写C#源程序(.cs)
2)通过编译器编译生成(.dll或.exe)
3)通过CLR运行,将CIL实时编译编译为机器码,运行
HelloWorld案例的编写和运行
(1)定义类
(2)写main方法
(3)写输出语句
(4)C#程序开发运行与工作原理
(5)编译和运行程序
---------------------------------------------------------------------------
classHelloWorld {
public static void Main(string[] args) {
Console.WriteLine("HelloWorld");
}
}
---------------------------------------------------------------------------
(1)程序解释:
A:C#程序的最基本单位是类,所以我们要定义一个类。
格式:class类名
举例:classHelloWorld
B:在类中写内容的时候,用大括号括起来。
C:C#程序要想执行,必须有Main方法。
格式:publicstatic void Main(String[] args)
D:要指向那些东西呢,也用大括号括起来。
E:你要做什么呢?今天我们仅仅做了一个简单的输出
格式:Console.WriteLine("HelloWorld");
注意:""里面的内容是可以改动的。
常见的问题
lC#语言严格区分大小写,请注意。
l见到非法字符:
\65307肯定是中文问题。我们写程序要求标点符号必须全部是英文状态。
l括号的配对问题。一般来说,括号都是成对出现的。
l遇到在类HelloWorld中找不到主方法,肯定是主方法的格式问题。
标识符
1)就是给类,接口,方法,变量等起名字时使用的字符序列
2)组成规则:
A.英文字母
B.数字
C.下划线(_)
3)注意事项
A.不能包含空格和其他字符
B.不能以数字开头
C.不能是C#中的关键字
D.区分大小写
4)常见的命名规则
A.命名空间
单级命名空间:首字母大写
举例:System
多级命名空间:每个单词首字母大写(驼峰),并用.隔开
举例:System.Text
B.类或者接口
一个单词:首字母大写
举例:Console
多个单词:每个单词首字母大写(驼峰)
举例:HelloWorld,StudentName
C.变量
一个单词:小写
举例:num
多个单词:第一个单词小写,从第二个单词开始,每个单词首字母大写
举例:myName
D.属性、方法
一个单词:首字母大写
举例:Name
多个单词:每个单词首字母大写
举例:GetName
E.常量
一个单词:全部大写
举例:AGE
多个单词:全部大写,并用_隔开
举例:YOUR_AGE
注释
1)就是对程序进行解释说明的文字
2)分类:
A:单行注释//
B:多行注释/**/
C:文档注释(后面讲) /** */
3)注释的作用
A:解释说明程序,提高了代码的阅读性。
B:可以帮助我们调试程序。
后面我们会讲解一个更高端的一个调试工具
常量
1)在程序执行的过程中,其值不发生改变的量
2)常量可以是任何基本数据类型
3)分类:
A:字面值常量
B:自定义常量(后面讲)
4)字面值常量
A.字符串常量"hello"
B.整数常量12,23
C.小数常量12.345
D.字符常量'a','A','0'
E.布尔常量true,false
F.空常量null(后面讲)
G.等等……
5)在C#中针对整数常量提供了四种表现形式
A.二进制由0,1组成。以0b开头。
B.八进制由0,1,...7组成。以0开头。
C.十进制由0,1,...9组成。整数默认是十进制。
D.十六进制由0,1,...9,a,b,c,d,e,f(大小写均可)组成。以0x开头。
进制转换(了解)
1)其他进制到十进制s
系数:就是每一个位上的数值
基数:x进制的基数就是x
权:对每一个位上的数据,从右,并且从0开始编号,对应的编号就是该数据的权。
结果:系数*基数^权次幂之和。
2)十进制到其他进制
除基取余,直到商为0,余数反转。
3)进制转换的快速转换法
A.十进制和二进制间的转换
8421码。
128、64、32、16、8、4、2、1
B.二进制到八进制,十六进制的转换
原码反码补码(了解)
1)为什么要学习原码反码补码?
后面要学习强制类型转换,如果不知道有原反补会看不懂结果
2)有符号数据表示法的几种方式
A.原码
就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
通过一个字节,也就是8个二进制位表示+7和-7
0(符号位)0000111
1(符号位)1000111
B.反码
正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
C.补码
正数的补码与其原码相同;负数的补码是在其反码的末位加1。
3)练习
A.已知原码求补码
0b10110100
B.已知补码求原码
0b11101110
变量
1)在程序的执行过程中,其值在某个范围内可以发生改变的量
2)变量的定义格式:
A.数据类型变量名=初始化值;
B.数据类型变量名;
变量名=初始化值;
3)使用变量的注意事项:
A.作用域
变量定义在哪一级大括号中,哪个大括号的范围就是这个变量的作用域。相同的作用域中不能定义两个同名变量。
B.初始化值
局部变量在使用之前必须赋值
C.一条语句可以定义多个变量(不建议)
inta,b,c...;
数据类型
首先要了解一点:C#认可的基础数据类型并没有内置于C#语言中,而是内置于.net Framework中(CTS)。
如,在c#中声明一个int类型的数据时,声明的实际上是.net结构System.Int32的一个实例。这听起来似乎很深奥,但其意义深远:这表示在语法上,可以把所有的基础数据类型看作是支持某些方法的类。
类型实际上仍存储为基本类型。基本类型在概念上用.Net结构表示,所以肯定没有性能损失。
1)C#是一种强类型语言,针对每种数据都提供了对应的数据类型,在内存中分配了不同大小的内存空间
2)分类:
A.基本数据类型:4类8种
B.引用数据类型:string,Dynamic,类,接口,数组,指针。
3)基本数据类型
A.整数CTS占用字节数
byteSystem.Byte1
shortSystem.Int162
intSystem.Int324
longSystem.Int648
B.浮点数
floatSystem.Single4
doubleSystem.Double8
C.字符
charSystem.Char2
D.布尔
boolSystem.Boolean1
注意:
整数默认是int类型,浮点数默认是double。
长整数要加L或者l。
单精度的浮点数要加F或者f。
4)char数据类型特点(掌握)
A.char c = (char)97;//结果为'a',char范围0到65535
B.C#语言中的字符char可以存储一个中文汉字吗?为什么呢?
可以。因为在.NET里,类型System.Char代表一个Unicode字符。
Unicode编码中的每个字符占用两个字节。中文也是占的两个字节。
所以,C#中的字符可以存储一个中文汉字。
数据类型转换
1)bool类型不参与转换
2)默认转换
A.从小到大
B.byte,short,char -- int -- long-- float -- double
C.byte,short,char之间不相互转换,直接转成int类型参与运算。其他类型进行混合运算的是小的数据类型提升为大的
3)强制转换
A.从大到小
B.可能会有精度的损失,一般不建议这样使用。
C.格式:
目标数据类型变量名= (目标数据类型) (被转换的数据);
D.例子:
int a = 10;
byte b = 20;
b = (byte)(a + b);
4)思考题和面试题:
A.下面两种方式有区别吗?
float f1 = 12.345f;
float f2 = (float)12.345;//有精度损失
B.下面的程序有问题吗,如果有,在哪里呢?
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;//byte类型的变量在进行运算的时候,会自动类型提升为int类型(报错)
byte b4 = 3 + 4;//3和4都是常量,C#有常量优化机制,就是在编译的的时候直接把3和4的结果赋值给b4了
C.下面的操作结果是什么呢?
byte b = (byte)130;//byte的范围-128-127,
JAVA里一个byte取值范围是-128~127,所以结果会是-126
而C#里一个byte取值范围是0~255,所以结果还是130
D.字符参与运算
是查找ASCII里面的值
'a'97
'A'65
'0'48
Console.WriteLine('a');//97
Console.WriteLine('a'+ 1);//98
E.字符串参与运算
这里其实是字符串的连接
Console.WriteLine ("hello" + 'a' + 1);
Console.WriteLine ('a + 1 + "hello");
Console.WriteLine ("5 + 5 = " + 5 + 5);
Console.WriteLine (5 + 5 + "= 5 + 5");
运算符
1)算术运算符
A.+,-,*,/,%,++,--
B.+的用法
a)加法
b)正号
c)字符串连接符
A./和%的区别
数据做除法操作的时候,/取得是商,%取得是余数
B.%运算符的特点
当左边的绝对值小于右边绝对值时,结果是左边
当左边的绝对值等于右边或是右边的倍数时,结果是0
当左边的绝对值大于右边绝对值时,结果是余数
%运算符结果的符号只和左边有关系,与右边无关
任何一个正整数%2结果不是0就是1可以用来当作切换条件
C.++和--的用法
a)他们的作用是自增或者自减
b)使用
**单独使用
放在操作数据的前面和后面效果一样。
a++或者++a效果一样。
**参与操作使用
放在操作数的前面:先自增或者自减,再参与操作
inta = 10;
intb = ++a;
放在操作数的后面:先参与操作,再自增或者自减
inta = 10;
intb = a++;
a)练习
(1)请分别计算出a,b,c的值?
int a = 10;
int b = 10;
int c = 10;
a= b++;
c= --a;
b= ++a;
a= c--;
答案:a:9,b:10,c:8
(2)请分别计算出x,y的值?
int x = 4;
//4//6//60
int y =(x++)+(++x)+(x*10);
答案:x:6,y:70
2)赋值运算符
A.=,+=,-=,*=,/=,%=等
B.=叫做赋值运算符,也是最基本的赋值运算符
int x = 10;把10赋值给int类型的变量x。
C.扩展的赋值运算符的特点
隐含了自动强制转换。
D.面试题:
short s = 1;
s= s + 1;//报错,改为s = (s的数据类型)(s +1);
shorts = 1;
s+= 1;//等价于s = (s的数据类型)(s +1);
请问上面的代码哪个有问题?
3)比较运算符
A.==,!=,>,>=,<,<=
B.无论运算符两端简单还是复杂最终结果是boolean类型。
C.千万不要把==写成了=
4)逻辑运算符
A.&,|,^,!,&&,||
B.逻辑运算符一般用于连接boolean类型的表达式或者值。
C.表达式:
就是用运算符把常量或者变量连接起来的符合java语法的式子。
算术表达式:a + b
比较表达式:a == b(条件表达式)
D.结论
&:有false则false
|:有true则true
^:相同则false,不同则true。//情侣关系。
!:非true则false,非false则true
&&:结果和&是一样的,只不过有短路效果。左边是false,右边不执行。
||:结果和|是一样的,只不过有短路效果。左边是true,右边不执行。
5)位运算符(了解)
&,|,^,~ ,>>,>>>,<<
A.位运算符的特点
都是针对补码进行操作的
B.结论:
&(位与):有0则0
|(位或):有1则1
^(位异或):相同则0,不同则1
~:按位取反
<<:左移左边最高位丢弃,右边补齐0
>>:右移最高位是0,左边补齐0;最高为是1,左边补齐1
>>>:无符号右移无论最高位是0还是1,左边补齐0
C.^的特殊用法
一个数据针对另一个数据位异或两次,该数不变
D.面试题
a)请实现两个变量的交换
**采用第三方变量
**用位异或运算符
左边a,b,a
右边a^b
b)请用最有效率的方式计算出2乘以8的结果
2<<3
6)三元运算符
A.格式
比较表达式?表达式1:表达式2;
B.执行流程:
首先计算比较表达式的值,看是true还是false。
如果是true,表达式1就是结果。
如果是false,表达式2就是结果。
C.案例:
a)比较两个数据是否相等
b)获取两个数据中的最大值
c)获取三个数据中的最大值
键盘录入
1)实际开发中,数据是变化的,为了提高程序的灵活性,我们加入键盘录入数据。
2)如何实现呢?目前就记住
引入命名空间
usingSystem;
位置:
可以是在namespace的上面或namespace里头class上面
可以在class上面,没有namespace的情况
获取数据
Console.ReadLine();
3)把三元运算符的案例加入键盘录入改进。
流程控制语句
1)顺序结构
从上往下,依次执行
2)选择结构
按照不同的选择,执行不同的代码
3)循环结构
做一些重复的代码
if语句
1)三种格式
A.格式1
if(比较表达式) {
语句体;
}
执行流程:
判断比较表达式的值,看是true还是false
如果是true,就执行语句体
如果是false,就不执行语句体
B.格式2
if(比较表达式) {
语句体1;
}else{
语句体2;
}
执行流程:
判断比较表达式的值,看是true还是false
如果是true,就执行语句体1
如果是false,就执行语句体2
C.格式3
if(比较表达式1) {
语句体1;
}elseif(比较表达式2){
语句体2;
}
...
else{
语句体n+1;
}
执行流程:
判断比较表达式1的值,看是true还是false
如果是true,就执行语句体1
如果是false,就继续判断比较表达式2的值,看是true还是false
如果是true,就执行语句体2
如果是false,就继续判断比较表达式3的值,看是true还是false
...
如果都不满足,就执行语句体n+1
2)注意事项
A.比较表达式无论简单还是复杂,结果是boolean类型
B.if语句控制的语句体如果是一条语句,是可以省略大括号的;如果是多条,不能省略。建议:永远不要省略。
C.一般来说,有左大括号,就没有分号,有分号,就没有左大括号。
D.else后面如果没有if,是不会出现比较表达式的。
E.三种if语句其实都是一个语句,只要有一个执行,其他的就不再执行。
3)案例:
A.比较两个数是否相等
B.获取两个数中的最大值
C.获取三个数中的最大值(if语句的嵌套)
D.根据成绩输出对应的等级
E.根据月份,输出对应的季节
F.根据x计算对应y的值并输出
4)三元运算符和if语句第二种格式的关系
所有的三元运算符能够实现的,if语句的第二种格式都能实现。
反之不成立。
如果if语句第二种格式控制的语句体是输出语句,就不可以。
因为三元运算符是一个运算符,必须要有一个结果返回,不能是一个输出语句。
switch语句
1)格式:
switch(表达式) {
case值1:
语句体1;
break;
case值2:
语句体2;
break;
default:
语句体n+1;
break;
}
2)格式解释说明:
switch:说明这是switch语句。
表达式:与JAVA不同,在C#中可以是整数(byte,short,int,long)、char、string、bool、enum
case:后面的值就是要和表达式进行比较的值
break:表示程序到这里中断,跳出switch语句
default:如果所有的情况都不匹配,就执行这里,相当于if语句中的else
3)面试题
switch语句的表达式可以是byte吗?可以是long吗?可以是String吗?
答:都可以。
4)执行流程:
A.首先计算表达式的值
B.和每一个case进行匹配,如果有就执行对应的语句体,看到break就结束。
C.如果没有匹配,就执行default的语句体n+1。
5)注意事项:
A.case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的
B.default可以省略吗?
可以省略,但是不建议,因为它的作用是对不正确的情况给出提示。
特殊情况:
case就可以把值固定。
A,B,C,D
C.break可以省略吗?
与java不同,在C#中不可以省略,C#中不允许出现case穿透。
但是可以多case:
switch (l)
{
case 4:
case 5:
Console.Write(4);
break;
}
D.default一定要在最后吗?
不是,可以在任意位置。但是建议在最后。
E.switch语句的结束条件
(1)遇到break就结束了
注:与java不同,在C#中每个case或default中都必须有break
(2)执行到末尾就结束了
6)案例:
A.键盘录入一个数字(1-7),输出对应的星期几。
B.单项选择题
C.根据给定的月份,输出对应的季节
7)if语句和switch语句各自的场景
A.if
针对boolean类型的判断
针对一个范围的判断
针对几个常量的判断
B.switch
针对几个常量的判断
循环语句
1)有三种:for,while,do...while
2)for循环语句
A.格式
for(初始化语句;判断条件语句;控制条件语句){
循环体语句;
}
执行流程:
(1)执行初始化语句
(2)执行判断条件语句
如果这里是true,就继续
如果这里是false,循环就结束
(3)执行循环体语句
(4)执行控制条件语句
(5)回到b
B.注意事项
(1)判断条件语句无论简单还是复杂,结果是boolean类型
(2)循环体语句如果是一条,可以省略大括号,但是不建议
(3)有分号就没有左大括号,有左大括号就没有分号
C.案例
(1)输出10次HelloWorld
(2)输出1-10的数据
(3)输出10-1的数据
(4)求1-10的和
(5)求1-100的和,求1-100的偶数和,求1-100的奇数和
(6)求5的阶乘
(7)在控制台打印水仙花数
(8)统计水仙花个数
(9)改进版的回文数
一个五位数
个位=万位
十位=千位
个位+十位+千位+万位=百位
(10)统计1-1000之间同时满足如下条件的数据有多少个
x%3==2
x%5==3
x%7==2
3)while循环
A.格式:
基本格式
while(判断条件语句) {
循环体语句;
}
扩展格式:
初始化语句;
while(判断条件语句){
循环体语句;
控制条件语句;
}
通过查看这个格式,我们就知道while循环可以和for循环等价转换。
B.执行流程:
(1)执行初始化语句
(2)执行判断条件语句,看其返回值是true还是false
如果是true,就继续执行
如果是false,就结束循环
(3)执行循环体语句;
(4)执行控制条件语句
(5)回到B继续。
C.while的练习
把for语句的练习用while改进
D.for和while的区别
(1)使用上的区别
for语句的那个控制条件变量,在循环结束后不能在使用了。
而while的可以继续使用。
(2)理解上的区别
for适合于一个范围的判断
while适合次数不明确的
举例:吃葡萄
E.案例:
(1)珠穆朗玛峰问题
(2)小芳存钱问题(break以后才能做)
4)do...while循环
A.格式
基本格式
do{
循环体语句;
}while(判断条件语句);
扩展格式:
初始化语句;
do{
循环体语句;
控制条件语句;
}while(判断条件语句);
通过查看格式,我们就可以看出其实三种循环的格式可以是统一的。
B.执行流程:
(1)执行初始化语句
(2)执行循环体语句;
(3)执行控制条件语句
(4)执行判断条件语句,看其返回值是true还是false
如果是true,就继续执行
如果是false,就结束循环
(5)回到b继续。
5)三种循环语句的区别:
do...while循环至少执行一次循环体。
而for,while循环必须先判断条件是否成立,然后决定是否执行循环体语句。
6)循环使用的注意事项(死循环)
A.一定要注意修改控制条件,否则容易出现死循环。
B.最简单的死循环格式
(1)while(true){...}
(2)for(;;){}
7)练习:
A.请输出一个4行5列的星星(*)图案。如图:
*****
*****
*****
*****
B.请输出正三角形,如图:
*
**
***
****
*****
C.在控制台输出九九乘法表。
控制跳转语句
1)break:中断的意思
A.用在循环和switch语句中,离开此应用场景无意义。
B.作用
(1)跳出单层循环
(2)跳出多层循环,需要标签语句的配合
2)continue:继续
A.用在循环中,离开此应用场景无意义。
B.作用
跳出单层循环的一次,可以继续下一次
C.填空题
for(intx=1; x<=10; x++) {
if(x%3== 0) {
//补齐代码
}
Console.WriteLine("C#基础班");
}
如何让控制台输出2次:C#基础班
如何让控制台输出7次:C#基础班
如何让控制台输出13次:C#基础班
3)标号+ goto:
A.作用
标记某个循环对其控制
B.组成规则
其实就是合法的标识符
C.例子:(跳出多层循环)
------------------------------------------------------------------------
publicstaticvoidMain(string[] args)
{
for(inti = 0; i < 5;i++)
{
for(intj = 0; j < 5; j++)
{
if(j == 3)
gotook;
else{
Console.WriteLine("i="+ i +",j="+ j);
}
}
}
ok:
Console.WriteLine("goto");
}
------------------------------------------------------------------------
4)return:返回
用于结束方法的,后面还会在继续讲解和使用。
一旦遇到return,程序就不会在继续往后执行。
5)return和break以及continue的区别?
return是结束方法
break是跳出循环
continue是终止本次循环继续下次循环
6)练习题:
for(intx=1; x<=10; x++) {
if(x%3==0) {
//在此处填写代码
}
Console.WriteLine(“C#基础班”);
}
我想在控制台输出2次:“C#基础班“
我想在控制台输出7次:“C#基础班“
我想在控制台输出13次:“C#基础班“
方法
1)方法:就是完成特定功能的代码块,提高代码的复用性。
注意:在很多语言里面有函数的定义,而在Java中,函数被称为方法。
2)格式:
修饰符返回值类型方法名(参数类型参数名1,参数类型参数名2...) {
方法体语句;
return返回值;
}
3)格式说明:
修饰符:目前就用public static。后面再详细讲解其他修饰符
返回值类型:就是功能结果的数据类型
方法名:符合命名规则即可,方便我们调用该方法。
参数类型:就是参数的数据类型
参数名:就是变量
参数分类:
实参:实际参与运算的数据
形参:方法上定义的,用于接收实际参数的变量
方法体语句:就是完成功能的代码块
return:结束方法
返回值:就是功能的结果,由return带给调用者。
4)两个明确:
返回值类型:结果的数据类型
参数列表:参数的个数及对应的数据类型
5)方法调用
A.有明确返回值的方法
(1)单独调用,没有意义
(2)输出调用,不是很好,因为我可能需要不结果进行进一步的操作。但是讲课一般我就用了。
(3)赋值调用,推荐方案
B.void类型修饰的方法
单独调用
6)方法的注意事项
A.方法不调用不执行
B.方法之间是平级关系,不能嵌套定义
C.方法定义的时候,参数是用,隔开的
D.方法在调用的时候,不用在传递数据类型
E.如果方法有明确的返回值类型,就必须有return语句返回。
7)案例:
A.求和方案
B.获取两个数中的较大值
C.比较两个数据是否相同
D.获取三个数中的最大值
E.输出m行n列的星形
F.输出nn乘法表
8)方法重载
A.在同一个类中,方法名相同,参数列表不同。与返回值无关。
B.参数列表不同:
(1)参数的个数不同。
(2)参数的对应的数据类型不同。
(3)参数的顺序不同(算重载,但是在开发中不用)
9)方法重载案例
不同的类型的多个同名方法的比较。
数组
1)数组:存储同一种数据类型的多个元素的容器,既可以存储基本数据类型,也可以存储引用数据类型。
2)特点:每一个元素都有编号,从0开始,最大编号是长度-1。
编号的专业叫法:索引
3)定义格式
数据类型[]数组名;
4)数组的初始化
就是为数组开辟连续的内存空间,并为每个数组元素赋予值
A.动态初始化
只给长度,系统给出默认值
举例:int[] arr= new int[3];
B.静态初始化
给出值,系统决定长度
举例:int[] arr= new int[]{1,2,3};
简化版:int[] arr= {1,2,3};
5)数组操作的两个常见小问题:
A.数组索引越界异常
原因:你访问了不存在的索引。
B.空指针异常
原因:数组已经不在指向堆内存了。而你还用数组名去访问元素。
例子:
int[]arr = {1,2,3};
arr= null;
Console.WriteLine(arr[0]);
6)C#的内存分配
A.栈存储局部变量
B.堆存储所有new出来的
C.方法区(面向对象部分详细讲解)
D.本地方法区(系统相关)
E.寄存器(CPU使用)
注意:
a:局部变量在方法定义中或者方法声明上定义的变量。
b:栈内存和堆内存的区别
栈:数据使用完毕,就消失。
堆:每一个new出来的东西都有地址
每一个变量都有默认值
byte,short,int,long0
float,double 0.0
char'\u0000'
booleanfalse
引用类型null
数据使用完毕后,在垃圾回收器空闲的时候回收。
(7)数组内存图
A:一个数组
B:二个数组
C:三个数组(两个栈变量指向同一个堆内存)
(8)数组的常见操作
A:遍历
---------------------------------------------------------------------------
方式1:
publicstatic void printArray(int[] arr) {
for(intx=0; x
System.out.println(arr[x]);
}
}
方式2:
publicstatic void printArray(int[] arr) {
System.out.print("[");
for(intx=0; x
if(x== arr.length-1) {
System.out.println(arr[x]+"]");
}else{
System.out.println(arr[x]+",");
}
}
}
---------------------------------------------------------------------------
B:最值
---------------------------------------------------------------------------
最大值:
publicstatic int getMax(int[] arr) {
intmax = arr[0];
for(intx=1; x
if(arr[x]> max) {
max= arr[x];
}
}
returnmax;
}
最小值:
publicstatic int getMin(int[] arr) {
intmin = arr[0];
for(intx=1; x
if(arr[x]< min) {
min= arr[x];
}
}
returnmin;
}
---------------------------------------------------------------------------
C:逆序
---------------------------------------------------------------------------
方式1:
publicstatic void reverse(int[] arr) {
for(intx=0; x
inttemp = arr[x];
arr[x]= arr[arr.length-1-x];
arr[arr.length-1-x]= temp;
}
}
方式2:
publicstatic void reverse(int[] arr) {
for(intstart=0,end=arr.length-1; start<=end; start++,end--) {
inttemp = arr[start];
arr[start]= arr[end];
arr[end]= temp;
}
}
---------------------------------------------------------------------------
D:查表
---------------------------------------------------------------------------
publicstatic String getString(String[] strArray,int index) {
returnstrArray[index];
}
---------------------------------------------------------------------------
E:基本查找
---------------------------------------------------------------------------
方式1:
publicstatic int getIndex(int[] arr,int value) {
for(intx=0; x
if(arr[x]== value) {
returnx;
}
}
return-1;
}
方式2:
publicstatic int getIndex(int[] arr,int value) {
intindex = -1;
for(intx=0; x
if(arr[x]== value) {
index= x;
break;
}
}
returnindex;
}
---------------------------------------------------------------------------