C图解教程第5章读书笔记
关键字:类的方法,本地变量,var关键字,参数
第五章 方法
- 方法是一块具有名称的代码,可以使用方法的名称从别的地方执行代码,也可以把数据传入方法接受数据输出。
- 方法由两部分组成:方法头和方法体。
- 方法头指定了方法的返回数据,如返回类型。方法的名称,那些数据可以传递给方法。
- 方法体包含可值星带的语句序列。
5.3 本地变量
- 在方法中也可以声明变量,语法与声明字段相同。
- 本地变量的存在和生产期仅限于创造它的块和其内嵌的块。
- 它从声明的那一点开始存在。
- 它在块完成执行时结束存在。
- 可以在任意位置声明,但是必须在使用前声明。
对比实例字段和本地变量
5.3.1 类型推断和var关键字
- 当编译器可以从初始化语句的右边推测出左边的类型时,可以在声明类型的位置使用关键字
var
。 - var关键字并不是特定类型变量的符号,它只是语法上的速记,表示可以从初始化语句的右边推断出的类型。
- 只能用于本地变量,不能用于字段。
- 只能在变量声明中包含初始化使用。
- 一旦编译器推断出变量的类型,那么就是固定的不能更改的。
- var关键字不是JavaScript中的var那样可以引用不同的类型。C#还是强类型的性质。
5.3.2 嵌套块中的本地变量
- 方法体内部可以嵌套任意数量的块,可以是顺序的,也可以是更深层的嵌套,可以嵌套任意级别。
- 本地变量可以在嵌套块的内部声明,声明周期和可见性仅限于声明它们的块及其内嵌块。
- 在C和C++中,可以先声明一个本地变量,然后在嵌套块中声明另一个相同名称的本地变量,在内部中,内部名称掩盖了外部名称,但是在C#中不管如何嵌套,都不能在第一个名称的有效范围内声明另一个同名的本地变量。
5.4 本地常量
- 本地常量类似本地变量,只是一旦初始化后就不能改变了,如同本地变量。
- 使用关键字const,必须有初始化语句,初始化必须在编译器决定,可以是null引用,但是不能是对象的引用,因为对象的引用是在运行时决定的。
- 声明形如:
consot double Pi = 3.14
5.5 控制流
- 选择语句
- if
- if…else
- wsitch
- 迭代语句
- for
- while
- do
- foreach
- 跳转语句
- break 跳出当前循环
- continue 到循环的底部
- goto 到一个命名的语句
- return 返回到调用方法继续执行
5.9 参数
5.9.1 形参
- 形参是本地变量,它声明在方法的参数列表中,而不是在方法体中。
5.9.2 实参
- 当代码调用一个方法时,形参的值必须在方法的代码执行前被初始化。用于初始化形参的表达式或变量称为实参。
5.10 值参数
- 方法被调用时,系统将在栈中为形参分配空间,将实参的值复制给形参。
- 值参数可以是任何能计算成相应数据类型的表达式。
5.11 引用参数
- 使用引用参数,必须在方法和调用中都使用ref修饰符。
- 实参必须是变量,在作为实参前必须复制。如果是引用类型变量,可以赋值为一个引用 null。
1 | void MyMethod(ref int val){ ...} |
- 引用参数不会为形参在栈上分配内存,形参的参数名作为实参变量的别名,指向相同的内存位置。
5.12 引用类型作为值参数和引用参数
- 将引用类型对象作为值参数传递,如果在方法内创建一个新对象并赋值给形参,将切断形参和实参之间的关联,并且在方法结束调用之后,新对象也将不复存在。
- 将引用类型对象作为引用参数传递,如果在方法内创建一个新对象并赋值给形参,在方法结束后该对象依然存在,并且是实参所引用的值。
- PS:跟绕口令一样。就是值参数不影响原来的实参,而引用参数会影响。
5.13 输出参数
输出参数用于从方法体内把数据传出到调用代码,它们的行为与引用参数非常类型,如同引用参数,输出参数有以下要求。
- 必须在声明和调用时使用修饰符,修饰符是out。
- 实参必须是变量,而不能是表达式,因为方法需要内存位置来保存返回值。
1
2
3
4`
void MyMethod(out int val){ ...}
int y =1;
MyMethod(out y);- 以下是网络例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public void getValues(out int x, out int y )
{
Console.WriteLine("Enter the first value: ");
x = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Enter the second value: ");
y = Convert.ToInt32(Console.ReadLine());
}
static void Main(string[] args)
{
NumberManipulator n = new NumberManipulator();
/* local variable definition */
int a , b;
/* calling a function to get the values */
n.getValues(out a, out b);
Console.WriteLine("After method call, value of a : {0}", a);
Console.WriteLine("After method call, value of b : {0}", b);
Console.ReadLine();
}
}
}
5.14 参数列表
- 类似Java中的可变参数,语法为
void ListInts(params int[] inVals)
,其中params为修饰符 - 可变参数必须是列表中的最后一个。
- 使用时可以一个一个传入实参,也可以先声明并初始化数字后传入,注意,使用时不需要写params关键字,这与其他修饰符并不一致。
- 如果接受的是一个一个实参,则会在方法的内部生成一个数组,让后将参数存在其中。如果传入的是数组,则会直接使用数组。
参数类型总结
5.16 方法重载
- 一个类中可以有一个以上的方法具有相同的名称,这叫做方法重载。
- 虽然名称相同,但是每个方法必须有一个地方与其他方法不同,这些地方有:
- 方法的名称
- 参数的数目
- 参数的数据类型和顺序
- 参数修饰符
- 注意:返回类型和形参的名称算在其中
5.17 命名参数
- 之前的每一次使用,实参的位置都是与对应的形参一一对应,但是我们还可以使用命名参数,只要显示指定参数的名字,就可以以任意顺序在方法调用中使用实参。形如:
c.Calc(c: 2,a: 3,b: 4);
5.18 可选参数
- C#允许使用可选参数,可选参数即使在嗲用方法的时候可以包含这个参数,也可以省略。为了标识某个参数是可选的,需要在方法声明的时候为参数提供默认值。形如:
public int Calc(int a, int b = 3)
- 不是所有参数类型都可以作为可选参数,值类型都可以,引用类型只有在默认值为null的时候可以。简单总结就是在编译器可以确定这个值的才可以。
- 所有必填参数必须放在可选参数之前声明。可变参数放在可选参数之后声明。
C图解教程第5章读书笔记