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 } ...
随机推荐
- PHP array_multisort()函数超详细理解
项目中用到这个函数了 ,起初对这个函数一直是懵逼状态,文档都看的朦朦胧胧的 网上无意间看到这篇文章 ,写的超级详细,收藏了 . 当然要先放原地址:https://www.cnblogs.com/WuN ...
- linux 服务器被植入ddgs、qW3xT.2挖矿病毒处理记录
被入侵后的现象: 发现有qW3xT.2与ddgs两个异常进程,消耗了较高的cpu,kill掉后 过一会就会重新出现. kill 掉这两个异常进程后,过一段时间看到了如下进程: 首先在/etc/sysc ...
- Diycode开源项目 Glide图片加载分析
1.使用Glide前的准备 1.1.首先要build.gradle中添加 github原地址点击我. 参考博客:Glide-开始! 参考博客:android图片加载库Glide的使用介绍. 参考博 ...
- git上传自己的代码
感谢这个哥们的博客,不过里面有些错误. http://www.cnblogs.com/ruofengzhishang/p/3842587.html 下面是我自己的实践成功的: 这篇文章写得是windo ...
- Go语言之并发编程(二)
通道(channel) 单纯地将函数并发执行是没有意义的.函数与函数间需要交换数据才能体现并发执行函数的意义.虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态问题 ...
- IOS开发学习笔记033-UIScrollView
1.滚动显示图片 如果图片过大,则需要滚动显示,这是需要用到类UIScrollView,可是实现控件的水平和垂直滚动. 可用三步实现:1 设置UIScrollView,2 设置UIImageView, ...
- win7装python3.6提示api-ms-win-runtime-1-1-0.dll丢失
win7为MSDN下的旗舰版,没有servicepack1那个,刚开始安装python3.6提示必须得安装servicepack1,于是乎到微软官网下了个900mb大小的安装包. https://ww ...
- Python基础-week08 并发编程
一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...
- Leetcode 498.对角线遍历
对角线遍历 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 示例: 输入: [ [ 1, 2, 3 ], [ 4, 5, ...
- Leetcode with Python -> Array
118. Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, ...