二、方法中的参数类型

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. c++ 迭代器失效学习 effective-STL 9条

    https://www.cnblogs.com/newbeeyu/p/6883122.html  结合 effective  STL 条款9 https://www.cnblogs.com/fnlin ...

  2. JavaSE---反射(未完待续)

    1.概述 1.1 Java程序中许多对象在运行时会出现2种类型:编译时类型.运行时类型: eg:Person  person=new Student(); 这行代码在编译时为Person类型,运行时为 ...

  3. CSS 样式分类

    CSS样式可以分为三大类:内联样式.内部样式表和外部样式表 1.内联样式(样式写在html标签里,只对该标签的内容起作用) <span style="color:red;font-si ...

  4. Android Studio CMake 生成多个so

    生成多个so案例 这里stringFromJNI和stringFromJNI11分别是调用one-lib和two-lib两个so package com.test.ndkmoreso; import ...

  5. 在SQL Server中创建用户角色及授权(使用SQL语句)

    1. 首先在 SQL Server 服务器级别,创建登陆帐户(create login) --创建登陆帐户(create login) create login dba with password=' ...

  6. python3+Appium自动化11-data数据封装之python读取csv文件

    使用背景 实际项目中,我们的测试数据可能存储在一个数据文件中,如txt.excel.csv文件类型.我们可以封装一些方法来读取文件中的数据来实现数据驱动 enumerate()简介 enumerate ...

  7. 但是你没有【But you didn't.】【by Anonymous】

    作者是一位普通的美国妇女,她的丈夫在女儿4岁时应征入伍去了越南战场,从此她便和女儿相依为命.后来,她的丈夫.孩子的爸爸不幸阵亡.她终身守寡,直至年老病逝.她女儿在整理遗物时发现了母亲当年写给父亲的这首 ...

  8. SolrCloud的搭建的连接

    1 什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用SolrCloud.当一个系统的索引数据量少的时候是不需 ...

  9. [巩固C#] 二、什么是反射、反射可以做些什么

      阅读目录   关闭   什么是反射,反射能干嘛? 获取类型的相关信息 获取类型本身信息(命名空间名.全名.是否是抽象.是否是类..... 获取类型成员信息(通过Tyep中的方法GetMembers ...

  10. [Java][Servlet] Failed to destroy end point associated with ProtocolHandler ["http-nio-8080"]

    Background: Servlet version 3.1(3.0之后就有了@WebServlet注解) Error 严重: Failed to destroy end point associa ...