《C#图解教程》第5章 方法 读书笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Cyan1614/article/details/78072623
5.1 方法的结构
方法是一块具有名称的代码。可以使用方法的名称从别的地方执行代码,也可以把数据传入方法并接受数据输入。
方法有两个主要部分:方法头和方法体。
方法头指定方法的特征,包括:
方法是否返回数据,如果返回,返回什么类型;
方法的名称;
哪种类型的数据可以传递给方法或从方法返回,以及应如何处理这些数据。
方法体包含可执行代码的语句序列。执行过程从方法体的第一条语句开始,一直到整个方法结束。
5.2 方法体内部的代码执行
方法体是一个块,是大括号括起的语句序列。
块可以包含以下项目:
本地变量;
控制流结构;
方法调用;
内嵌的块。
5.3 本地变量
本地变量也保存数据。字段通常保存和对象状态有关的数据,而创建本地变量经常是用于保存本地的或临时的计算数据。
本地变量的存在性和生存期仅限于创建它的块极其内嵌的块。
它从声明它的那一点开始存在。
它在块完成执行时结束存在。
可以在方法体内任意位置声明本地变量,但必须在使用它们前声明。
5.3.1 类型推断和var关键字
var关键字并不是特定类型变量的符号。它只是句法上的速记,表示任何可以从初始化语句的右边推断出的类型。
使用var关键字有一些重要的条件:
只能用于本地变量,不能用于字段;
只能在变量声明中包含初始化时使用;
一旦编译器推断出变量的类型,它就是固定且不能更改的。
5.3.2 嵌套块中的本地变量
方法体内部可以嵌套其他的块。
可以有任意数量的块,并且它们既可以是顺序的也可以更深层嵌套的。快可以嵌套到任何级别。
本地变量可以在嵌套块的内部声明,并且和所有的本地变量一样,它们的生存期和可见性仅限于声明它们快及其内嵌块。
5.4 本地常量
本地常量很像本地变量,只是一旦被初始化,它的值就不能改变了。如同本地变量,本地常量必须声明在块的内部。
常量的两个最重要的特征如下:
常量在声明时必须初始化。
常量在声明后不能改变。
常量的核心声明如下所示。语法与字段或变量的声明相同,除了下面内容。
在类型之前增加关键字const。
必须有初始化语句。初始化值必须在编译器决定,通常是一个预定义简单类型或由其组成的表达式。它可以是null引用,但它不能是某对象的引用,因为对象的引用是在运行时决定的。
关键字const不是一个修饰符,而是核心声明的一部分。它必须直接放在类型的前面。
5.5 控制流
术语控制流指的是程序从头到尾的执行流程。默认情况下,程序执行持续地从一条语句到下一条语句,控制流语句允许你改变执行的顺序。
5.6 方法调用
可以从方法体的内部调用其他方法。
调用方法时要使用方法名并带上参数列表。
5.7 返回值
方法可以向调用代码返回一个值。返回的值被插入到调用代码中发起调用的表达式所在的位置。
要返回值,方法必须在方法名前面声明一个返回类型。
如果方法不返回值,它必须声明void返回类型。
也可以返回用户定义类型的对象。
5.8 返回语句和void方法
void方法不需要返回语句。当控制流到达方法体的关闭大括号时,控制返回到调用代码,并且没有值被插入到调用代码中。
不过,当特定条件符合的时候,我们常常会提前退出方法以简化程序逻辑。
可以在任何时候使用下面形式的返回语句退出方法,不带参数:return;
这种形式的返回语句只能用于用void声明的方法。
5.9 参数
参数是能把一个值返回给调用代码和能在方法开始执行时把数据传入。
5.9.1 形参
因为形参是变量,所以它们有类型和名称,并能被写入和读取。
和方法中的其他本地变量不同,参数在方法体的外面定义并在方法开始之前初始化。
参数列表中可以有任意数目的形参声明,而且声明必须用逗号隔开。
5.9.2 实参
当代码调用一个方法时,形参的值必须在方法的代码开始执行之前被初始化。
用于初始化形参的表达式或变量被称作实参。
实参位于方法调用的参数列表中。
每一个实参必须与对应形参的类型想匹配,或是编译器必须能够把实参隐式转换为那个类型。
实参的数量必须和形参的数量一致,并且每个实参的类型也必须和所对应的的形参类型一致。这种形式的参数叫做位置参数。
5.10 值参数
未用ref或者out之类修饰符修饰的参数叫做值参数。
使用值参数,通过将实参的值复制到形参的方式把数据传递个方法。方法被调用时,系统做如下操作。
在栈中为形参分配空间。
把实参的值复制给形参。
值参数的实参不一定是变量。它可以是任何能计算成相应数据类型的表达式。
在把变量用作实参之前,变量必须被赋值。对于引用类型,变量可以被设置为一个实际的引用或null。
值参数是把实参的值复制给形参。
5.11 引用参数
使用引用参数时,必须在方法的声明和调用中都使用ref修饰符。
实参必须是变量,在用作实参前必须被赋值。如果是引用类型变量,可以赋值为一个引用或null。
对于值参数,系统在栈上为形参分配内存,相反,引用参数具有以下特征。
不会为形参在栈上分配内存。
实际情况是,形参的参数名将作为实参变量的别名,指向相同的内存位置。
由于形参名和实参名的行为就好像指向相同的内存位置,所以在方法的执行过程中对形参作的任何改变在方法完成后依然有效(表现在实参变量上)。
5.12 引用类型作为值参数和引用参数
将引用类型对象作为值参数传递,如果在方法内创建一个新对象并复制给形参,将切断形参与实参之间的关联,并且在方法调用结束后,新对象也将不复存在。
将引用类型对象作为引用参数传递,如果在方法内创建一个新对象并复制给形参,在方法结束后该对象依然存在,并且是实参引用的值。
5.13 输出参数
输出参数用于从方法体内把数据传出到调用代码,它们的行为与引用参数非常类似。
必须在声明和调用中都使用修饰符。输出参数的修饰符是out而不是ref。
和引用参数相似,实参必须是变量,而不能是其他类型的表达式。这是有道理的,因为方法需要内存位置保存返回值。
在方法内部,输出参数在能够被读取之前必须被赋值。这意味着参数的初始值是无关的,而且没有必要在方法调用之前为实参赋值。
在方法返回之前,方法内部贯穿的任何可能路径都必须为所有输出参数进行一次赋值。
5.14 参数数组
参数数组它允许另个或多个实参对应一个特殊的形参。参数数组的重点如下。
在一个参数列表中只能有一个参数数组。
如果有,它必须是列表中的最后一个。
由参数数组表示的所有参数都必须具有相同的类型。
声明一个参数数组必须做的事如下。
在数据类型前使用params修饰符。
在数据类型后放置一组空的方括号。
5.14.1 方法调用
可以使用两种方式为参数数组提供实参。
一个逗号分隔的该数据类型元素的列表。
一个该数据类型元素的一维数组。
参数数组中修饰符的使用与其他参数类型的模式并不相符。
其他参数类型是一致的,要么都使用修饰符,要么都不使用修饰符。
值参数的声明和调用都不带修饰符。
引用参数和输出参数在两个地方都需要修饰符。
params修饰符的用法总结如下。
在声明中需要修饰符。
在调用中不允许有修饰符。
参数数组方法调用的第一种形式有时被称为延伸式,这种形式在调用中使用分离的实参。
在使用一个为参数数组分离实参的调用时,编译器做下面的事。
接受实参列表,用它们在堆中创建并初始化一个数组。
把数组的引用保存到栈中的形参里。
如果在对应的形参数组的位置没有实参,编译器会创建一个有零个元素的数组来使用。
如果数组参数是值类型,那么值被复制,实参不受方法内部的影响。
如果数组参数是引用类型,那么引用被复制,实参引用的对象可以受到方法内部的影响。
5.14.2 用数组作为实参
也可以在方法调用之前创建并组装一个数组,把单一数组变量作为实参传递。这种情况下,编译器使用你的数组而不是重新创建一个。
5.15 参数类型总结
5.16 方法重载
一个类中可以有一个以上的方法拥有相同的名称,这叫做方法重载。使用相同名称的每个方法必须有一个合其他方法不相同的签名。
方法的签名由下列信息组成,它们在方法声明的方法头中:
方法的名称;
参数的数目;
参数的数据类型和顺序;
参数修饰符。
返回类型不是签名的一部分,而我们往往误认为它是签名的一部分。
请注意,形参的名称也不是签名的一部分。
5.17 命名参数
只要显式指定参数的名字,就可以以任意顺序在方法调用中列出实参。细节如下。
方法的声明没有什么不一样。形参已经有名字了。
不过在调用方法的时候,形参的名字后面跟着冒号和实际的参数值或表达式。
在调用的时候,你可以既使用位置参数又使用命名参数,但如果这么做,所有位置参数必须先列出。
5.18 可选参数
所谓可选参数就是我们可以在调用方法的时候包含这个参数,也可以省略它。
为了表明某个参数是可选的,你需要在方法声明的时候为参数提供默认值。指定默认值的语法和初始化本地变量的语法一样。
不是所有的参数类型都可以作为可选参数。
只要值类型的默认值在编译的时候可以确定,就可以使用值类型作为可选参数。
只有在默认值是null的时候,引用类型才可以作为可选参数来使用。
所有必填参数必须在可选参数声明之前声明。如果有params参数,必须在所有可选参数之后声明。
你必须从可选参数列表的最后开始省略,一直到列表开头。
也就是说,你可以省略最后一个可选参数,或是最后n个可选参数,但是不可以随意选择省略任意的可选参数,省略必须从最后开始。
5.19 栈帧
在调用方法的时候,内存从栈的顶部开始分配,保存和方法关联的一些数据项。这块内存叫做方法的栈帧。
栈帧包含的内存保存如下内容。
返回地址,也就是在方法退出的时候继续执行的位置。
这些参数分配的内存,也就是方法的值参数,或者还可能是参数数组(如果有的话)。
各种和方法调用相关的其他管理数据项。
在方法调用时,整个栈帧都会压入栈。
在方法退出的时候,整个栈帧都会从栈上弹出。弹出栈帧有的时候也叫做栈展开。
5.20 递归
除了调用其他方法,方法也可以调用自身。这叫做递归。

猜你喜欢

转载自blog.csdn.net/Cyan1614/article/details/78072623