C#基础 [07] 方法[上]

一、方法的结构
   1.方法的概念
     C#中的方法就是声明在类型中的语句块,是类型的函数成员。它既可以有名称,也可以没有名称,没有方法名的方法称为匿名方法。
   2.方法的结构
     方法主要由两部分组成:方法头和方法体。其中,方法头指定方法的特征,包括方法是否返回值以及返回值的类型、方法名和参数列表;方法体就是由一对大括号括起来的可执行代码的语句序列,包括本地变量、流程控制结构、方法调用和嵌套块等。方法的结构如下图所示

 

  3.方法声明示例

    下面示例声明一个无返回值的、方法名为“SayHello”、无参数的公共方法。

1         /// <summary>
2         /// 方法声明
3         /// </summary>
4         public void SayHello()
5         {
6             System.Console.WriteLine("Hello World!");
7         }

二、本地变量

  1.本地变量
    本地变量就是声明在方法体中的变量,本地变量经常用于保存本地的或者临时的计算数据。本地变量存在于创建它的块以及嵌套的块。可以在方法体内的任意地方声明本地变量,但是必须遵循“先声明、后赋值、再使用”的先后顺序。

    声明本地变量的语法:“ Type Identifier = value; ",其中Type表示变量类型,Identifier表示变量名,value表示给变量赋的初始值。下面的方法中声明了两个本地变量。

 1         /// <summary>
 2         /// 方法声明
 3         /// </summary>
 4         public void SayHello()
 5         {
 6             // 声明两个本地变量 “name” 和“ age ”
 7             string name = "yunshi";
 8             int age = 23;
 9             System.Console.WriteLine("我叫{0},今年{1}岁了!", name, age);
10         }

  2.本地变量与类字段的对比

    1).生存期:实例字段从实例被创建时开始,直到实例不再被访问时结束;本地变量从它在块中声明开始,直到块完成执行时结束。

    2).隐式初始化:实例字段会隐式初始化为它的字段类型的默认值;本地变量没有隐式初始化,所有变量必须先初始化,然后才能使用,否则报错。

    3).存储位置:类的所有字段都是存储在对内存堆中的,无论是值类型的还是引用类型的;本地变量如果是值类型,则存储在内存栈里,如果是引用类型,则引用存储在栈里,而实际数据存储在堆里。

  3.类型推断和var

    1).类型推断

      当我们声明本地变量时,很多时候我们所写的变量类型都是编译器可以通过赋值的等号右边的值来反推出来,这就叫类型推断。比如 int i =10; 这条声明语句,左边的类型int 可以通过右边的10推断出来。由于类型推断,催生了下边的var关键字。 

    2).var关键字

    从C#3.0开始,可以在变量声明的开始部分的显式类型名的位置使用新的var关键字,它表示可以从初始化语句右边推断出的类型。下面的两条本地变量声明语句中的int 和 var 是等价的。

1             // 声明2个整型变量i和j
2             int i = 10;
3             var j = 100;

    var关键字使用条件:只能用于本地变量,不能用于字段;只能在变量声明语句中包含初始化时才能使用,如果只是声明一个变量而没有初始化,就不能使用var;var关键字并不改变C#的强类型性质,一旦编译器推断出变量的类型,该类型就是固定的了。

    C#3.0及以后版本推荐在以下几种情况下使用var关键字隐式类型化局部变量,以简化程序的书写:

      ①.如果赋值语句右侧的变量类型十分明显,或在精确的类型并不重要时,使用隐式类型的局部变量;赋值语句右侧的类型不明显时,不要使用var。

1             var var1 = "This is clearly a string.";
2             var var2 = 27;
3             // 数字和字符串用"+"号相连,最后转换为了字符串
4             var var3 = Console.ReadLine() + var1 + var2;
5             Console.WriteLine(var3);

          ②.使用隐式类型在 for 和 foreach 循环中确定循环变量的类型。 

 1             // a.在 for 语句中使用隐式类型。
 2             var syllable = "ha";
 3             var laugh = "";
 4             for (var i = 0; i < 10; i++)
 5             {
 6                 laugh += syllable;
 7                 Console.WriteLine(laugh);
 8             }
 9 
10             // b.在 foreach 语句中使用隐式类型。
11             foreach (var ch in laugh)
12             {
13                 if (ch == 'h')
14                     Console.Write("H");

15                 else
16                     Console.Write(ch);
17             }

三、本地常量

  1.本地常量

    本地常量就是声明在方法体中的常量。常量(本地常量/成员常量)的特征如下:常量在声明的同时必须初始化;在声明后值不能改变。

  2.本地常量的声明

    本地常量使用const关键字声明。语法:“const Type Identifier = value;” const不是修饰符,而是核心声明的一部分,必须放在类型之前,其它部分和本地变量声明语法相同。下面是一个声明并且读取本地常量值的示例:

 1         /// <summary>
 2         /// 显示圆的面积
 3         /// </summary>
 4         void DisplayRadius()
 5         {
 6             // 声明本地常量
 7             const double PI = 3.1416;
 8 
 9             // 声明本地变量
10             int radius = 2;
11 
12             // 读取本地变量和本地常量的值
13             double area = radius * radius * PI;
14 
15             Console.WriteLine("Radius:{0},Area:{1}", radius, area);
16         }

四、方法调用

  1.方法使用“方法名+参数列表”进行调用。下面是一个调用上面“显示圆的面积”的方法,其中参数为空。

1         static void Main(string[] args)
2         {
3             Program p = new Program();
4             // 使用"实例名.方法名"调用实例方法
5             p.DisplayRadius();
6         }

  2.方法调用的执行顺序

    1).当前方法的执行在调用点被挂起。

    2).流程控制转移到被调用方法的开始。

    3).被调用方法执行,直到完成(或抛出异常)。

    4).控制回到发起调用的方法。

    该调用顺序的图示如下:

     

 五、方法返回值

  1.返回值类型

    很多方法声明的目的就是为了它的返回值。方法是否返回值以及返回值的数据类型都由方法声明的返回值类型决定,如果要返回值,则必须在方法名前面声明一个具体的返回类型;如果方法不返回值,则不行必须声明void返回类型。下面的示例声明一个返回int值的方法:

1         /// <summary>
2         /// 获得当前小时
3         /// </summary>
4         /// <returns></returns>
5         int GetHour()
6         {
7             var dt = new DateTime();
8             return dt.Hour;
9         }

  2.返回语句

    1).普通return语句

      在上面的示例中,使用return语句返回了当前小时数。如果方法头中声明了非void的返回类型,则必须在方法体中每一条穿过方法的路径上有一条带有确定值的reutrn语句。return语句的语法为:“return Expression;”,其中Expression为一个确定的值。

    2).void方法的return语句

      本来,void方法不需要返回语句,但我们可以根据某些条件使用不带参数的return语句提前退出方法以简化程序逻辑。语法为“ reutrn;"。注意,这里的return语句不带参数,只有一个分号,并且只能用于返回类型为void的方法体中。下面是一个示例:

 1         /// <summary>
 2         /// 根据条件提前退出方法
 3         /// </summary>
 4         /// <param name="msg"></param>
 5         void Test(string msg)
 6         {
 7             if (msg == "Hello")
 8             {
 9                 return;
10             }
11             Console.WriteLine("你好!");
12         }

 

posted @ 2012-12-31 23:58  YunshiSun  阅读(466)  评论(0编辑  收藏  举报