C#图解教程学习笔记——方法
一、字段和本地变量、本地常量
字段:隶属于类的变量,即类的成员变量。
本地变量:于保存本地的或临时的计算数据,即局部变量。
本地常量:必须声明在块内部,声明时必须初始化,声明后不能改变。
实例字段与本地变量区别图解:
本地变量生存周期图解:
注:
在C和C++中,可以先声明一个本地变量,然后在嵌套块中声明另一个同名本地变量。在内部范围,内部变量覆盖外部变量。然而,在C#中不管嵌套级别如何,都不能在第一个本地变量的有效范围内声明另一个同名本地变量。
二、类型推断和var关键字
若编译器能从初始化语句的右边推断出类型名,则可使用var关键字代替具体类型名。var不是特定的类型变量符号,它表示任何可以从初始化语句的右边推断出来的类型。
使用var的条件:
(1)只能用于本地变量,不能用于字段
(2)只能在变量声明中包含初始化时使用
(3)一旦编译器推断出变量的类型,它就是固定且不能更改的
注:
var关键字不像JavaScript的var那样可以引用不同的类型。它是从等号右边推断出的实际类型的速记。var关键字并不改变C#的强类型性质。
三、值参数、引用参数、输出参数、参数数组、命名参数、可选参数
1. 值参数
使用值参数,通过将实参的值复制到形参的方式把数据传递给方法。方法被调用时,系统做如下操作:
(1)在栈中为形参分配空间。
(2)将实参的值复制给形参。
方法中对形参的修改是否会影响方法外的实参?
若实参是值类型,值被复制,产生一个独立的数据,此时形参和实参存储在内存不同位置,方法中对形参的修改不会影响方法外的实参;若实参是引用类型,则引用被复制,此时虽然形参和实参是两个存储在内存不同位置的引用,但是它们都指向堆内存中同一个数据对象,所以方法中对形参的修改会直接影响方法外的实参。
2. 引用参数
使用引用参数的要求:
(1)必须在方法的声明和调用时都使用ref修饰符。
(2)实参必须是变量,在用作实参前必须被赋值。如果是引用类型变量,可以赋值为一个引用或null。
示例:
与值参数不同,引用参数不会为形参在栈上分配内存,实际上形参的参数名将作为实参变量的别名,指向相同的内存位置,所以在方法的执行过程中对形参做的任何改变在方法完成后依然有效。
关于引用类型对象作为值参数和引用参数的区别?
(1)将引用类型对象作为值参数传递:如果在方法内创建一个新对象并赋值给形参,将切断形参与实参间的关联,并且在方法调用结束后,新对象也将不复存在。(实参与形参是存储在不同内存位置的两个引用)
(2)将引用类型对象作为引用参数传递:如果在方法内创建一个新对象并赋值给形参,在方法结束后该对象依然存在,并且是实参所引用的值。(实参与形参是存储在相同内存位置的同一引用)
3. 输出参数
输出参数用于从方法体内把数据传出到调用代码,它们的行为与引用参数非常类似。
输出参数有以下要求:
(1)必须在声明和调用中都使用 out 修饰符。
(2)和引用参数类似,实参必须是变量。
(3)在方法内部,输出参数在被读取前必须赋值。
(4)方法返回前,方法内任何返回路径都必须为所有输出参数进行赋值。
示例:
注:
与引用参数相同的是,输出参数的形参就好像是实参的别名一样;与引用参数不同的是,变量在用作实参时可以不用先赋值。
4. 参数数组
参数数组允许零个或多个实参对应一个特殊的形参。
(1)限制与要求:
<1>在一个参数列表中只能有一个参数数组。
<2>如果有,它必须是列表中最后一个。
<3>由参数数组表示的所有参数都必须具有相同类型。
(2)声明与调用方法:
<1>声明示例:
<2>两种调用方法:
逗号分隔的该数据类型元素列表:
ListInts(10,20,30);
该数据类型元素的一维数组:
int[] intArray={1,2,3};
ListInts(intArray);
<3>编译器对数组参数的处理:
使用参数列表作为实参:
接受实参列表,用它们在堆中创建并初始化一个数组。
把数组的引用保存在栈中的形参里。
如果在对应的形参数组位置没有实参,编译器会创建一个有零个元素的数组来使用。
使用数组变量作为实参:
直接使用作为实参的数组,而不是重新创建一个。
5. 命名参数
C#允许我们使用命名参数(named parameter),只要显式指定参数名字,就可以以任意顺序在方法调用中列出实参。
示例:
6. 可选参数
可选参数就是我们可以在调用方法时包含这个参数,也可以省略。 为了表明名某参数可选,你需要在方法声明时为参数提供默认值。
示例:
(1)不是所有参数类型都可以作为可选参数。只要值类型的默认值在编译时可以确定,就可以使用值类型作为可选参数;只有在默认值是null时,引用类型才可以作为可选参数。
(2)所有必填参数必须在可选参数前声明。如果有params参数,必须在可选参数后声明。
(3)当有多个可选参数时,默认情况下只能省略后面几个。若实际调用情况不符合该规则,可以使用命名参数,指定参数名称进行传值。
四、方法重载
一个类中可以用一个以上的方法拥有相同名称,这叫方法重载(method overload)。使用相同名称的方法必须有一个和其他方法不同的签名(signature)。
方法的签名由下列信息组成:
(1)方法的名称
(2)参数的数目
(3)参数的数据类型和顺序
(4)参数修饰符
注:
返回类型不是签名的一部分,形参名称也不是签名的一部分。
五、栈帧
调用方法时,内存从栈顶开始分配,保存和方法关联的一些数据项。这块内存叫做方法的栈帧(stack frame)。
栈帧内存包含以下内容:
(1)返回地址,即方法退出时继续执行的位置。
(2)参数分配的内存,也就是方法的值参数,或参数数组。
(3)各种和方法调用相关的其他管理数据项。
在方法调用时,整个栈帧会压入栈。
在方法退出时,整个栈帧从栈上弹出。弹出栈帧也叫栈展开(unwind)。
示例:
栈帧图示:
C#图解教程学习笔记——方法的更多相关文章
- C#图解教程学习笔记——数据类型与数据存储
一.数据类型1. 预定义类型C#提供16种预定义类型,包括13种简单类型和3种非简单类型:(1)简单类型<1>11种数值类型: 不同长度的有符号和无符号整数类型 浮点数的float和dou ...
- C#图解教程学习笔记——转换
一.什么是转换转换(conversion)是指接受一个类型的值并使用它作为另一个类型的等价值的过程.转换后的值应和源值是一样的,但其类型为目标类型. 二.隐式转换和显式转换(强制转换)1. 隐式转换( ...
- C#图解教程学习笔记——接口
一.接口概念接口是指定一组函数成员而不实现它们的引用类型.所以只能类和结构来实现接口. 二.声明接口1. 接口声明不能包含:数据成员.静态成员,只能包含以下类型的非静态成员函数:方法.属性.事件.索引 ...
- C#图解教程学习笔记——事件
一.事件的定义事件:当一个特定的程序事件发生时,程序的其他部分可以得到该事件已经发生的通知,同时运行相应处理程序.事件的很多部分都与委托类似.实际上,事件就像专门用于特殊用途的简单委托.事件包含了一个 ...
- C#图解教程学习笔记——委托
一.委托概述委托和类一样,是用户自定义类型,也是引用类型.但类表示的是数据和方法的集合,而委托持有一个或多个方法,以及一系列预定义操作. 可以通过以下操作步骤来使用委托:(1)声明一个委托类型.委托声 ...
- C#图解教程学习笔记——类和继承
一.屏蔽基类的成员所有类都派生自object类.虽然类只能直接继承一个基类,但继承的层次没有限制.虽然派生类不能删除它继承的任何成员,但可以用与基类同名的成员来屏蔽(mask)基类成员.1. 要屏蔽一 ...
- C#图解教程学习笔记——类相关的概念
一.一些基本概念1. 字段:隶属于类的变量,即类的成员变量.2. 方法:隶属于类的函数,即类的成员函数.3. 实例成员:类的每个实例拥有自己的各个类成员的副本,这些成员称为实例成员. 改变一个实例字段 ...
- 【C#图解教程学习笔记】第13章 委托
13.1 什么是委托 委托是持有一个或多个方法的对象,可将一个方法传递到另一个方法. 委托是用户自定义的引用类型. 13.2 委托概述 类表示的是数据和方法的集合,而委托持有一个或多个方法,以及一系列 ...
- Webpack新手入门教程(学习笔记)
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 30.0px Helvetica; color: #000000 } ...
随机推荐
- vmware 开机自动启动
vmware开机自动启动, 可以使用vmrun命令. 1. 首先在“我的电脑”-“属性”-“高级”-“环境变量”-“PATH”中添加vmware路径,如:C:\Program Files (x86)\ ...
- vue之神奇的动态按钮
今天我们将利用vue的条件指令来完成一个简易的动态变色功能按钮 首先我们还是要对vue进行配置,在上篇随笔中有相关下载教学. 然后我们要在html页面上搭建三个简易的按钮,颜色分别为紫,绿和蓝(颜色随 ...
- [译]The Python Tutorial#3. An Informal Introduction to Python
3. An Informal Introduction to Python 在以下示例中,输入和输出以提示符(>>>和...)的出现和消失来标注:如果想要重现示例,提示符出现时,必须 ...
- STM32位带操作
STM32的位带操作是基于cortex内核自带的,而不是st公司独创.基本的思路就是用一个32位的地址空间访问一个bit,因为stm32只支持32位数据的读取,不像51单片机一样,是可以单独对一位操作 ...
- HashMap的实现原理和底层数据结构
看了下Java里面有HashMap.Hashtable.HashSet三种hash集合的实现源码,这里总结下,理解错误的地方还望指正 HashMap和Hashtable的区别 HashSet和Hash ...
- Android广告页循环播放
摘要:项目要求做一个广告页,实现几秒更换一次广告页,下方还有指示第几张广告页,同样也支持手动左滑或右滑. 1.准备好粘贴5个有关广告页的类. ①BaseViewPager==>自定义高度的Vie ...
- 12,scrapy框架之post请求
今日概要 递归爬取解析多页页面数据 scrapy的post请求发送 1.递归爬取解析多页页面数据 - 需求:将糗事百科所有页码的作者和段子内容数据进行爬取切持久化存储 - 需求分析:每一个页面对应一个 ...
- MVC中Spring.net 对基类控制器无效 过滤器控制器无效
比如现在我又一个BaseController作为基类控制器,用于过滤权限.登录判断等作用,其它控制由原本的继承Controller,改为继承BaseController.然后BaseControlle ...
- Logistic回归python实现小样例
假设现在有一些点,我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作回归.利用Logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,依次进行分类.Lo ...
- 使用 SpiritManager 类管理在 XNA 游戏中的精灵(十四)
平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...