一 何为方法

方法是一块具有名称的代码,是类的函数成员。

方法主要分为方法头和方法体。

void Method()
{
语句1;
语句2;
}

二 类型推断和var关键字

var sum = 15;
var myClass = new MyClass();

var关键字是句法上的速记,表示任何可以从初始化语句右边判断出的类型。


三 方法调用

var myClass = new MyClass();
myClass.Show();


四 返回值

方法可以向调用代码返回一个值,返回的值被插入到调用代码中发起调用的表达式所在的位置。

  • 如果方法不返回值,必须声明为void
  • 如果方法返回值,则必须声明一个返回类型

声明了返回类型的方法,必须在其方法体中使用由return关键字构成的表达式来返回一个值。


五 参数

5.1 形参

形参是本地变量,它声明在方法的参数列表中。

参数列表中可以有任意数量的形参,用逗号隔开。

形参在整个方法体内使用。

5.2 实参

当代码调用一个方法时,形参的值必须在方法的代码开始执行之前被初始化

  • 用于初始化形参的表达式或变量成为实参
  • 实参位于方法调用的参数列表中
  • 每一个实参必须与对应形参的类型相匹配,或是编译器能实现隐式转换

六 值参数

使用值参数,通过将实参的值复制给形参的方式把数据传递给方法。

方法被调用时,系统在栈中为形参分配空间,将实参的值复制给形参。


七 引用参数

使用引用参数,必须在方法的声明和调用中使用ref修饰符。

void Method(ref int val)
{ ... }

使用引用参数,实参必须是变量,在用作实参前变量必须被赋值。如果是引用类型变量,可以赋值为一个引用或null。

对于值参数,系统在栈上为形参分配内存,而引用参数则不同,它有如下特征:

  • 不会为形参在栈上分配内存;
  • 形参的参数名将作为实参变量的别名,指向相同的内存地址。即在方法的执行过程中对形参的任何改变就如同对实参的改变。

八 引用类型作为值参数和引用参数

对于一个引用类型的对象,无论是将其作为值参数传递或引用参数传递,都可以在方法内部对该对象的成员进行操作。

  • 将引用类型对象作为值参数传递时:如果在方法内部实例一个新对象并赋值给形参,将切断形参和实参之间的关联,并在方法调用结束后,新对象也将不复存在;
  • 将引用类型对象作为引用参数传递时:如果在方法内部实例一个新对象并赋值给形参,在方法结束后该对象仍然存在,并且是实参所引用的值。

九 输出参数

输出参数用于从方法体内部把数据传到调用代码,使用out修饰符。

void Method(out int val)
{ ... }

与引用参数类似,输出参数的形参担当实参的别名,形参和实参都是同一块内存位置的名称。

在方法内部,输出参数在被读取之前必须被赋值,这意味着参数的初始值是无关的,且没必要在方法调用前为实参赋值。

在方法返回之前,方法内部贯穿的任何可能路径都必须为所有输出参数进行一次赋值。


十 参数数组

void Method(params int[] arrayInt)
{ ... } //调用方式1
Method(10,20,30);
//调用方式2
int[] arrayInt = {10,20,30};
Method(arrayInt);
  • 在一个参数列表中只能有一个参数数组;
  • 如果有,它必须是列表中的最后一个;

十一 参数类型总结


十二 方法重载

一个类中可以有一个以上的方法拥有相同的名称,这叫做方法重载 method overload。

使用相同方法的名称必须有一个和其他方法不同的签名。

方法的签名有下列信息组成:

  • 方法的名称;
  • 参数的数量;
  • 参数的数据类型和数量;
  • 参数修饰符;

需要注意的是,返回类型不是签名的一部分!


十三 命名参数

class MyClass
{
public int Calc(int a, int b, int c)
{
return a + b + c;
} static void Main()
{
var myClass = new MyClass();
var sum = myClass.Cals(c:2, a:4, b:3); //使用命名参数,可以显示指定参数名字来赋值
}
}

十四 可选参数

使用可选参数,可以让我们在调用方法的时候省略这个参数。

为了表明某个参数是可选的,需要在方法声明时为参数提供默认值。

class MyClass
{
public int Calc(int a, int b = 3)
{
return a + b;
} static void Main()
{
var myClass = new MyClass();
var sum1 = myClass.Cals(2);
var sum2 = myClass.Cals(2,10);
Console.WriteLine($"sum1:{sum1},sum2:{sum2}"); //输出 sum1:5,sum2:12
}
}



十五 栈帧

局部变量(本地变量)和参数是位于栈上的。

在调用方法时,内存从栈的顶部开始分配,保存和方法相关联的一些数据项,这块内存叫做方法的栈帧 stack frame

栈帧包含:

  • 返回地址,也就是在方法退出时继续执行的位置;
  • 这些参数分配的内存,也就是方法的值参数,或参数数组;
  • 各种和方法调用相关的管理数据项;

在方法调用时,整个栈帧都会压入栈。方法退出时,整个栈帧从栈上弹出。


