02010601 方法01-初识方法

02010601 方法01-初识方法

1. 方法的结构

  • 方法是一块具有名称的代码,可以使用方法的名称从别的地方执行代码,可以把数据传入方法并接收数据输出。
  • 方法由方法头和方法体两部分组成。
1.1 方法头
  • 方法头指定方法的特征
    • 方法是否有返回值,如果返回,返回什么类型。
    • 方法的名称。
    • 哪种类型的数据可以传递给方法或从方法返回,以及如何处理这些数据。
// 方法头
  int     MyFunc01(int myInt, string myStr) 
   ↑          ↑             ↑
返回值类型   方法名称        参数列表

2. 方法体内部的代码执行

  • 方法体是一个块,是{}括起来的可执行的语句序列,方法执行过程从方法体的第一句语句开始,一直到整个方法结束。块可以包含以下内容

    • 局部变量

    • 控制流结构

    • 方法调用

    • 内嵌的块

    • 其它方法,称为局部函数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo01
{
    class Program
    {
        static void Main(string[] args) // Main方法,程序的入口
        {
            MyFunc(); // 调用方法
        }

        static void MyFunc() // 方法头
        {
            int myInt = 3; // 局部变量
            while (myInt > 0) // 控制流
            {
                Console.WriteLine(myInt);
                --myInt;
            }
            Console.ReadLine();
        }
    }
}

控制台输出:
3
2
1

3. 局部变量

  • 局部变量用来保存数据
    • 字段通常保存和对象状态有关的数据。
    • 局部变量用于保存局部的或临时的计算数据。
  • 局部变量声明的形式
    int       myInt         =3;
     ↑          ↑            ↑
局部变量类型   局部变量名称   可选的初始化语句

说明:
1. 局部变量的存在和生存期仅限于创建他的块以及其内嵌的块,局部变量从声明它的那一个点开始存在,在块完成执行时结束存在。
2. 局部变量可以在方法体内任意位置声明,但必须先声明再使用。
3.1 对比字段和局部变量
实例字段 局部变量
生存期 从实例被创建开始,直到实例不再被访问结束 从它在块中被声明时开始,在块完成时结束
隐式初始化 初始化该类型的默认值 没有隐式初始化,如果变量在使用前没有被赋值,编译器会产生一条错误信息
存储区域 由于实例是类的成员,所以所有字段都存储在堆里,无论他是值类型还是引用类型 值类型:存储在栈里
引用类型:引用存储在栈里,数据存储在堆里
3.2 类型推断和var关键字
  • var关键字并不是类型名称,它只是语法上的速记,表示任何可以从初始化语句的右边推断出的类型。
static void Main()
{
	int myInt01 = 3; // 显式的声明局部变量的类型
    string myStr01 = "Qinway"; // 显式的声明局部变量的类型
    
    var myInt02 = 3; // 编译器能够推断出3是int类型
    var myStr02 = "Qinway"  // 编译器能够推断出Qinway是字符串类型
}

说明:
1. 在上述代码段中,在声明局部变量的时候显示的声明变量类型有些多余。为了避免这种多余,可以在变量声明的开始部分用var关键字替换显式声明的类型。
2. var关键字不是表示特殊的局部变量,它只是语法上的速记,表示任何可以从初始化语句右边推断出来的类型。
  • 使用var关键字的条件
    • 只能用于局部变量,不能用于字段
    • 只能在变量声明中包含初始化时使用
    • 一旦编译器推断出变量的类型,那么这个变量的类型就是固定且不能更改的。(var关键字并不能改变C#是强类型语言的性质)
3.3 嵌套块中的局部变量
  • 方法体内部可以嵌套其它的块

    • 可以是任意数量的块,并且它们即可是是嵌套的,也可以是顺序的。块可以嵌套到任何级别。
    • 局部变量可以在嵌套块的内部声明,并且和所有局部变量一样,它们的生成器和可见性仅限于声明它们的块以及内嵌的块。
  • 在C#中可以先声明一个局部变量,然后在嵌套块中声明另一个与局部变量相同的局部变量。

static void Main()
{
    int myInt01 = 10; // 声明局部变量myInt01
    {
        int myInt01 = 5; // 在嵌套的块中声明同名的局部变量myInt
        Console.WriteLine(myInt01); // 此时输出5
        int myInt02 = 20;
    }
    
    // int myInt = 3; // 错误写法
	// Console.WriteLine(myInt02); // 错误写法
}

说明:
1. 在嵌套块内部同名的局部变量会掩盖外部的局部变量。
2. 不管嵌套级别如何,都不能在第一个名称有效范围内声明另一个同名的局部变量。
3. 在块的外部无法访问内嵌块定义的局部变量。

4. 局部常量

  • 局部常量和局部变量类似,必须声明在块的内部。局部常量一旦被初始化,它的值就不能改变。
  • 局部常量的特征
    • 在声明时必须初始化
    • 在声明后值不能改变
// 声明一个局部常量
const int myInt = value;

说明:
1. 局部常量在类型之前加const关键字。
2. 局部常量必须有初始化语句,初始化值在编译期决定。
3. 局部常量通常是一个预定义简单类型或由其组成的表达式。
4. 布局常量可以是null引用,但它不能是对象的引用,因为对象是在运行时创建的。
  • 局部常量声明在方法体或代码块里,在声明它的块结束的地方失效。

5. 控制流

  • 控制流指的是程序从头到尾的执行流程,默认情况下程序执行顺序时从一条语句到下一条语句,控制流允许你改变执行的顺序。控制流包含如下三类:
    • 选择语句
    • 迭代语句
    • 跳转语句

6. 返回值

  • 方法可以向调用代码返回一个值,返回的值被插入到调用代码中发起调用的表达式所在的位置。
    • 方法有返回值 → 方法必须在声明的时候声明一个返回类型。返回语句用return及其后面的表达式组成。
    • 方法不返回值 → 方法必须在声明时声明为void类型,void方法不需要返回语句。

7. 返回语句和void用法

  • 有返回值的方法必须有返回语句,void方法不需要返回语句。当特定条件符合的时候,我们可以提前退出方法以简化程序逻辑。
    • 用void声明的方法,可以在任何时候使用返回语句退出方法,不带参数。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo01
{
    class Program
    {
        static void Main(string[] args)
        {
            MyFunc();
            Console.ReadLine();
        }

        static void MyFunc()
        {
            DateTime dt = DateTime.Now; // 获取当前日期和时间
            if (dt.Hour > 12) // 若小时数小于12,执行块内的代码
            { 
                Console.WriteLine("现在是下午!");
                return; // 直接把控制流返回到调用代码,不再往下执行方法体内的代码
            }

            Console.WriteLine("现在是上午!"); // 如果小时数小于12,因为return存在不再执行。
        }
    }
}

控制台输出:
现在是下午!

8. 局部函数

  • 从C# 7.0开始,可以在一个方法的内部声明另一个单独的方法,这样可以将嵌入的方法跟其他代码隔离开来。这些嵌入的方法只能在包含它的方法内调用,如果使用恰当,可以使得代码更清晰,而这些嵌入的方法称为局部函数。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo01
{
    class Program
    {
        static void Main(string[] args)
        {
            OuterFunc(); // 调用函数
            Console.ReadLine();
        }

        static void OuterFunc()
        {
            int InnerFunc(int myInt) // 声明局部函数
            {
                return myInt * 3;
            }

            Console.WriteLine(InnerFunc(5)); // 调用局部函数
        }
    }
}

控制台输出:
15

结尾

书籍:C#图解教程

著:【美】丹尼尔 · 索利斯;卡尔 · 施罗坦博尔

译:窦衍森;姚琪琳

ISBN:978-7-115-51918-4

版次:第5版

发行:人民邮电出版社

※敬请购买正版书籍,侵删请联系85863947@qq.com※

※本文章为看书或查阅资料而总结的笔记,仅供参考,如有错误请留言指正,谢谢!※

posted @ 2024-06-13 00:34  qinway  阅读(6)  评论(0)    收藏  举报