网站的建设宗旨,怎么弄免费的php空间做网站,网站建设-信科网络,用微信小程序连接WordPress文章目录 6.1 方法的结构6.2 方法体内部的代码执行6.3 局部变量6.3.1 类型推断和 var 关键字6.3.2 嵌套块中的局部变量 6.4 局部常量6.5 控制流6.6 方法调用#xff08;*#xff09;6.7 返回值#xff08;*#xff09;6.8 返回语句和 void 方法6.9 局部函数6.10 参数#… 文章目录 6.1 方法的结构6.2 方法体内部的代码执行6.3 局部变量6.3.1 类型推断和 var 关键字6.3.2 嵌套块中的局部变量 6.4 局部常量6.5 控制流6.6 方法调用*6.7 返回值*6.8 返回语句和 void 方法6.9 局部函数6.10 参数*6.11 值参数6.12 引用参数6.13 引用类型作为值参数和引用参数6.14 输出参数6.15 参数数组6.15.1 方法调用6.15.2 将数组作为实参 6.16 参数类型总结6.17 ref 局部变量和 ref 返回6.18 方法重载6.19 命名参数6.20 可选参数6.21 栈帧6.22 递归* 6.1 方法的结构
返回的数据类型。方法名称。参数列表。 图6.1 方法的结构 6.2 方法体内部的代码执行
方法体是一个块可以包含以下内容
局部变量控制流结构方法调用内嵌的块其他方法局部函数。
6.3 局部变量
局部变量的生存周期仅限于创建它的块内。 声明时开始存在。块尾结束存在。 可以在方法体内部任意位置声明声明后才能使用。 图6.2 对比实例字段和局部变量 6.3.1 类型推断和 var 关键字
使用 var 关键字可以进行类型推断而不需要明确指定变量类型。var 关键字并不改变 C# 的强类型性质。
只能用于局部变量不能用于字段。只能在变量声明中包含初始化时使用。一旦编译器推断出变量的类型它就是固定且不能更改的。
6.3.2 嵌套块中的局部变量
在 C# 中不论嵌套级别如何都不能在第一个名称的有效范围内声明另一个同名的局部变量。
6.4 局部常量
声明时必须初始化。 初始化值必须在编译时就可以确定通常为预定义简单类型或 null 引用。 声明后不能改变。
和局部变量一样局部常量声明在方法体或代码块里并在声明它的块结束的地方失效。
注意const 不是修饰符而是核心声明的一部分。
6.5 控制流
选择语句 ifif … elseswitch 迭代语句 forwhiledoforeach 跳转语句 breakcontinuegotoreturn
6.6 方法调用*
6.7 返回值*
6.8 返回语句和 void 方法
6.9 局部函数
C# 7.0 开始可以在一个方法中声明另一个单独的方法称为局部函数。
6.10 参数*
6.11 值参数
使用值参数时会发生如下操作
在栈中为形参分配空间。将实参的值复制给形参。
方法使用值参数不能改变原始的值类型数据但是可以改变引用类型的数据
class MyClass { public int Val 20; }class Program {static void MyMethod(MyClass f1, int f2) { // 形参f1.Val f1.Val 5;f2 f2 5;}static void Main() {MyClass a1 new MyClass();int a2 10;MyMethod(a1, a2); // 实参}
}图6.3 值参数 6.12 引用参数
在方法的声明和调用中都使用 ref 修饰符。实参必须是已经被赋值的变量引用类型变量可以是 null。 图6.4 ref 使用说明 引用参数具有如下特征
不会在栈上为形参分配内存。形参的参数名将作为实参变量的别名指向相同的内存位置。 图6.5 对于引用参数形参就像实参的别名 6.13 引用类型作为值参数和引用参数
对于引用类型对象
作为值参数传递如果在方法内创建一个新对象并赋值给形参对实参没有影响。作为引用参数传递如果在方法内创建一个新对象并赋值给形参则实参也会随之改变。 图6.6 对用作值参数的引用类型对象赋值 图6.7 为用作引用参数的引用类型对象赋值 将引用类型对象作为引用参数传递目的是改变引用对象
如果仅需改变引用类型对象的内容只需值参数传递即可。
6.14 输出参数
在方法的声明和调用中都使用 out 修饰符。实参必须是变量使用前可以不赋值。形参的参数名也作为实参变量的别名指向相同的内存位置。 图6.8 out 使用说明 与 ref 不同out 有如下要求
给输出参数赋值后才能读取。方法返回之前必须给输出参数赋值。
C# 7.0 后可以对输出参数进行简化声明不需要预先声明一个变量来用作 out 参数了。如图 6.9 所示声明后的 a1 和 a2 可以在方法调用结束后继续使用。 图6.9 out 新的声明方式 6.15 参数数组
在形参前使用 params 修饰符并在数据类型后放置一组方括号。参数列表中只能有一个参数数组且必须为参数列表的最后一个。参数数组中的所有参数类型必须相同。 图6.10 params 使用说明 6.15.1 方法调用
可以使用两种方式为参数数组提供实参
使用逗号分隔的元素列表。
ListInts(10, 20, 30); // 3 个 int一个同类型的一维数组。
int[] intArray {1, 2, 3};
ListInts(intArray); 注意在调用时不使用 params 修饰符。
使用独立实参调用时编译器将执行以下步骤
接受实参列表在堆中创建并初始化一个数组把数组的引用保存到栈中的形参里如果没有实参个数为 0则编译器会创建一个具有 0 个元素的数组来使用。
void ListInts(params int[] inVals) { ... } // 方法声明...
ListInts(); // 0 个实参
ListInts(1, 2, 3); // 3 个实参
ListInts(4, 5, 6, 7, 8); // 5 个实参 当数组 inVals 在堆中被创建时实参的值被赋值到数组中因此可看做值参数
数组参数为值类型值被复制实参不受影响数组参数为引用类型引用被复制实参引用的对象在内部会受到影响。 图6.11 参数数组示例 6.15.2 将数组作为实参
编译器将使用传入的数组而不是重新创建一个。
6.16 参数类型总结 图6.12 参数类型语法使用总结 6.17 ref 局部变量和 ref 返回
创建别名的语法需要使用 ref 两次。 图6.13 创建 ref 局部变量 ref 返回使得方法可以返回引用而不是值同样也需要使用两次 ref 图6.14 ref 返回示例 有关 ref 的使用有如下注意事项
ref return 不能返回如下内容 空值。常量。枚举成员。类或结构体的属性。指向只读位置的指针。 ref return 不能返回方法内部的局部变量ref 局部变量只能被赋值一次后面出现的等号表示赋值如果调用 ref 返回方法时未使用 ref 关键字则返回的是值而不是引用将 ref 局部变量作为常规的实际参数传递给其他方法时传递的仍是 ref 指向的副本而不是引用。
6.18 方法重载
使用相同名称的方法必须和其他同名方法有不同的签名签名由如下信息组成
方法名称。参数数目。参数的数据类型和顺序。参数修饰符。
返回类型和形参名称都不是签名的一部分。 图6.15 签名组成成分 6.19 命名参数
C# 可以使用命名参数显示指定参数的名称就能够以任意顺序在方法中列出实参。 图6.16 命名参数示例 可以同时使用位置参数和命名参数但所有位置参数必须先列出。 图6.17 位置参数和命名参数同时使用 6.20 可选参数
可选参数能够设置参数的默认值图 6.18 列出了哪些时候能使用可选参数。 图6.18 可选参数只能是值参数类型 所有必填参数需放在可选参数声明之前params 参数放在可选参数之后如图 6.19 所示。 图6.19 所有参数声明顺序 必须从可选参数列表的最后向前开始省略而不是任意省略参数。如果需要任意省略参数需要配合命名参数来实现以消除赋值的歧义。
class MyClass {double GetCylinderVolume(double radius 3.0, double height 4.0) {return 3.1416 * radius * radius * height;}static void Main() {MyClass mc new MyCalss();double volume;volume mc.GetCylinderVolume(3.0, 4.0); // 位置参数volume mc.GetCylinderVolume(radius: 2.0); // 使用 height 默认值volume mc.GetCylinderVolume(height: 2.0); // 使用 radius 默认值volume mc.GetCylinderVolume(); // 使用两个默认值}
}6.21 栈帧
调用方法时内存从栈的顶部开始分配保存和方法关联的一些数据项。这块内存称为方法的栈帧。
栈帧包含如下内容 返回地址即方法返回时继续执行的位置。分配内存的参数即值参数参数数组如果有的话。和方法调用相关的其他管理数据项。 在方法调用时整个栈帧都会压入栈。方法退出时整个栈帧会从栈上弹出也称栈展开。
6.22 递归*