C# 方法

  一个方法是把一些相关的语句组织在一起,用来执行一个任务的语句块。每一个 C# 程序至少有一个带有 Main 方法的类。

  要使用一个方法,您需要:

  定义方法

  调用方法

  C# 中定义方法

  当定义一个方法时,从根本上说是在声明它的结构的元素。在 C# 中,定义方法的语法如下:

  (Parameter List)

  {

  Method Body

  }

  下面是方法的各个元素:

  Access Specifier:访问修饰符,这个决定了变量或方法对于另一个类的可见性。

  Return type:返回类型,一个方法可以返回一个值。返回类型是方法返回的值的数据类型。如果方法不返回任何值,则返回类型为 void。

  Method name:方法名称,是一个唯一的标识符,且是大小写敏感的。它不能与类中声明的其他标识符相同。

  Parameter list:参数列表,使用圆括号括起来,该参数是用来传递和接收方法的数据。参数列表是指方法的参数类型、顺序和数量。参数是可选的,也就是说,一个方法可能不包含参数。

  Method body:方法主体,包含了完成任务所需的指令集。

  实例

  下面的代码片段显示一个函数 FindMax,它接受两个整数值,并返回两个中的较大值。它有 public 访问修饰符,所以它可以使用类的实例从类的外部进行访问。

  class NumberManipulator

  {

  public int FindMax(int num1, int num2)

  {

  /* 局部变量声明 */

  int result;

  if (num1 > num2)

  result = num1;

  else

  result = num2;

  return result;

  }

  ...

  }

  C# 中调用方法

  您可以使用方法名调用方法。下面的实例演示了这点:

  using System;

  namespace CalculatorApplication

  {

  class NumberManipulator

  {

  public int FindMax(int num1, int num2)

  {

  /* 局部变量声明 */

  int result;

  if (num1 > num2)

  result = num1;

  else

  result = num2;

  return result;

  }

  static void Main(string[] args)

  {

  /* 局部变量定义 */

  int a = 100;

  int b = 200;

  int ret;

  NumberManipulator n = new NumberManipulator();

  //调用 FindMax 方法

  ret = n.FindMax(a, b);

  Console.WriteLine("最大值是: {0}", ret );

  Console.ReadLine();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  最大值是: 200

  您也可以使用类的实例从另一个类中调用其他类的公有方法。例如,方法 FindMax 属于 NumberManipulator 类,您可以从另一个类 Test 中调用它。

  using System;

  namespace CalculatorApplication

  {

  class NumberManipulator

  {

  public int FindMax(int num1, int num2)

  {

  /* 局部变量声明 */

  int result;

  if (num1 > num2)

  result = num1;

  else

  result = num2;

  return result;

  }

  }

  class Test

  {

  static void Main(string[] args)

  {

  /* 局部变量定义 */

  int a = 100;

  int b = 200;

  int ret;

  NumberManipulator n = new NumberManipulator();

  //调用 FindMax 方法

  ret = n.FindMax(a, b);

  Console.WriteLine("最大值是: {0}", ret );

  Console.ReadLine();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  最大值是: 200

  递归方法调用

  一个方法可以自我调用。这就是所谓的 递归。下面的实例使用递归函数计算一个数的阶乘:

  using System;

  namespace CalculatorApplication

  {

  class NumberManipulator

  {

  public int factorial(int num)

  {

  /* 局部变量定义 */

  int result;

  if (num == 1)

  {

  return 1;

  }

  else

  {

  result = factorial(num - 1) * num;

  return result;

  }

  }

  static void Main(string[] args)

  {

  NumberManipulator n = new NumberManipulator();

  //调用 factorial 方法

  Console.WriteLine("6 的阶乘是: {0}", n.factorial(6));

  Console.WriteLine("7 的阶乘是: {0}", n.factorial(7));

  Console.WriteLine("8 的阶乘是: {0}", n.factorial(8));

  Console.ReadLine();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  6 的阶乘是: 720

  7 的阶乘是: 5040

  8 的阶乘是: 40320

  参数传递

  当调用带有参数的方法时,您需要向方法传递参数。在 C# 中,有三种向方法传递参数的方式:

  方式描述

  值参数这种方式复制参数的实际值给函数的形式参数,实参和形参使用的是两个不同内存中的值。在这种情况下,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。

  引用参数这种方式复制参数的内存位置的引用给形式参数。这意味着,当形参的值发生改变时,同时也改变实参的值。

  输出参数这种方式可以返回多个值。

  按值传递参数

  这是参数传递的默认方式。在这种方式下,当调用一个方法时,会为每个值参数创建一个新的存储位置。

  实际参数的值会复制给形参,实参和形参使用的是两个不同内存中的值。所以,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。下面的实例演示了这个概念:

  using System;

  namespace CalculatorApplication

  {

  class NumberManipulator

  {

  public void swap(int x, int y)

  {

  int temp;

  temp = x; /* 保存 x 的值 */

  x = y; /* 把 y 赋值给 x */

  y = temp; /* 把 temp 赋值给 y */

  }

  static void Main(string[] args)

  {

  NumberManipulator n = new NumberManipulator();

  /* 局部变量定义 */

  int a = 100;

  int b = 200;

  Console.WriteLine("在交换之前,a 的值: {0}", a);

  Console.WriteLine("在交换之前,b 的值: {0}", b);

  /* 调用函数来交换值 */

  n.swap(a, b);

  Console.WriteLine("在交换之后,a 的值: {0}", a);

  Console.WriteLine("在交换之后,b 的值: {0}", b);

  Console.ReadLine();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  在交换之前,a 的值:100

  在交换之前,b 的值:200

  在交换之后,a 的值:100

  在交换之后,b 的值:200

  结果表明,即使在函数内改变了值,值也没有发生任何的变化。

  按引用传递参数

  引用参数是一个对变量的内存位置的引用。当按引用传递参数时,与值参数不同的是,它不会为这些参数创建一个新的存储位置。引用参数表示与提供给方法的实际参数具有相同的内存位置。

  在 C# 中,使用 ref 关键字声明引用参数。下面的实例演示了这点:

  using System;

  namespace CalculatorApplication

  {

  class NumberManipulator

  {

  public void swap(ref int x, ref int y)

  {

  int temp;

  temp = x; /* 保存 x 的值 */

  x = y; /* 把 y 赋值给 x */

  y = temp; /* 把 temp 赋值给 y */

  }

  static void Main(string[] args)

  {

  NumberManipulator n = new NumberManipulator();

  /* 局部变量定义 */

  int a = 100;

  int b = 200;

  Console.WriteLine("在交换之前,a 的值: {0}", a);

  Console.WriteLine("在交换之前,b 的值: {0}", b);

  /* 调用函数来交换值 */

  n.swap(ref a, ref b);

  Console.WriteLine("在交换之后,a 的值: {0}", a);

  Console.WriteLine("在交换之后,b 的值: {0}", b);

  Console.ReadLine();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  在交换之前,a 的值:100

  在交换之前,b 的值:200

  在交换之后,a 的值:200

  在交换之后,b 的值:100

  结果表明,swap 函数内的值改变了,且这个改变可以在 Main 函数中反映出来。

  按输出传递参数

  return 语句可用于只从函数中返回一个值。但是,可以使用 输出参数 来从函数中返回两个值。输出参数会把方法输出的数据赋给自己,其他方面与引用参数相似。

  下面的实例演示了这点:

  using System;

  namespace CalculatorApplication

  {

  class NumberManipulator

  {

  public void getValue(out int x )

  {

  int temp = 5;

  x = temp;

  }

  static void Main(string[] args)

  {

  NumberManipulator n = new NumberManipulator();

  /* 局部变量定义 */

  int a = 100;

  Console.WriteLine("在方法调用之前,a 的值: {0}", a);

  /* 调用函数来获取值 */

  n.getValue(out a);

  Console.WriteLine("在方法调用之后,a 的值: {0}", a);

  Console.ReadLine();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  在方法调用之前,a 的值: 100

  在方法调用之后,a 的值: 5

  提供给输出参数的变量不需要赋值。当需要从一个参数没有指定初始值的方法中返回值时,输出参数特别有用。请看下面的实例,来理解这一点:

  using System;

  namespace CalculatorApplication

  {

  class NumberManipulator

  {

  public void getValues(out int x, out int y )

  {

  Console.WriteLine("请输入第一个值: ");

  x = Convert.ToInt32(Console.ReadLine());

  Console.WriteLine("请输入第二个值: ");

  y = Convert.ToInt32(Console.ReadLine());

  }

  static void Main(string[] args)

  {

  NumberManipulator n = new NumberManipulator();

  /* 局部变量定义 */

  int a , b;

  /* 调用函数来获取值 */

  n.getValues(out a, out b);

  Console.WriteLine("在方法调用之后,a 的值: {0}", a);

  Console.WriteLine("在方法调用之后,b 的值: {0}", b);

  Console.ReadLine();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果(取决于用户输入):

  请输入第一个值:

  7

  请输入第二个值:

  8

  在方法调用之后,a 的值: 7

  在方法调用之后,b 的值: 8

  本文转载自:w3cschool

  (编辑:雷林鹏 来源:网络)

雷林鹏分享:C# 方法的更多相关文章

  1. 雷林鹏分享:C# 匿名方法

    C# 匿名方法 我们已经提到过,委托是用于引用与其具有相同标签的方法.换句话说,您可以使用委托对象调用可由委托引用的方法. 匿名方法(Anonymous methods) 提供了一种传递代码块作为委托 ...

  2. 雷林鹏分享:Ruby 方法

    Ruby 方法 Ruby 方法与其他编程语言中的函数类似.Ruby 方法用于捆绑一个或多个重复的语句到一个单元中. 方法名应以小写字母开头.如果您以大写字母作为方法名的开头,Ruby 可能会把它当作常 ...

  3. 雷林鹏分享:Ruby Dir 类和方法

    Ruby Dir 类和方法 Dir 是一个表示用于给出操作系统中目录中的文件名的目录流.Dir 类也拥有与目录相关的操作,比如通配符文件名匹配.改变工作目录等. 类方法 序号方法 & 描述 1 ...

  4. 雷林鹏分享:Ruby File 类和方法

    Ruby File 类和方法 File 表示一个连接到普通文件的 stdio 对象.open 为普通文件返回该类的一个实例. 类方法 序号方法 & 描述 1File::atime( path) ...

  5. 雷林鹏分享:Ruby CGI方法

    Ruby CGI方法 以下为CGI类的方法列表: 序号方法描述 1CGI::new([ level="query"]) 创建 CGI 对象.query可以是以下值: query: ...

  6. 雷林鹏分享:url中加号引发的错误

    刚发现了博客的一个bug,标签页中一些标签带有空格,在url输出中使用了 urlencode 函数进行处理,导致空格被转换成了加号(+),这时通过url访问时会出现错误: 临时解决方法是在urlcod ...

  7. 雷林鹏分享:Composer 安装

    下午在安装 Laravel 框架过程中,遇到了不少问题,因为 Laravel 的安装依赖于 composer,这里就先介绍一下 composer 的安装方法: 安装方法: #下载 sudo curl ...

  8. 雷林鹏分享:Laravel 安装

    前面我们介绍我了 composer安装,这里我们接着来介绍 Laravel框架的安装. 这里我们安装的是laravel 4 项目下载地址:https://github.com/laravel/lara ...

  9. 雷林鹏分享:jQuery EasyUI 数据网格 - 动态改变列

    jQuery EasyUI 数据网格 - 动态改变列 数据网格(DataGrid)列可以使用 'columns' 属性简单地定义.如果您想动态地改变列,那根本没有问题.为了改变列,您可以重新调用dat ...

随机推荐

  1. lnmp部署知乎出现403

    查看错误日志: [root@web01 /]# tailf  /var/log/nginx/error.log 2019/01/16 19:02:06 [error] 10023#10023: *8 ...

  2. python --- 10 *args **kwargs 命名空间 作用域 函数的嵌套

    函数进阶 1.   "*"  和  "**" ① 在形参位置时   都是聚合的作用 *args    位置参数→元组 **kwargs   关键字参数→字典 混 ...

  3. ODAC(V9.5.15) 学习笔记(十二)TOraLoader

    名称 类型 说明 Columns TDAColumns 需要载入数据的每个字段定义 LoadMode TLoadMode 载入模式,包括: lmDirect 通过内部数据缓冲区载入到数据库中 lmDM ...

  4. Python3 tkinter基础 Canvas coords 移动直线,itemconfig 设置矩形的颜色, delete 删除一条直线

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  5. java 反射工具

    <dependency> <groupId>org.reflections</groupId> <artifactId>reflections</ ...

  6. (转) The care and maintenance of your adviser

    The care and maintenance of your adviser Ever since the advent of graduate school, students have com ...

  7. AndroidStudio Gradle下载速度慢解决方法

    1.在软件里点开工程文件下的 build.gradle 2..在 buildscript 和 allprojects 的 repositories 中分别注释掉 jcenter() 3.在 build ...

  8. ETCD原理

    etcd:从应用场景到实现原理的全方位解读 从etcd的架构开始,深入到源码中解析etcd 1 架构 从etcd的架构图中我们可以看到,etcd主要分为四个部分. HTTP Server: 用于处理用 ...

  9. 4、Ansible(tags、roles)

    Tags https://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html http://www.zsythink.net/ ...

  10. BZOJ 4808: 马(二分图最大点独立集)

    http://www.lydsy.com/JudgeOnline/problem.php?id=4808 题意: 思路: 这图中的两个马只能选一个,二选一,很像二分图吧,对能互吃的两个棋子连线,在所选 ...