C# 中的 Out 和 Ref 及Params 参数

 

out 和ref 参数 经常用来通过方法传递参数来获取值,当您的方法不只有一个返回值的时候,这两个参数就发挥作用了。ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。 
在这篇文章里,我将解释如何在c#应用中使用这两个参数。
 
1、out 参数
 
out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
 
public class mathClass
{
public static int TestOut(out int iVal1, out int iVal2)
{
    iVal1 = 10;
    iVal2 = 20;
    return 0;

public static void Main()
{
    int i, j; // variable need not be initialized 
    Console.WriteLine(TestOut(out i, out j));
    Console.WriteLine(i);
    Console.WriteLine(j);
}
}
 
2、ref 参数
 
ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。 

static void Main(string[] args)
{
// Ref sample 

   int refi; // variable need be initialized 
   refi = 3; 
   RefTest(ref refi); 
   Console.WriteLine(refi); 
   Console.ReadKey(); 

public static void RefTest(ref int iVal1) 

   iVal1 += 2; 
}
 
 ref和out参数的区别
  
使用ref前必须对变量赋值,out不用。 

out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。
 
(3)params 参数
params 关键字可以指定在参数数目可变处采用参数的方法参数。
在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
using System;

class App
{
    public static void UseParams(params object[] list)
    {
        for (int i = 0; i < list.Length; i++)
        {
            Console.WriteLine(list[i]);
        }
    }

    static void Main()
    {
        // 一般做法是先构造一个对象数组,然后将此数组作为方法的参数
        object[] arr = new object[3] { 100, 'a', "keywords" };
        UseParams(arr);

        // 而使用了params修饰方法参数后,我们可以直接使用一组对象作为参数
        // 当然这组参数需要符合调用的方法对参数的要求
        UseParams(100, 'a', "keywords");

        Console.Read();
    }

 

 

时间: 2024-09-19 16:03:57

C# 中的 Out 和 Ref 及Params 参数的相关文章

在java中实现C#语法里的按引用传递参数的方法_java

在C#中,在次函数中调用时改变了其中的数值,主函数中也将发生改变 ref 关键字使参数按引用传递.其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中.若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字 out 关键字会导致参数通过引用来传递.这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化.若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字. Java里面不像C#那样,Java只有对象类

asp.net(c#)ref,out ,params的区别_实用技巧

NO.1 params 一个可以让方法(函数)的拥有可变参数的关键字. 原则:在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字. 示例(拷贝到vs2005中即可用,下面不再说明) 复制代码 代码如下: public partial class Form1 : Form { public static void UseParams(params int[] list) { string temp = ""; for (int i

c#中ref和out参数使用时需要注意的问题

问题 昨天写了个关于socket接收udp包的程序,调用了socket.ReceiveFrom方法,发现了一个c#中关于ref和out参数传递时的问题,这里提出来和大家共同探讨一下,首先声明,下面的结论都是本人推测,还没有得到任何定论,若有错误请大家指正. 首先,ReceiveFrom方法的原型为 public int ReceiveFrom(byte[], ref EndPoint); 有一个为ref的EndPoint参数,用它来返回收到包的源地址信息,ref的语义是传引用,即对所传引用的修改

理解.Net中带out、ref的方法签名和普通方法签名的区别

今天有位新同事问我.Net中带out.ref的方法签名和普通方法签名的有什么区别?我觉得可以从下面的例子说明一些关键的地方. 一.ref/out修饰符说明 对于用ref/out修饰符的说明在MSDN上有详细的说明,地址如下: http://msdn.microsoft.com/en-us/library/t3c3bfhx(VS.80).aspx. 二.透过IL代码观察ref/out修饰的方法签名(以值类型为例) 1.示例代码: using System; namespace ConsoleMai

C# 中,参数传递用ref外部参数还是对象?

问题描述 C# 中,参数传递用ref外部参数还是对象? 一个客户端程序,用异步方法连接服务器,需要回传几个参数,之前老师写的代码用了很多ref参数,但是asnyc方法不能用ref参数,怎么办?全部用对象吗?代码改动好大 解决方案 可以用函数返回值模拟,返回值返回一个结构体,包含所有原先ref的参数,在调用async返回以后,再包装一层,转换为ref参数. 解决方案二: 这样做,还不如直接创建对象传递参数简单啊

浅谈C#中的ref和out参数

很多初学者(甚至是工作一定时间的开发人员),在遇到ref或者out参数时,总会有点"晕乎乎"或者疑惑,也不知道到底该在啥时候,啥场景下使用ref或者out参数. 本文将通过实例和说明,给大家详细讲解C#中的ref和out参数. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace RefAndOut { class Program { static

ref在传递参数的作用是什么

问题描述 ref在传递引用类型的参数时起到的作用是什么? 解决方案 解决方案二:1.ref关键字使参数按引用传递.2.其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中.3.使用ref参数,方法定义和调用方法都必须显式使用ref关键字4.传递到ref参数的参数必须最先初始化.解决方案三:可以改变传入变量的值比如test(refstrings)可以改变s的值,而没有ref的话,你即便在函数内部改变了s,出了函数体,s还会恢复传入的值解决方案四:ref一般是传递值类型

AngularJS中$http服务常用的应用及参数_AngularJS

前言 $http 服务:只是简单封装了浏览器原生的XMLHttpRequest对象,接收一个参数,这个参数是一个对象,包含了用来生成HTTP请求的配置内容,这个函数返回一个promise对象,具有success和error方法. $http服务的使用场景: var promise = $http({ method:"post", // 可以是get,post,put, delete,head,jsonp;常使用的是get,post url:"./data.json"

Python中函数的参数传递与可变长参数介绍

  这篇文章主要介绍了Python中函数的参数传递与可变长参数介绍,本文分别给出多个代码实例来讲解多种多样的函数参数,需要的朋友可以参考下 1.Python中也有像C++一样的默认缺省函数 代码如下: def foo(text,num=0): print text,num foo("asd") #asd 0 foo("def",100) #def 100 定义有默认参数的函数时,这些默认值参数 位置必须都在非默认值参数后面. 调用时提供默认值参数值时,使用提供的值,