二、方法中的参数类型

1. 值参数

值参数是指不带修饰符只带数据类型的形参。

值参数在使用值向方法传递参数时,编译程序会把实参的值做一份拷贝,并且将此拷贝传递给该方法,被调用的方法不会修改内存中实参的值。

调用该方法时,系统会为每一个值类型的形参分配一个新的内存空间,然后将对应的实参的表达式运算的值复制到该内存空间中。

示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test
{
    class Program
    {
        static void Swap(int x, int y)  // 定义值参数
        {
            int temp = x;
            x = y;
            y = temp;
        }
        static void Main(string[] args)
        {
            int i = 1, j = 2;
            Console.WriteLine("调用Swap之前:a = {0}、b = {1}", i, j);
            Swap(i, j);
            Console.WriteLine("调用Swap之后:a = {0}、b = {1}", i, j);
            Console.ReadLine();
        }
    }
}

运行结果:
 
调用Swap之前:a = 1、b = 2
调用Swap之后:a = 1、b = 2在调用Swap方法前后,实参变量i和j的值并没有交换,这说明在方法中更改参数的值不会影响到这个方法之外的变量。

2. 引用型参数

引用型参数是指带ref修饰符的形参。

当使用引用型参数向方法传递形参时,实际上传递的是指向原变量的指针,即引用参数和原变量保存的是同一个地址,这样,在方法中对参数所做的任何修改都会改变原变量的值。

示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test
{
    class Program
    {
        static void Swap(ref int x, ref int y) // 定义引用型参数
        {
            int temp = x;
            x = y;
            y = temp;
        }
        static void Main(string[] args)
        {
            int i = 1, j = 2;
            Console.WriteLine("调用Swap之前:a = {0}、b = {1}", i, j);
            Swap(ref i, ref j);  // 调用Swap方法时,要对实参使用ref修饰符
            Console.WriteLine("调用Swap之后:a = {0}、b = {1}", i, j);
            Console.ReadLine();
        }
    }
}

运行结果:

调用Swap之前:a = 1、b = 2
调用Swap之后:a = 2、b = 1在调用Swap方法前后,实参变量i和j的值进行了交换,这说明在使用形参为引用型参数的方法中,改变参数的值会影响到这个方法之外的变量。

3. 输出参数

输出参数是指带out修饰符的形参。

out修饰符表示该引用参数是用于输出的,而且调用该参数时不需要对参数进行初始化。输出型参数用于传递方法返回的数据。

与引用型参数类似,输出型参数也不开辟新的内存空间。

示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test
{
    class Program
    {
        class classTest
        {
            private int a, b;
            public classTest(int a, int b)
            {
                this.a = a;
                this.b = b;
            }
            public int Myclass(out int c)   // 输出参数
            {
                c = a * b;                  // out参数的返回值
                return a + b;               // 方法的返回值
            }
        }
        static void Main(string[] args)
        {
            int d=3;  // 也可以不赋值
            int c=6;  // 也可以不赋值
            classTest classTest1 = new classTest(4, 5);
            d = classTest1.Myclass(out c);
            Console.WriteLine("执行方法得到的返回值:d = {0}",d);
            Console.WriteLine("返回参数的值:c = {0}", c);
            Console.ReadLine();
        }
    }
}

运行结果:
 
执行方法得到的返回值:d = 9
返回参数的值:c = 20使用out关键字可以根据需要返回多个值。其中d使用的是方法的返回值,而c使用的使用的是out参数的返回值。

4. 数组型参数

数组型参数是指带params修饰符的形参。

如果形参表中包含了数组型参数,则该数组型参数在列表中必须位于最后,而且它必须是一维数组类型,比如,类型string[]和string[][]都可以作为数组型参数,而string[,]则不能。

注意:数组型参数不能有ref和out修饰符。

示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test
{
    class Program
    {
        static string Message(string name, params string[] args) // args为形数数组
        {
            string msg = name;
            for (int i = 0; i < args.Length; i++)
            {
                msg += " " + args[i];
            }
            return msg;
        }
        static void Main(string[] args)
        {
            Console.WriteLine(Message("LiPing"));                      // 不传值
            Console.WriteLine(Message("LiPing", "Hi"));                // 传一个值
            Console.WriteLine(Message("LiPing", "Hi", "How are you?"));// 传多个值
            Console.ReadLine();
        }
    }
}

运行结果:
 
LiPing
LiPing Hi
LiPing Hi How are you?

