`
congfeng02
  • 浏览: 200023 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

c#中out、ref和params的用法与区别

阅读更多

ref和out都对函数参数采用引用传递形式——不管是值类型参数还是引用类型参数,并且定义函数和调用函数时都必须显示生命该参数为ref/out形式。两者都可以使函数传回多个结果。

两者区别:

两种参数类型的设计思想不同,ref的目的在于将值类型参数当作引用型参数传递到函数,是函数的输入参数,并且在函数内部的任何改变也都将影响函数外部该参数的值;而out的目的在于获取函数的返回值,是输出参数,由函数内部计算得到的值再回传到函数外部,因此必须在函数内部对该参数赋值,这将冲掉函数外部的任何赋值,使得函数外部赋值毫无意义。

表现为:

1、out必须在函数体内初始化,这使得在外面初始化变得没意义。也就是说,out型的参数在函数体内不能得到外面传进来的初始值。
2、ref必须在函数体外初始化。
3、两者在函数体内的任何修改都将影响到函数体外面。

例:

using System;

namespace ConsoleApplication1
{
class C
{
public static void reffun(ref string str)
{
str += " fun";
}

public static void outfun(out string str)
{
str = "test"; //必须在函数体内初始, 如无此句,则下句无法执行,报错
str += " fun";
}
}

class Class1
{
[STAThread]
static void Main(string[] args)
{
string test1 = "test";
string test2; //没有初始
C.reffun( ref test1 ); //正确
C.reffun( ref test2 ); //错误,没有赋值使用了test2
C.outfun( out test1 ); //正确,但值test无法传进去
C.outfun( out test2 ); //正确

Console.Read();
}
}
}

params 关键字可以指定在参数数目可变处采用参数的方法参数。

在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。

The params keyword lets you specify a method parameter that takes an argument where the number of arguments is variable.

No additional parameters are permitted after the params keyword in a method declaration, and only one params keyword is permitted in a method declaration.


// cs_params.cs
using System;
public class MyClass
{

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

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

static void Main()
{
UseParams(1, 2, 3);
UseParams2(1, 'a', "test");

// An array of objects can also be passed, as long as
// the array type matches the method being called.
int[] myarray = new int[3] {10,11,12};
UseParams(myarray);
}
}


Output

1
2
3

1
a
test

10
11
12

分享到:
评论

相关推荐

    C#中out参数、ref参数与值参数的用法及区别

    C#中out参数、ref参数与值参数的用法及区别 C# 中的参数类型有四种:值参数、ref 参数、out 参数和 params 参数。今天,我们将详细介绍 C# 中的 out 参数、ref 参数和值参数的用法及区别。 值参数 -------- 在...

    详解C#中三个关键字params,Ref,out

    params、ref 和 out 是 C# 编程语言中的三个重要关键字,它们都用于方法参数的,但它们有不同的作用和用途。params 关键字用于方法参数长度不定的情况,ref 关键字用于引用类型参数,而 out 关键字用于返回多个值。...

    c#下的各种参数的详细说明与用法

    输出参数使用`out`关键字,它与`ref`类似,也允许函数修改参数的值。不同之处在于,`out`参数在调用函数时不需要初始化,而且函数必须为`out`参数赋值。一个例子如下: ```csharp public int testOut(out int x, ...

    c#常见问题与解答

    本篇文章将深入探讨C#的一些常见问题、解答以及基础知识点,并着重讲解`out`、`ref`和`params`这三个关键字的用法与区别。 1. **C#基础知识** - **变量与数据类型**:C#支持基本数据类型如int、float、bool等,...

    C#难点逐个击破(3):params数组参数

    在`C#难点逐个击破(3):params数组参数`中,我们将深入理解`params`的用法及其与其他参数修饰符如`ref`和`out`的区别。 首先,`params` 关键字只能应用于数组类型的参数,而且在一个方法声明中只能出现一次,并且...

    找工作时候的 C# 笔试题目

    7. **ref、out和params的区别及用法**: - **ref** 关键字用于传递引用,使得函数可以修改参数的原始值。在调用函数时,变量必须已经初始化。 - **out** 关键字也是传递引用,但函数会为变量分配内存并初始化,...

    C#中关于方法参数的详解

    在C#中,可以通过使用 `ref` 或 `out` 关键字来传递引用。当传递引用参数时,实际上是在传递对象的引用而不是其值。这意味着在方法内部对参数的任何修改都会影响到原始对象。 **示例代码**: ```csharp public ...

    Effective c#中文版

    19. **利用out和ref参数进行变量传递**:out参数允许在方法中初始化,ref则允许改变调用处的变量值。 20. **理解装箱和拆箱操作的开销**:装箱将值类型转换为对象,拆箱反之,这两个操作都有一定的性能成本。 21. ...

    C#部分基础知识整理

    在C#编程语言中,有一些核心概念和技术,如yield、ref、out、params关键字,以及预处理指令和内存管理机制。这些是C#开发者必备的基础知识,理解和掌握它们对于编写高效、可维护的代码至关重要。 首先,让我们深入...

    C#程序设计基础教程与实训_陈广C09PPT课件.pptx

    方法的重载(Overloading)是C#中的一个重要概念,指的是在同一作用域内可以有多个同名方法,只要它们的参数列表(包括参数的数量、类型和顺序)不同即可。返回类型不作为判断重载的依据。 举例来说,你可以有两个...

    C#入门经典笔记

    在C#编程语言中,学习和理解基础知识是至关重要的。以下是一些关键概念的详细解释: 1. **字面值**:字面值是代码中直接写入的固定值,如数字1、字符串"hello"等。它们可以直接赋值给变量,无需额外的转换。 2. **...

    c#学习笔记.txt

    若要在一个用 @ 引起来的字符串中包括一个双引号,请使用两对双引号:@ 符号的另一种用法是使用碰巧成为 C# 关键字的被引用的 (/reference) 标识符。 8, 修饰符 修饰符作用 访问修饰符 public private internal ...

    CLR.via.C#.(中文第3版)(自制详细书签)

    27.8.4 为BeginXxx和EndXxx方法使用ref,out和params实参 27.8.5 不能取消异步I/O限制操作 27.8.6 内存消耗 27.8.7 有的I/O操作必须同步完成 27.8.8 FileStream特有的问题 27.9 I/O请求优先级 27.10 将...

    C# OOP初学者文档

    - **参数传递**:C#支持值传递、引用传递(`ref`和`out`)和数组型传递(`params`)。值传递时,如果是值类型,则在函数调用时会创建一个副本,对副本的修改不会影响原变量。如果是引用类型,虽然传递的是引用,但如果在...

    C#传值的几种方法,可以看一看的

    `out`关键字与`ref`类似,也是进行引用传递,但它要求在函数调用时必须对参数进行初始化,并且函数内部必须为`out`参数赋值。这使得`out`参数常用于返回多个值的情况。 4. `params`关键字: C#中的`params`关键字...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    享有全球盛誉的编程专家Jeffrey Richter,这位与Microsoft .NET开发团队合作长达8年时间的资深顾问,在本书中和读者分享他编程生涯中积累的所有丰富经验和心得,他的独到、睿智的见解,他的远见卓识,为开发人员构建...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    8.3 使用ref和out参数 142 8.3.1 创建ref参数 142 8.3.2 创建out参数 143 8.4 计算机内存的组织方式 145 8.5 system.object类 147 8.6 装箱 147 8.7 拆箱 148 8.8 数据类型的安全转换 149 8.8.1 is操作符 ...

    如何编写高质量C#程序

    如果函数需要修改引用类型参数的值,可以考虑使用ref或out关键字。 总的来说,编写高质量的C#程序需要开发者在代码的格式化、注释、函数使用等方面下功夫。虽然有些规则看似简单,但是它们对于提升代码的可读性和可...

    C#应用处理传入参数 - 开源研究

    2. 参数传递方式:C#支持两种参数传递方式——值传递(value)和引用传递(ref或out)。值传递不改变实参的值,而引用传递允许函数修改实参的值。 3. 参数默认值:可以为非必需参数提供默认值,使得调用函数时可以...

Global site tag (gtag.js) - Google Analytics