类型推断和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)。

递归

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

C#图解教程读书笔记(第5章 方法)的更多相关文章

  1. SQL Server2012 T-SQL基础教程--读书笔记(1-4章)

    SQL Server2012 T-SQL基础教程--读书笔记(1-4章) SqlServer T-SQL 示例数据库:点我 Chapter 01 T-SQL 查询和编程背景 1.3 创建表和定义数据的 ...

  2. SQL Server2012 T-SQL基础教程--读书笔记(5-7章)

    SQL Server2012 T-SQL基础教程--读书笔记(5-7章) SqlServer T-SQL 示例数据库:点我 Chapter 05 表表达式 5.1 派生表 5.1.1 分配列别名 5. ...

  3. 【C#4.0图解教程】笔记(第1章~第8章)

    第1章 C#和.NET框架 1..NET框架的组成 .NET框架由三部分组成(严格来说只有CLR和FCL(框架类库)两部分),如图 执行环境称为:CLR(公共语言运行库),它在运行期管理程序的执行. ...

  4. C#图解教程读书笔记(第2章 C#编程概述)

    这章主要是一个对于C#程序的概括解释 和C/C++不同,不是用include声明引用的头文件,而是通过using的方式,声明引用的命名空间. 命名和C/C++类似,并且也是区分大小写的,这件事情在VB ...

  5. C#图解教程读书笔记(第1章 C#和.net框架)

    C#中的主要需要记住的基础概念 CLR公共语言运行库 CIL中间语言,所有的代码都会编译成中间语言. CLI公共语言基础结构 C#的优点 C#有自动垃圾回收机制

  6. C#图解教程读书笔记(第15章 委托)

    委托是C#的一个很重要的知识点. 1.什么是委托 委托在我认为,就是一系列格式相同的方法列表,可能就是定义的名称不一致,参数.返回值等都是一样的. 2.如何声明委托 delegate void MyF ...

  7. C#图解教程读书笔记(第9章 语句)

    文件头的Using是Using指令,不是using语句 using (TextWriter tw = File.CreateText("xixi.txt")) { tw.Write ...

  8. C#图解教程读书笔记(第8章 表达式和运算符)

    表达式 字面量 整数字面量 字符字面量 字符串字面量 求值顺序 优先级 结合性 与C和C++不同,在C#中的数字不具有布尔意义. 各种运算符的作用(过) 用户定义类型转换 class XiXiInt ...

  9. C#图解教程读书笔记(第7章 类和继承)

    1.所有的类都继承自object 2.如何隐藏基类的成员 要隐藏一个继承的数据成员,需要声明一个新的相同类型的成员,并使用相同的名称. 通过在派生类中声明新的带有相同签名的函数成员,可以隐藏或掩盖继承 ...

  10. C#图解教程读书笔记(第6章 类进阶)

    类成员声明语句由下列部分组成:核心声明.一组可选的修饰符和一组可选的特性(attribute). [特性] [修饰符] 核心声明 修饰符: 如果有修饰符,必须放在核心声明之前. 如果有多个修饰符,要有 ...

随机推荐

  1. c#异步编程async await

    可以代替协程了 但是需要.net4 版本 unity2017以上版本可以用了 再也可以不用蛋疼的没有返回值的协程了 //异步编程,和Task一起用 async void TestAsync(){ // ...

  2. 通过反射获取及调用方法(Method)

    1.获取方法使用反射获取某一个类中的方法,步骤:①找到获取方法所在类的字节码对象②找到需要被获取的方法 Class类中常用方法: public Method[] getMethods():获取包括自身 ...

  3. Java入门系列-19-泛型集合

    集合 如何存储每天的新闻信息?每天的新闻总数是不固定的,太少浪费空间,太多空间不足. 如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象,可以使用Java集合框架. Java 集合框架提 ...

  4. 压缩图片或pdf

    压缩图片或pdf { /// <summary> /// 压缩图片或pdf大小的Level /// </summary> public enum ReduceSizeLevel ...

  5. sp里拼接html table标签

    DECLARE @xml NVARCHAR(MAX) --generate mail body SET @xml = CAST(( SELECT --[ID] 'td','' -- ,[Status] ...

  6. 定时器setTimeout()和setInterval()使用心得整理

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成. 一.setTimeout() setTimeout函 ...

  7. 【转】.net MVC 生命周期

    对于Asp.net MVC,我对它的生命周期还是兴趣很浓,于是提出两个问题: 一个HTTP请求从IIS移交到Asp.net运行时,Asp.net MVC是在什么时机获得了控制权并对请求进行处理呢?处理 ...

  8. 朝圣Java(问题集锦)之:The Apache Tomcat installation at this directory is version 8.5.32. A Tomcat 8.0 inst

    最近开始学Java了.有C#底子,但是学起来Java还是很吃力,感觉别人架好了各种包,自己只要调用就行了,结果还有各种bug出现.掩面中. 启动Tomcat的时候,报错The Apache Tomca ...

  9. Java--详解WebService技术

    Java--详解WebService技术 一.什么是 webservice WebService是一种跨编程语言和跨操作系统平台的远程调用技术. 所谓跨编程语言和跨操作平台,就是说服务端程序采用jav ...

  10. Redis学习笔记1 -- 单机环境时分布式锁的使用

    使用第三方开源组件Jedis实现Redis客户端,且只考虑Redis服务端单机部署的场景. 前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKee ...