类型推断和var关键字

从C#3.0开始,可以在变量声明的开始部分的的位置使用新的关键字var。

Var关键字并不是某种特别类型的符号。它只是句法上的速记,表示任何可以从初始化的右边推断出的类型。

Var的一些重要条件:

1、只能用于本地变量,不能用于字段

2、只能在变量声明中包含初始化时使用

3、一旦编译器推断出变量的类型,它就是固定且不能更改的。

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

参数的几种类型

1、值参数

在栈中为形参分配空间,复制实参到形参

2、引用参数

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

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

void MyMethod(ref int val){}//方法声明

int y = 1;//实参变量

MyMethod(ref y);//方法调用

对于引用参数,形参的参数名看起来就好像是实参变量的别名,也就是说,它们指向的是相同的内存位置。

3、输出参数

如同引用参数,输入参数有以下要求

必需在声明和调用中都使用修饰符,输出参数的修饰符是out。

和引用参数相似,实参必需是变量,而不能是其它类型的表达式。

void MyMethod(out int val){}//方法声明

int y=1;

MyMethod(out y);//方法调用

输出参数不能在赋值之前读取。这意味着参数的初始值是无关的,而且没有必要在前为实参赋值。

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

4、参数数组

在一个参数列表中只能有一个参数数组。

如果有,它必须是列表中的最后一个。

使用params修饰符。

在数据类型后放置一组空的方括号。

void ListInts(params int[] iVals){}

求平均数的示例

static int IntAverage(params int[] iIn)

{

int iAvg = 0;

if ((iIn != null) && (iIn.Length != 0))

{

for (int i = 0; i < iIn.Length; i++ )

{

iAvg += iIn[i];

}

}

iAvg = iAvg / iIn.Length;

return iAvg;

}

int[] iTemp = new int[] { 1, 2, 3, 4 ,-1,-3,100};

Console.WriteLine("平均数是{0}", IntAverage(1,2,3,4,5,6,7));

Console.WriteLine("平均数是{0}", IntAverage(iTemp));

5、数组作实参

参照上面的使用方法。

方法重载:

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

long AddValue(long a, long b) { return a + b; }

int AddValue(long a, long b, long c) { return (int)(a + b + c); }

命名参数:

重要:从C#4.0开始,只要显式指定参数的名称,就可以以任何顺序在方法调用中列出实参。

public long AddValue(long a, long b)

{

Console.WriteLine("a是º?{0},b是º?{1}", a, b);

return a + b;

}

FuncTest cFuncTest = new FuncTest();

cFuncTest.AddValue(b: 5, a: 4);

输出为:

之前VBA一直是可以只设定固定某个参数的值,而其它不管的,这样的话,C#也可以是那样的调用方式了。

可选参数:

省略必需从最后开始

public int AddValue(long a, long b=3, long c=4) { return (int)(a + b + c); }

调用时可以:

Console.WriteLine("和是{0}", cFuncTest.AddValue(5, c: 10));

返回是18哦

栈帧

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

栈帧包含的内容保存如下内容:

返回地址,也就是在方法退出的时候,继续执行的位置。

这些参数分配的内存,也就是方法的值参数,或者还可能是参数数组(如果有的话)。

各种和其他管理数据项。

在方法调用时,整个栈帧都会压入栈。

在方法退出时,整个栈帧都会从栈上弹出,弹出栈帧有的时候也叫做栈展开(unwind)。

递归

除了调用其他方法,可以调用自身,这叫做递归。

最新文章

  1. &lt;&lt;&lt; Google hack
  2. 关于激活Bentley软件详细步骤介绍(再补充一个)
  3. request 和response
  4. 如何在magento后台增加一个自定义订单状态
  5. &quot;unresolved external symbol __imp__WSACleanup@0&quot;
  6. 专注网格剖分 - TetGen
  7. Yii 2.0: yii2-highcharts-widget创建饼状图
  8. 大数据之scala基本语法学习
  9. FPGA工程中用C语言对文件进行处理_生成mif文件
  10. BZOJ 1692: [Usaco2007 Dec]队列变换( 贪心 )
  11. Python 常见的内置模块
  12. sysctl.conf和limit.conf备忘待查
  13. spring学习总结二-----面向切面编程(AOP)思想
  14. Duplicate entry &#39;97112&#39; for key 1
  15. Python进阶:切片的误区与高级用法
  16. Ubuntu 远程 Jupyter 配置
  17. WEB页获取串口数据
  18. mybatis动态sql #和$的区别
  19. STM32配置GPIO前须先打开其时钟,否则配置失败
  20. Linux下编译ffmpeg并用GDB调试

热门文章

  1. windows下安装node环境,以及grunt试水笔记
  2. vim命令汇总
  3. Xcode插件路径、缓存路径、图片压缩工具路径、代码片段路径、symbolicatecrash路径
  4. 深入理解JavaScript系列(46):代码复用模式(推荐篇)
  5. 面向对象 OOP中的抽象类,接口以及多态
  6. SQL 工具系列二
  7. SpringBoot 开启debug
  8. ,SQL语句关键词以及实例
  9. SQL练习(一)
  10. 工厂模式(Factory Pattern)