C图解教程第5章读书笔记

关键字:类的方法,本地变量,var关键字,参数

第五章 方法

  • 方法是一块具有名称的代码,可以使用方法的名称从别的地方执行代码,也可以把数据传入方法接受数据输出。
  • 方法由两部分组成:方法头和方法体。
    • 方法头指定了方法的返回数据,如返回类型。方法的名称,那些数据可以传递给方法。
    • 方法体包含可值星带的语句序列。

5.3 本地变量

  • 在方法中也可以声明变量,语法与声明字段相同。
  • 本地变量的存在和生产期仅限于创造它的块和其内嵌的块。
    • 它从声明的那一点开始存在。
    • 它在块完成执行时结束存在。
    • 可以在任意位置声明,但是必须在使用前声明。

%E7%AC%AC%E4%BA%94%E7%AB%A0%20%E6%96%B9%E6%B3%95%20511c717bb6684421856e46cdc4e4ede7/Untitled.png

对比实例字段和本地变量

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
2
3
4
void MyMethod(ref int val){ ...}
int y =1;
MyMethod(ref y);
Mymethod(ref 2+3);//不可以,必须使用变量
  • 引用参数不会为形参在栈上分配内存,形参的参数名作为实参变量的别名,指向相同的内存位置。

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
    28
    using 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关键字,这与其他修饰符并不一致。
  • 如果接受的是一个一个实参,则会在方法的内部生成一个数组,让后将参数存在其中。如果传入的是数组,则会直接使用数组。

%E7%AC%AC%E4%BA%94%E7%AB%A0%20%E6%96%B9%E6%B3%95%20511c717bb6684421856e46cdc4e4ede7/Untitled%201.png

参数类型总结

5.16 方法重载

  • 一个类中可以有一个以上的方法具有相同的名称,这叫做方法重载。
  • 虽然名称相同,但是每个方法必须有一个地方与其他方法不同,这些地方有:
    • 方法的名称
    • 参数的数目
    • 参数的数据类型和顺序
    • 参数修饰符
    • 注意:返回类型和形参的名称算在其中

5.17 命名参数

  • 之前的每一次使用,实参的位置都是与对应的形参一一对应,但是我们还可以使用命名参数,只要显示指定参数的名字,就可以以任意顺序在方法调用中使用实参。形如:c.Calc(c: 2,a: 3,b: 4);

5.18 可选参数

  • C#允许使用可选参数,可选参数即使在嗲用方法的时候可以包含这个参数,也可以省略。为了标识某个参数是可选的,需要在方法声明的时候为参数提供默认值。形如:public int Calc(int a, int b = 3)
  • 不是所有参数类型都可以作为可选参数,值类型都可以,引用类型只有在默认值为null的时候可以。简单总结就是在编译器可以确定这个值的才可以。
  • 所有必填参数必须放在可选参数之前声明。可变参数放在可选参数之后声明。
作者

liukun

发布于

2020-11-26

更新于

2021-04-15

许可协议