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

浙公网安备 33010602011771号