热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#基础入门教程方法

目录C#方法C#中定义方法实例练习C#中调用方法实例练习实例练习递归方法调用实例练习参数传递按值传递参数实例练习按引用传递参数实例练习按输出传递参数实

目录

C#方法

C# 中定义方法

实例练习

C# 中调用方法

实例练习

实例练习

递归方法调用

实例练习

参数传递

按值传递参数

实例练习

按引用传递参数

实例练习

按输出传递参数

实例练习

实例练习




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;elseresult = num2;return result;}...
}


C# 中调用方法

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


实例练习

using System;namespace CalculatorApplication
{class NumberManipulator{public int FindMax(int num1, int num2){/* 局部变量声明 */int result;if (num1 > num2)result = num1;elseresult = 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;elseresult = 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


推荐阅读
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
author-avatar
灬L龙灬_423
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有