当前位置: 首页 > news >正文

C# 方法(局部变量和局部常量)

本章内容:
方法的结构
方法体内部的代码执行
局部变量
局部常量
控制流
方法调用
返回值
返回语句和void方法
局部函数
参数
值参数
引用参数
引用类型作为值参数和引用参数
输出参数
参数数组
参数类型总结
方法重载
命名参数
可选参数
栈帧
递归

局部变量

和第5章介绍的字段一样,局部变量也保存数据。字段通常保存和对象状态有关的数据,而创
建局部变量经常是用于保存局部的或临时的计算数据。表6-1对比了局部变量和实例字段的差别。
下面这行代码展示了局部变量声明的语法。可选的初始化语句由等号和用于初始化变量的值
组成。

下面这行代码展示了局部变量声明的语法。可选的初始化语句由等号和用于初始化变量的值
组成。

image

下面的示例展示了两个局部变量的声明和使用。第一个是int类型变量,第二个是SomeClass
类型变量。

static void Main()
{int myInt=15;SomeClass sc=new SomeClass();...
}

对比实例字段昶局部变量

类型推断和var关键字

如果观察下面的代码,你会发现在声明的开始部分提供类型名时,你提供的是编译器能从初
始化语句的右边推断出来的信息。
在第一个变量声明中,编译器能推断出15是int型。
在第二个声明中,右边的对象创建表达式返回了一个MyExcellentClass类型的对象
所以在两种情况中,在声明的开始部分包括显式的类型名是多余的。

static void Main()
{int total=15;MyExcellentClass mec=new MyExcellentClass();...
}

为了避免这种冗余,可以在变量声明的开始部分的显式类型名的位置使用新的关键字var,

static void Main()
{//var关键字var total=15;var mec=new MyExcellentClass();...
}

var关键字并不是表示特殊变量。它只是句法上的速记,表示任何可以从初始化语句的右边推
断出的类型。在第一个声明中,它是int的速记;在第二个声明中,它是MyExcellentClass的速记。
前文中使用显式类型名的代码片段和使用var关键字的代码片段在语义上是等价的。

使用var关键字有一些重要的条件:
只能用于局部变量,不能用于字段;
只能在变量声明中包含初始化时使用;
一旦编译器推断出变量的类型,它就是固定且不能更改的。

说明 var关字不像JavaScript的var那样可以引用不同的类型。它是从等号右边推断出的实
际类型的速记。var关撻字并不改变C#的强类型性质

嵌套块中的局部变量

方法体内部可以嵌套其他的块。
可以有任意数量的块,并且它们既可以是顺序的也可以是嵌套的。块可以嵌套到任何级别。

局部变量可以在嵌套块的内部声明,并且和所有的局部变量一样,它们的生存期和可见
性仅限于声明它们的块及其内嵌块。
图6-3阐明了两个局部变量的生存期,展示了代码和栈的状态。箭头标出了刚执行过的行。
变量var1声明在方法体中,在嵌套块之前。
变量var2声明在嵌套块内部。它从被声明那一刻开始存在,直到声明它的那个块的尾部
结束。
当控制传出嵌套块时,它的局部变量从栈中弹出。

局部变量的生存期

说明 在C和C++中,可以先声明一个局部更量,然后在嵌套块中声明另一个名称相同的局部
变量。在内部范围,内部称掩盖了外部名称。然而,在c#中不管嵌套级别如何,都不
能在第一个称的有效范围内声明另一个同名的局部变量

局部常量

局部常量很像局部变量,只是一旦被初始化,它的值就不能改变了。如同局部变量,局部常
量必须声明在块的内部。
常量的两个最重要的特征如下。
在声明时必须初始化。
在声明后不能改变。
常量的核心声明如下所示。

image
语法与字段或变量的声明相同,只有如下两点不同。
在类型之前增加关键字const。
必须有初始化语句。初始化值必须在编译期决定,通常是一个预定义简单类型或由其组
成的表达式。它还可以是null引用,但它不能是某对象的引用,因为对象的引用是在运
行时决定的。

说明 关键字const不是修饰符,而是核心声明的一部分。它必须直接放在类型的前面。

就像局部变量,局部常量声明在方法体或代码块里,并在声明它的块结束的地方失效。例如,
在下面的代码中,类型为内嵌类型double的局部常量PI在方法DisplayRadii结束后失效。

void DisplayRadii()
{const double PI=3.1416; //声明局部常量for(int radius=1;radius<=5;radius++){double area=radius*radius*PI;//读取局部常量Console.WriteLine($"Radius:{radius},Area:{area}");}}

相关文章:

  • 快速集成 Flutter Shorebird 热更新
  • 【嵌入式Linux】基于ARM-Linux的zero2平台的智慧楼宇管理系统项目
  • 体系结构论文(八十二):A Comprehensive Analysis of Transient Errors on Systolic Arrays
  • 从此,K8S入门0门槛!
  • Android基础控件用法介绍
  • 见多识广4:Buffer与Cache,神经网络加速器的Buffer
  • 【Unity 游戏开发】角色控制模块技术要点拆解
  • 深入解析MapReduce:大数据处理的经典范式
  • 美丽天天秒链动2+1源码(新零售商城搭建)
  • Linux架构篇、第一章_03安装部署nginx
  • Python Cookbook-6.15 实现单例模式
  • C++模板知识
  • 3033. 修改矩阵
  • 序列数据(Sequential Data)​​:按顺序排列的动态信息载体
  • LabVIEW 中VI Server导出 VI 配置
  • 数字智慧方案5868丨智慧建造总体策划方案(68页PPT)(文末有下载方式)
  • 组件通信-<slot>
  • smss源代码分析之smss!SmpLoadSubSystemsForMuSession函数分析加载csrss.exe
  • yolov5 本地训练
  • Gradio全解20——Streaming:流式传输的多媒体应用(3)——实时语音识别技术
  • 五一假期上海多个景点人流如织,警方多措并举确保秩序
  • 旭辉控股集团:去年收入477.89亿元,长远计划逐步向轻资产业务模式转型
  • 澎湃读报丨解放日报8个版聚焦:牢记嘱托,砥砺奋进
  • 央行就《关于规范供应链金融业务引导供应链信息服务机构更好服务中小企业融资有关事宜的通知》答问
  • 国台办:民进党当局所谓“对等尊严”,就是企图改变两岸同属一中
  • 强制性国家标准《危险化学品企业安全生产标准化通用规范》发布