第4章 数组与方法Word格式.docx
- 文档编号:19423440
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:10
- 大小:41.37KB
第4章 数组与方法Word格式.docx
《第4章 数组与方法Word格式.docx》由会员分享,可在线阅读,更多相关《第4章 数组与方法Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
int[]myIntArray={1,3,5,7,9};
使用new关键字,需在类型名后面的方括号给出大小。
int[]myIntArray=newint[5];
这样,每个数组元素会被赋予同一个默认值,对数据型来说,其值是0。
也可使用者两种方式的组合来进行初始化。
int[]myIntArray=newint[5]{1,3,5,7,9};
//个数与大小必须一致
实际上,C#可以在声明数组时不进行初始化,这样就可以在以后的程序中动态地指定其大小。
利用这项技术,可以创建一个空引用,以后再使用new关键字把这个引用指向请求动态分配的内存空间。
int[]myIntArray;
myIntArray=newint[20];
这样访问数组中的单个元素的方法为:
ArrayName[i]。
数组在C#中是一种特殊的类型,有自己的方法。
inti=myIntArray.Length;
//返回数组的大小
Array.Sort(myIntArray);
//把数组元素升序排列
Array.Reverse(myIntArray);
//数组中的元素反序排列
示例:
一维数组的使用Array1
2.foreach循环
foreach循环可以迭代集合中的每一项。
集合是一种包含其他对象的对象,如C#中的数组、System.Collection命名空间中的的集合类,以及用户定义的集合类。
其语法格式如下:
foreach(<
baseType>
<
name>
in<
array>
)
{
//canuse<
foreachelement
}
foreach循环每次迭代数组中的一个元素,依次把每个元素的值放在<
型的变量<
中,然后执行一次循环。
foreach循环不会访问到数组以外的内存空间,这样不用考虑数值中的元素个数,就能确保访问到每个数组元素。
可以把上一个示例改写为Array2。
数组举例
3.多维数组
多维数组是使用多个下标访问其元素的数组。
C#支持两种类型的多维数组,第一种是矩形数组,即每行的元素个数相同。
第二种是变长数组(交错数组),即每行都有不同的数组个数。
double[,]myArray=newdouble[3,4];
//声明二维数组
或double[,]myArray={{1,2,3,4},{2,3,4,5},{3,4,5,6}};
foreach循环也可以访问多维数组中的所有元素,其方式与一维数组相同,如:
double[,]myArray={{1,2,3,4},{2,3,4,5},{3,4,5,6}};
foreach(doubletempinmyArray)
Console.WriteLine(“{0}”,temp);
杨辉三角形Triangle1
4.数组的数组(可变长数组)
C#支持的第二种多维数组是变长数组,也叫交错数组或正交数组,其中每行可以有不同的元素个数。
显然,它比矩形数组更灵活,但创建时要复杂一些。
首先创建一维数组,它的每一个元素都是另一个一维数组。
int[][]a;
//注意它的初始化
(1)先初始化包含其他数组的数组,再初始化子数组。
a=newint[3][];
a[0]=newint[4];
a[1]=newint[3];
a[2]=newint[2];
(2)使用字面值的一种改进形式:
a={newint[]{1,2,3,4},newint[]{1,2,3},newint[]{1,2}};
杨辉三角形Triangle2
注意:
交错数组元素的访问方法。
交错数组
交错数组是数组的元素为数组的数组
例如:
jaggedArray[0]=newint[]{1,3,5,7,9,13};
jaggedArray[1]=newint[]{0,2,};
jaggedArray[2]=newint[]{5,11,22};
jaggedArray[3]=newint[]{3,5,7,10,32};
还可以在声明数组时将其初始化,如:
int[][]jaggedArray2=newint[][]
{
newint[]{1,3,5,7,9},
newint[]{0,2,4,6},
newint[]{11,22}
};
数组示例
classDeclareArraysSample
publicstaticvoidMain()
int[]numbers=newint[5];
//一维数组
string[,]names=newstring[5,4];
//多维数组
byte[][]scores=newbyte[5][];
//数组的数组(交错数组)
for(inti=0;
i<
scores.Length;
i++)//创建交错数组
scores[i]=newbyte[i+3];
i++)//打印每行的长度
Console.WriteLine("
Lengthofrow{0}is{1}"
i,scores[i].Length);
}
jaggedArray3[0][1]=77;
jaggedArray3[2][1]=88;
示例见P96的任务4.3。
4.2值类型与引用类型
在第二章已经介绍过,如果某个数据类型在自己的内存分配中包含数据,则该类型是“值类型”。
“引用类型”含有指向包含数据的其他内存位置的地址。
也就是说,值类型变量的只是该变量包含的实际数据,该实际数据存储在值类型变量的内存空间中。
引用类型变量的值为一地址,该变量包含的数据存储在该地址指向的内存空间中。
如下列对值类型变量的赋值语句:
intnum1,num2;
num1=5;
num2=num1;
num1+=5;
则其内存分配如下图:
下面来看一下把一个引用类型变量的值赋给另一个引用类型变量时发生的情况,详见如下赋值语句:
int[]myArray1;
int[]myArray2;
myArray1=newint[]{1,2,3};
myArray2=myArray1;
myArray1[0]=100;
则这些语句执行后,其内存分配如下图所示。
4.3方法
方法是用来实现可以由对象或类执行的计算或操作。
在前面的示例中我们一直在使用Main()方法,我们已经知道这个方法是必须的。
一般说来,属性存储对象的数据,而方法是可要求对象执行的操作。
4.3.1传值方式
如果在方法的声明中,其参数前没有ref或out修饰符,则调用方法时,以传值方式向方法传递参数。
在C#中默认为通过传值传递参数。
所谓“传值”,就是在方法调用时,将实参的值传递给形参。
如果实参的类型为值类型,则实参的值为该参数包含的数据。
如果实参的类型为引用类型,则实参的值为地址。
如参数是以传值方式传递,形参将创建新的存储位置,在该位置存储形参接收的值。
也就是说,被调用的方法将接收实参的一个副本。
传值时,如果对被调用的方法的值的副本进行修改,不会影响实参变量的值。
4.3.2以传值方式传递值类型参数
值类型参数的值为该参数包含的实际数据,以传值方式传递值类型参数时,当形参接收到实参的值后,形参变量和实参变量就不再有任何关系。
示例见P106的任务4.6。
格式如下:
rec1.OffSet(offx,offy);
4.3.3以传值方式传递引用类型参数
引用类型参数的值是地址,该地址表示的存储位置存储的是该引用类型变量引用的对象。
以传值方式传递引用类型参数时,形成分配独立的存储位置,该存储位置与实参的存储位置不同。
形参接收到的值为一地址并将其存储在形参表示的存储位置中,形参所引用的对象存储在形参的值表示的存储位置中。
因此,以传值方式传递引用类型参数时,将创建实参值(地址)的副本,而不是实参引用对象的副本。
数组是引用类型,数组变量的值是一地址,该地址表示的存储位置存储的该数组变量所引用的数组对象。
需要注意的是,要向方法传递一个数组参数,需要在省略括号的前提指定数组名。
示例见P112的任务4.7是传值方式传递数组。
其中调用printArray方法采用如下方式:
printArray(app.rainfall);
4.3.4传引用方式
以传值方式传递引用类型的参数时,有可能更改引用所指向的数据,如数组元素的值,但是无法更改引用本身的值;
也就是说,在方法内不能使用new运算符对原始数组进行重新分配内存。
若想这样做,如何才能达到,C#为我们提供了关键字ref和out。
ref和out关键字指出一个值类型变量或引用类型变量应该以传引用方式传递。
如果使用关键字ref和out通过引用传递变量,则方法能够修改变量本身。
具体说来,如果参数为对象变量,则在方法内可以给它分配新的对象。
这种重新分配也会影响到调用程序中的对象变量。
如果参数为值类型变量,在方法中队参数所做的任何更改都将反映在该变量中,因此参数使用ref和out关键字后被调用的方法能够修改原始变量的值。
若要使用ref参数,必须将参数作为ref参数显式地传递到方法。
ref参数的值被传递到ref参数。
传递到ref参数的参数必须最先初始化。
out指定一个输出参数,被调用的方法会向其赋值。
通常,当方法收到一个未初始化的值时,会发生编译错误,如在参数前天就out参数,必须将参数作为out参数显式传递到方法。
4.3.5以传引用方式传递值类型参数
1.ref参数
在C#中试图使用方法获取信息时,只能得到一个返回值。
当需要得到多个返回值时,就必须编写多个方法,显得非常麻烦。
那么有没有办法通过一个方法可以同时获取多个返回值呢?
当然是有的。
使用ref参数即可。
示例见P117的任务4.8。
2.out参数
通过上面的例子我们可以看到,调用方法可以得到多个值。
但前面的代码中,在调用方法前,其变量必须初始化,有点别扭,好歹C#中有out关键字。
Out指定一个输出参数,被调用的方法必须向其赋值。
通常,当方法收到一个未初始化的值时,会发生编译错误,如果在参数前添加out关键字,这就要求被调用的方法对其进行初始化,并防止发生未初始化变量的错误。
Out参数通常用在多个返回值的方法中。
具体示例见P119的任务4.9。
3.ref参数与out参数的比较
ref参数与out参数的主要区别是:
out参数不要求调用代码对传递的参数进行初始化,什么时候使用ref参数呢?
当需要保证调用方法已经对参数进行了初始化时,需要使用ref参数。
前面的示例中被调用的方法不依赖于被传递变量的值。
具体示例见P120的任务4.10。
4.3.6以传引用方式传递引用类型参数
以传值方式传递引用类型的参数时,有可能更改引用所指向的数据。
如书中元素的值,但是无法更改引用本身的值;
也就是说,在方法内不能使用new运算符对原始数据进行直接内存分配。
可使用C#提供的ref或out关键字解决这一问题。
我们再次强调,ref或out关键字就是告诉编译器,形参将不创建新的存储位置,形参指向与正被传递的参数(实参)相同的存储位置,这样如果被调用方法修改了形参的值并返回,调用代码的变量(实参)的值就被改变了。
下面的示例演示了采用传引用方式传递引用类型参数的使用,具体见P122的任务4.11。
4.3.1方法的定义和使用
在C#中,方法的定义包括方法的修饰符,返回值的类型、方法名,形式参数列表。
其一般格式如下:
[modifies]return_typeMethodName([paraments])
//Methodbody
如:
classprogram
staticvoidWrite()
Console.WriteLine(“Textoutputfromfunction.”);
staticvoidMain(string[]args)
Write();
1.方法的返回值
方法返回值可有可无。
如果有返回值,在方法声明是,必须给出返回值的类型,在方法体内的最后一个语句必须是return语句,反之,用void来表示方法名。
2.方法参数
在调用方法时,主调方法和被调方法之间多数都有数据传递。
就是所谓的形参和实参。
如果参数前有ref表示参数为引用参数。
示例:
Function1数组做参数
3.参数数组
C#允许为方法指定一个(只指定一个)特定参数,这个参数必须是方法定义中的最后一个参数,称为参数数组。
参数数组可以使用个数不定的参数调用方法,它可以使用params关键字来定义。
参数数组可以简化代码,因为不必从调用代码中传递数组,而是传递可在方法中使用一个数值中相同类型的几个参数。
Function2参数数组的例子。
4.输出参数
除了根据引用传递值外,也可以使用关键字out,指定所给定的一个输出参数。
Function3返回数组中最大值元素与下标。
4.3.2变量的作用域
变量的作用域是可以访问该变量的代码区域,它的确定有以下规则:
1)只要变量所属的类在某个作用域内,该变量也在该作用域内。
2)局部变量存在于表示声明该变量的语句块内。
3)同名变量不能出现在同一个语句块中。
4)在函数外声明的变量称为全局变量。
4.3.3Main方法
C#程序是从方法Main开始执行的。
该方法必须是类或结构的静态方法,且其返回类型必须是int或void。
通常会显式指定public修饰符,但标记为private也可执行。
可以给Main方法传递参数:
string[]args。
尽管参数名称是args,但C#可以接收任何参数名称。
Parameters是给Mian方法传送字符串数组,并输出每个选项的值。
在dos下运行parameters/a/b/c
4.3.4方法的重载
方法的重载是指在一个类中有若干个同名方法,这些方法要么参数个数、参数类型或返回值类型不同,在调用这些方法的过程中,会根据参数的类型自动匹配执行相应的函数,则称为方法的重载。
FunOverLoad是两个数据求和的方法重载的应用。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 数组与方法 数组 方法