十六 递归

方法调用自身,叫做递归。

C#-4 方法的更多相关文章

  1. javaSE27天复习总结

    JAVA学习总结    2 第一天    2 1:计算机概述(了解)    2 (1)计算机    2 (2)计算机硬件    2 (3)计算机软件    2 (4)软件开发(理解)    2 (5) ...

  2. mapreduce多文件输出的两方法

    mapreduce多文件输出的两方法   package duogemap;   import java.io.IOException;   import org.apache.hadoop.conf ...

  3. 【.net 深呼吸】细说CodeDom(6):方法参数

    本文老周就给大伙伴们介绍一下方法参数代码的生成. 在开始之前,先补充一下上一篇烂文的内容.在上一篇文章中,老周检讨了 MemberAttributes 枚举的用法,老周此前误以为该枚举不能进行按位操作 ...

  4. IE6、7下html标签间存在空白符,导致渲染后占用多余空白位置的原因及解决方法

    直接上图:原因:该div包含的内容是靠后台进行print操作,输出的.如果没有输出任何内容,浏览器会默认给该空白区域添加空白符.在IE6.7下,浏览器解析渲染时,会认为空白符也是占位置的,默认其具有字 ...

  5. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  6. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

  7. ArcGIS 10.0紧凑型切片读写方法

    首先介绍一下ArcGIS10.0的缓存机制: 切片方案 切片方案包括缓存的比例级别.切片尺寸和切片原点.这些属性定义缓存边界的存在位置,在某些客户端中叠加缓存时匹配这些属性十分重要.图像格式和抗锯齿等 ...

  8. [BOT] 一种android中实现“圆角矩形”的方法

    内容简介 文章介绍ImageView(方法也可以应用到其它View)圆角矩形(包括圆形)的一种实现方式,四个角可以分别指定为圆角.思路是利用"Xfermode + Path"来进行 ...

  9. JS 判断数据类型的三种方法

    说到数据类型,我们先理一下JavaScript中常见的几种数据类型: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Functi ...

  10. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

随机推荐

  1. DFS序和7种模型

    DFS序就是将树的节点按照先根的顺序遍历得到的节点顺序 性质:一个子树全在一个连续的区间内,可以与线段树和树状数组搭配使用 很好写,只需在dfs中加几行代码即可. 代码: void dfs(ll u, ...

  2. 意向不到的Dubug妙招

    1.直接dubug到想要到达的位置,直接点击旁边的数字即可. 2.debug后不想重新启动,想重新进入再执行一次debug,可以使用drop frame来删除当前栈,跳到之前的栈再一次进入这个栈. 注 ...

  3. raspberry pi使用笔记

    1.raspberry pi系统vim问题 习惯了Linux的vim的使用,但是在raspberry pi中,用apt-get install vim后,vim变得很难用,进入编辑模式,输入字母时会莫 ...

  4. 多态的好处和instanceof关键字

    多态的好处: 可替换性:多态对已经存在的代码具有可替换性 可扩展性:多态对待吗具有可扩展性,增加新的子类不影响已经存在类的多态性,继承性,以及其他特征的运行和操作.实际上新家子类更容易获得多态功能 接 ...

  5. python 装饰器理解

    简介 装饰器可以在不修改原有代码的基础上添加新的功能,可以将重复重用的代码抽取出来,进一步解耦,方便维护,一般适用于插入日志.性能测试.事务处理.缓存等 装饰器的前提 闭包 一般来说,当一个函数嵌套另 ...

  6. Java---注解与反射

    前言 近期在学习SSM框架的过程中发现在SSM框架中大量用到了反射与注解的知识,要想学好SSM框架,必须将注解与反射熟记于心,尤其是对Java反射机制的理解. 对于我这种记性不好的人来说"基 ...

  7. odoo14 重启服务后权限不见了

    1 Odoo14权限更新有两个地方: 2 一.你在编写xml权限记录的时候没有将noupdate设置为'1'这样导致你每次升级模块,你的权限都会重置一遍. 3 二.你在运行odoo-bin服务的时候, ...

  8. 黑马2022最新redis课程笔记知识点(面试用)持续更新

    redis入门 redis的常见五种数据类型 String类型 String类型,类似于java中的String类型,常见使用get,set方法. String类型还可以存储json字符串格式. Ha ...

  9. MySQL金融应用场景下跨数据中心的MGR架构方案(1)

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 0. 内容提纲 运行环境 部署MGR A&B 部署MGR A.B之间的复制通道 几个注意事项 如何在多个数据中心部 ...

  10. DolphinScheduler 功能开发:⼯作流级别任务空跑(后端),测试工作流是否正确执行...

    点击上方 蓝字关注我们 ✎ 编 者 按 在今年由中国科学院软件研究所主办的开源软件所供应链点亮计划-开源之夏活动中,有不少小伙伴提交了关于 DolphinScheduler 的项目,本期是来自成都信息 ...