C# 方法中的参数类型的更多相关文章

  1. 如何将C++中的SOCKADDR_IN*参数类型转换成C#中的参数类型

    将C++中的参数类型SOCKADDR_IN*映射为C#中的IntPtr参数类型的示例代码如下: IntPtr ptrSockaddr = new IntPtr(); //ip地址 sockaddr_i ...

  2. JAVA方法中的参数用final来修饰的原因

    JAVA方法中的参数用final来修饰的原因   很多人都说在JAVA中用final来修饰方法参数的原因是防止方法参数在调用时被篡改,其实也就是这个原因,但理解起来可能会有歧义,有的人认为是调用语句的 ...

  3. python-函数中的参数类型和可变参数解析

    最近,在学习python,天天抱着廖雪峰的教材苦练,https://www.liaoxuefeng.com/ 但廖老毕竟是如此的才华盈溢,我这等小辈真是读起来教程都有些费力. 关于python-函数中 ...

  4. ajax 方法的使用以及方法中各参数的含义

    由于近来经常在项目中使用 ajax 这个函数,在工作之余自己查找了相关的资料,并总结了 ajax 方法的使用,以及方法中各个参数的含义,供大家学习参考使用 type: 要求为String类型的参数,请 ...

  5. C++中的参数类型

    C++中的参数类型 数组 数组是相同类型数据的集合.引入数组就不需要在程序中定义大量的变量,大大减少程序中变量的数量,使程序精炼,而且数组含义清楚,使用方便,明确地反映了数据间的联系.许多好的算法都与 ...

  6. java 重写你可以这么理解 因为 方法名和参数类型个数相同 所以这就是重写了 然后 因为是重写 所以 返回值必须相同

    java  重写你可以这么理解    因为   方法名和参数类型个数相同  所以这就是重写了    然后  因为是重写  所以  返回值必须相同

  7. ArcEngine中IFeatureClass.Search(filter, Recycling)方法中Recycling参数的理解

    转自 ArcEngine中IFeatureClass.Search(filter, Recycling)方法中Recycling参数的理解   ArcGIS Engine中总调用IFeatureCla ...

  8. spring mvc中的控制器方法中的参数从哪里传进来?

    编写控制器方法的时候很奇怪,spring是怎么知道你控制器方法的参数类型,并且注入正确的对象呢? 比如下面这样 @RequestMapping(value="/register", ...

  9. Python中函数参数类型和参数绑定

    参数类型 Python函数的参数类型一共有五种,分别是: POSITIONAL_OR_KEYWORD(位置参数或关键字参数) VAR_POSITIONAL(可变参数) KEYWORD_ONLY(关键字 ...

随机推荐

  1. pl/sql 如何配置连接远程一个或多个数据库

    参考链接 https://blog.csdn.net/yy_love_my/article/details/45720277

  2. android 闹钟设置问题

    Android开发中,alarmManager在5.0以上系统,启动时间设置无效的问题 做一个app,需要后台保持发送心跳包.由于锁屏后CPU休眠,导致心跳包线程被挂起,所以尝试使用alarmMana ...

  3. javascript实现移动端网页版阅读器

    现在手机上的文本阅读app已经非常丰富,良好的阅读体验与海量的书库常常令我感到无比兴奋. 我想到8年前用一点几寸屏幕的mp3看电子书的情景,顿生一种淡淡的温馨.再久远一些,小的时候,我也经常和小伙伴们 ...

  4. 为什么CPU缓存会分为一级缓存L1、L2、L3?有什么意义?

    https://baijiahao.baidu.com/s?id=1598811284058671259&wfr=spider&for=pc 简介:CPU缓存是CPU一个重要的组成部分 ...

  5. CentOS 6.5 & 7 的网络YUM源配置

    中国科技大学CentOS 6.5的网络源 [base]name=CentOS-$releasever - Base#mirrorlist=http://mirrorlist.centos.org/?r ...

  6. [Silverlight]调用外部可执行程序

    public void InvokeExternalExecutableApp() { if (Application.Current.HasElevatedPermissions) {using ( ...

  7. 在线编辑word文档 可保存到服务器

    使用说明:该方法只在office xp 和 2003上 测试通过,2000及以下 版本没试. 注意:你要打开的服务器端的word文档要有写权限.iis要开起 web服务扩展中的webdav为允许 具体 ...

  8. GitKraken使用教程-基础部分(8)

    9.  远程(Remote)仓库 1) 添加远程仓库 一般在本地新建仓库后,需要添加一个远程仓库用于push/pull代码.鼠标移至GitKraken左侧区域的REMOTE栏,点击 该栏右边出现的 按 ...

  9. [HZOI 2015]树黑白

    [题目描述] 给定一棵树,要求维护以下操作: 1.M u 将u节点反色 2.Q u 查询u到所有黑色节点距离和 [输入格式] 第一行n,m 表示节点总数和操作次数 之后n-1行,每行u,v表示两个端点 ...

  10. vue学习中遇到的onchange、push、splice、forEach方法使用

    最近在做vue的练习,发现有些js中的基础知识掌握的不牢,记录一下: 1.onchange事件:是在域的内容改变时发生,单选框与复选框改变后触发的事件. 2.push方法:向数组的末尾添加一个或多个元 ...