C#编程基础

基础

.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框架结构图

C#编程基础_第1张图片

语言

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;

}

---------------------------------------------------------------------------

你可能感兴趣的:(C#编程基础)