-> 方法
-> 方法的结构
方法是一块具有名称的代码。可以使用方法的名称从别的地方执行代码,也可以把数据传入方法并接收数据输出
方法有两个主要部分:
1、方法头
方法头指定方法的特征
2、方法体
方法体包含执行代码的语句序列
-> 方法体内部的代码执行
包含:
1、本地变量
2、控制流结构
3、方法调用
4、内嵌的块
-> 本地常量
本地变量经常用于保存本地的或临时的计算数据
-> 本地变量的存在性仅限于创建它的块及其内嵌的块
1、它从声明他的那一点开始存在
2、它在块完成执行时结束存在
-> 可以在方法体内任意位置声明本地变量,但必须在使用他们前声明
-> 实例字段和本地变量的对比
-> 类型推断和var关键字
使用var关键字有一些重要的条件
-> 只能用于本地变量,不能用于字段
-> 只能在变量声明中包含初始化时使用
-> 一旦编译器推断出变量的类型,他就是固定不能更改的
-> 嵌套块中的本地变量
-> 本地常量
特征:
1、常量在声明中必须初始化
2、常量在声明后不能改变
3、在类型之前增加const关键字
4、必须有初始化语句
控制流:
术语控制流指的是程序从头到尾的执行流程
1、选择语句
if、if...else、swith
2、迭代语句
for、while、do、foreach
3、跳转语句
break、continue、goto、return
-> 方法调用
可以从方法体的内部调用其他方法
-> 英文中call方法和invoke方法是同义的
-> 调用方法时要使用方法名并带上参数列表
-> 返回值
方法可以向调用代码返回一个值。
-> 返回语句和void方法
1、可以在任何时候使用 return; 返回语句退出方法
2、这种形式的返回语句只能用于声明为void的类型的方法
-> 参数
1、形参:
形参是声明在方法的参数列表中而不是方法体中的本地变量
1、因为形参是变量,所以它们有类型和名称,并能被写入和读出
2、和方法中的其他本地变量不同,参数在方法体的外面定义并在方法开始之前初始化。output参数除外
3、参数列表中可以有任意数目的形参声明,而且声明必须用逗号隔开。
-> 实参
1、用于初始化形参的表达式或变量称作实参
2、实参位于方法调用的参数列表中
3、每一个实参必须与对应形参的类型相匹配,或是编译器必须能够把实参隐式转换为那个类型
4、实参的数量必须和形参的数量一致。这种形式的参数叫做位置参数
-> 值参数
使用值参数,通过赋值实参的值到形参的方式把数据传递到方法。
方法被调用时,系统做如下操作:
1、在栈中为形参分配空间
2、复制实参到形参
值类型和值参数:
-> 值类型就是指类型本身包含其值
-> 值参数是实参值复制给形参的参数
实参和形参在方法执行的不同阶段时的值:
1、在方法被调用前,用作实参的变量已经在栈里了
2、随着方法的开始,系统在栈中为形参分配空间,并从实参复制值
-> 对于引用类型,引用被复制,结果实参和形参都引用堆中的同一个对象
-> 对于值类型,值被复制,产生了一个独立的数据项。
3、方法执行后,形参被从栈中弹出
值类型,它的值不受方法行为的影响
引用类型,它的值被方法的行为该变了
-> 引用参数
-> 使用引用参数时,必须在方法的声明和调用中都是用ref修饰符
-> 实参必须是变量,在用作实参前必须被赋值。如果是引用类型变量,可以赋值为一个引用或null值
-> 形参的参数名看起来就好像是实参变量的别名,也就是说,他们指向的是相同的内存位置。所以,在方法的执行过程中对形参做的任何改变在方法完成后依然有效
-> 记住要在方法的声明和调用上都是用ref关键字。
-> 输出参数
输出参数用于从方法体内把数据传出到调用代码,非常类似引用参数。
-> 必须在声明和调用中都是用修饰符。输出参数的修饰符是out不是ref
-> 和引用参数相似,实参必须是变量,而不是其它类型的表达式。因为方法需要内存位置保存返回值。
-> 在方法内部,输出参数在被读取之前必须被赋值。
-> 在方法返回之前,方法内部的任何贯穿的可能路径都必须为所有输出参数进行一次赋值。
-> 参数数组
-> 在一个参数列表中只能有一个参数数组
-> 如果有,它必须是列表中的最后一个
-> 在数据类型前使用params修饰符
-> 在数据类型后放置一组空的方括号 params int[] arr
-> 数组:
1、数组是一组整齐的相同类型的数据项
2、数组使用一个额数字索引进行访问
3、数组是一个引用类型,因此它的所有数据向都保存在堆中
-> 方法调用
params修饰符的用法总结如下:
1、在声明中需要修饰符
2、在调用中不允许有修饰符
在使用一个为参数数组分离实参的调用时,编译器做了:
1、接收实参列表,用它们在堆中创建并初始化一个数组
2、把数组的引用保存到栈中的形参里
3、如果在对应的形参数组的位置没有实参,编译器会创建一个有0个元素的数组来使用。
-> 数组作参数
也可以在方法调用之前创建并组装一个数组,把单一的数组变量作为实参传递。此时,编译器使用你的数组而不是重新创建一个
-> 参数类型总结
-------------------------------------------------------------------------------------
|参数类型 修饰符是否在声明时使用 是否在调用时使用执行
| 值 无 系统把实参的值复制到形参
| 引用 ref是 是 形参是实参的别名
| 输出 out是 是 形参是实参的别名
| 数组 params是 否 允许传递可变数目的参数到方法
-------------------------------------------------------------------------------------
-> 方法重载
一个类中可以有一个以上的方法拥有相同的名称,这叫做方法重载
使用相同名称的每个方法必须有一个和其他方法不相同的签名。
-> 方法的签名由一下信息组成,它们在方法声明的方法头中:
1、方法的名称
2、参数的数目
3、参数的数据类型和顺序
4、参数修饰符
-> 返回类型不是签名的一部分。
-> 形参的名称也不是签名的一部分
-> 命名参数
从C#4.0开始,只要显示指定参数的名字,就可以以任意顺序在方法调用中列出参数。
1、方法的声明没有什么不一样,形参已经有名字了
2、不过在调用方法的时候,形参的名字后面跟着冒号和实际的参数值或表达式
如:声明时:public int Calc(int a,int b,int c)
调用时:.Calc(c:2,a:4,b:3);
-> 可选参数
C#4.0引入的另一个特性叫做可选参数。
所谓可选参数就是我们可以在调用方法的时候包含这个参数,也可以省略它。
声明可选参数:在方法声明的时候为参数提供默认值。
如:声明时:public int Clac(int a,int b=3) int b=3 即为可选参数
注意事项:
1、不是所有的参数类型都可以作为可选参数
-> 只有值类型的默认值在编译的时候可以确定,就可以使用值类型作为可选参数
-> 只有在默认值是null的时候,引用类型才可以作为可选参数来使用
2、所有必填参数必须在可选参数声明之前声明。如果没有params参数,必须在所有可选参数之后声明。
顺序:必填参数 - 可选参数 - params参数
3、你必须从可选参数列表的最后开始省略,一直到列表开头
4、也就是说,你可以省略最后一个可选参数,或是最后n个可选参数,但是不可以随意选择省略任意的可选参数,省略必须从最后开始。
-> 栈帧
在调用方法的时候,内存从栈的顶部开始分配,保存和方法关联的一些数据项,这块内存叫做方法的栈帧。
-> 栈帧包含的内存保存如下内容:
1、返回地址,也就是在方法退出的是继续执行的位置
2、这些参数分配的内存,也就是方法的值参数,或者还可能是参数数组
3、各种和方法调用相关的其他管理数据项
-> 在方法调用时,整个栈帧都会压入栈
-> 在方法退出的时候,整个栈帧都会从栈上弹出。弹出栈帧有的时候也叫做栈展开。
-> 递归
方法也可调用自身,这就做递归。
-> 方法的结构
方法是一块具有名称的代码。可以使用方法的名称从别的地方执行代码,也可以把数据传入方法并接收数据输出
方法有两个主要部分:
1、方法头
方法头指定方法的特征
2、方法体
方法体包含执行代码的语句序列
-> 方法体内部的代码执行
包含:
1、本地变量
2、控制流结构
3、方法调用
4、内嵌的块
-> 本地常量
本地变量经常用于保存本地的或临时的计算数据
-> 本地变量的存在性仅限于创建它的块及其内嵌的块
1、它从声明他的那一点开始存在
2、它在块完成执行时结束存在
-> 可以在方法体内任意位置声明本地变量,但必须在使用他们前声明
-> 实例字段和本地变量的对比
-> 类型推断和var关键字
使用var关键字有一些重要的条件
-> 只能用于本地变量,不能用于字段
-> 只能在变量声明中包含初始化时使用
-> 一旦编译器推断出变量的类型,他就是固定不能更改的
-> 嵌套块中的本地变量
-> 本地常量
特征:
1、常量在声明中必须初始化
2、常量在声明后不能改变
3、在类型之前增加const关键字
4、必须有初始化语句
控制流:
术语控制流指的是程序从头到尾的执行流程
1、选择语句
if、if...else、swith
2、迭代语句
for、while、do、foreach
3、跳转语句
break、continue、goto、return
-> 方法调用
可以从方法体的内部调用其他方法
-> 英文中call方法和invoke方法是同义的
-> 调用方法时要使用方法名并带上参数列表
-> 返回值
方法可以向调用代码返回一个值。
-> 返回语句和void方法
1、可以在任何时候使用 return; 返回语句退出方法
2、这种形式的返回语句只能用于声明为void的类型的方法
-> 参数
1、形参:
形参是声明在方法的参数列表中而不是方法体中的本地变量
1、因为形参是变量,所以它们有类型和名称,并能被写入和读出
2、和方法中的其他本地变量不同,参数在方法体的外面定义并在方法开始之前初始化。output参数除外
3、参数列表中可以有任意数目的形参声明,而且声明必须用逗号隔开。
-> 实参
1、用于初始化形参的表达式或变量称作实参
2、实参位于方法调用的参数列表中
3、每一个实参必须与对应形参的类型相匹配,或是编译器必须能够把实参隐式转换为那个类型
4、实参的数量必须和形参的数量一致。这种形式的参数叫做位置参数
-> 值参数
使用值参数,通过赋值实参的值到形参的方式把数据传递到方法。
方法被调用时,系统做如下操作:
1、在栈中为形参分配空间
2、复制实参到形参
值类型和值参数:
-> 值类型就是指类型本身包含其值
-> 值参数是实参值复制给形参的参数
实参和形参在方法执行的不同阶段时的值:
1、在方法被调用前,用作实参的变量已经在栈里了
2、随着方法的开始,系统在栈中为形参分配空间,并从实参复制值
-> 对于引用类型,引用被复制,结果实参和形参都引用堆中的同一个对象
-> 对于值类型,值被复制,产生了一个独立的数据项。
3、方法执行后,形参被从栈中弹出
值类型,它的值不受方法行为的影响
引用类型,它的值被方法的行为该变了
-> 引用参数
-> 使用引用参数时,必须在方法的声明和调用中都是用ref修饰符
-> 实参必须是变量,在用作实参前必须被赋值。如果是引用类型变量,可以赋值为一个引用或null值
-> 形参的参数名看起来就好像是实参变量的别名,也就是说,他们指向的是相同的内存位置。所以,在方法的执行过程中对形参做的任何改变在方法完成后依然有效
-> 记住要在方法的声明和调用上都是用ref关键字。
-> 输出参数
输出参数用于从方法体内把数据传出到调用代码,非常类似引用参数。
-> 必须在声明和调用中都是用修饰符。输出参数的修饰符是out不是ref
-> 和引用参数相似,实参必须是变量,而不是其它类型的表达式。因为方法需要内存位置保存返回值。
-> 在方法内部,输出参数在被读取之前必须被赋值。
-> 在方法返回之前,方法内部的任何贯穿的可能路径都必须为所有输出参数进行一次赋值。
-> 参数数组
-> 在一个参数列表中只能有一个参数数组
-> 如果有,它必须是列表中的最后一个
-> 在数据类型前使用params修饰符
-> 在数据类型后放置一组空的方括号 params int[] arr
-> 数组:
1、数组是一组整齐的相同类型的数据项
2、数组使用一个额数字索引进行访问
3、数组是一个引用类型,因此它的所有数据向都保存在堆中
-> 方法调用
params修饰符的用法总结如下:
1、在声明中需要修饰符
2、在调用中不允许有修饰符
在使用一个为参数数组分离实参的调用时,编译器做了:
1、接收实参列表,用它们在堆中创建并初始化一个数组
2、把数组的引用保存到栈中的形参里
3、如果在对应的形参数组的位置没有实参,编译器会创建一个有0个元素的数组来使用。
-> 数组作参数
也可以在方法调用之前创建并组装一个数组,把单一的数组变量作为实参传递。此时,编译器使用你的数组而不是重新创建一个
-> 参数类型总结
-------------------------------------------------------------------------------------
|参数类型 修饰符是否在声明时使用 是否在调用时使用执行
| 值 无 系统把实参的值复制到形参
| 引用 ref是 是 形参是实参的别名
| 输出 out是 是 形参是实参的别名
| 数组 params是 否 允许传递可变数目的参数到方法
-------------------------------------------------------------------------------------
-> 方法重载
一个类中可以有一个以上的方法拥有相同的名称,这叫做方法重载
使用相同名称的每个方法必须有一个和其他方法不相同的签名。
-> 方法的签名由一下信息组成,它们在方法声明的方法头中:
1、方法的名称
2、参数的数目
3、参数的数据类型和顺序
4、参数修饰符
-> 返回类型不是签名的一部分。
-> 形参的名称也不是签名的一部分
-> 命名参数
从C#4.0开始,只要显示指定参数的名字,就可以以任意顺序在方法调用中列出参数。
1、方法的声明没有什么不一样,形参已经有名字了
2、不过在调用方法的时候,形参的名字后面跟着冒号和实际的参数值或表达式
如:声明时:public int Calc(int a,int b,int c)
调用时:.Calc(c:2,a:4,b:3);
-> 可选参数
C#4.0引入的另一个特性叫做可选参数。
所谓可选参数就是我们可以在调用方法的时候包含这个参数,也可以省略它。
声明可选参数:在方法声明的时候为参数提供默认值。
如:声明时:public int Clac(int a,int b=3) int b=3 即为可选参数
注意事项:
1、不是所有的参数类型都可以作为可选参数
-> 只有值类型的默认值在编译的时候可以确定,就可以使用值类型作为可选参数
-> 只有在默认值是null的时候,引用类型才可以作为可选参数来使用
2、所有必填参数必须在可选参数声明之前声明。如果没有params参数,必须在所有可选参数之后声明。
顺序:必填参数 - 可选参数 - params参数
3、你必须从可选参数列表的最后开始省略,一直到列表开头
4、也就是说,你可以省略最后一个可选参数,或是最后n个可选参数,但是不可以随意选择省略任意的可选参数,省略必须从最后开始。
-> 栈帧
在调用方法的时候,内存从栈的顶部开始分配,保存和方法关联的一些数据项,这块内存叫做方法的栈帧。
-> 栈帧包含的内存保存如下内容:
1、返回地址,也就是在方法退出的是继续执行的位置
2、这些参数分配的内存,也就是方法的值参数,或者还可能是参数数组
3、各种和方法调用相关的其他管理数据项
-> 在方法调用时,整个栈帧都会压入栈
-> 在方法退出的时候,整个栈帧都会从栈上弹出。弹出栈帧有的时候也叫做栈展开。
-> 递归
方法也可调用自身,这就做递归。