`

C# out 、ref关键字 的应用比较

 
阅读更多

在C#中 out 关键字会导致参数通过引用来传递。

这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。

若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。

 

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

namespace study
{
    public class Program
    {
        /// <summary>
        /// ref关键字可以让一个值类型的输入按引用传递
        /// </summary>
        private static void refFunction(int x,ref int a)
        {
            a = a * x;
        }        
        /// <summary>
        /// out关键字的使用
        /// 使用out关键字,输入参数str在传递给outKeyWord()方法前不必进行初始化,如果没有关键字,是无法编译的
        /// </summary>
        private static void outKeyWord(out string str)
        {
            //输出参数str在方法返回前必须被赋值
            str = "a string";
        }
        static void Main(string[] args)
        {
            //***********ref关键字的使用
            int x = 12, a = 5;
            Console.WriteLine(a);//输出:5
            refFunction(x, ref a);
            Console.WriteLine(a);//输出:60
            
            //***********out关键字的使用
            string str;//不必初始化
            outKeyWord(out str);//输出:a string
            Console.WriteLine(str);
            Console.ReadKey();

        }
    }
}
 
out 关键字会导致参数通过引用来传递。
这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。
若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。
例如:

 class OutExample
{
    static void Method(out int i)
    {
        i = 44;
    }
    static void Main()
    {
        int value;
        Method(out value);
        // value is now 44
    }
}
尽管作为 out 参数传递的变量不需要在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值。

ref 和 out 关键字在运行时的处理方式不同,但在编译时的处理方式相同。
因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。
例如,从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译以下代码:


 class CS0663_Example 
{
    // compiler error CS0663: "cannot define overloaded 
    // methods that differ only on ref and out"
    public void SampleMethod(out int i) {  }
    public void SampleMethod(ref int i) {  }
}
但是,如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两类参数,则可以进行重载,如下所示:



 class RefOutOverloadExample
{
    public void SampleMethod(int i) {  }
    public void SampleMethod(out int i) {  }
}
备注
--------------------------------------------------------------------------------

属性不是变量,因此不能作为 out 参数传递。

有关传递数组的信息,请参见使用 ref 和 out 传递数组。

示例
--------------------------------------------------------------------------------

当希望方法返回多个值时,声明 out 方法很有用。
使用 out 参数的方法仍然可以将变量用作返回类型(请参见 return),
但它还可以将一个或多个对象作为 out 参数返回给调用方法。
此示例使用 out 在一个方法调用中返回三个变量。
请注意,第三个参数所赋的值为 Null。这样便允许方法有选择地返回值。



 class OutReturnExample
{
    static void Method(out int i, out string s1, out string s2)
    {
        i = 44;
        s1 = "I've been returned";
        s2 = null;
    }
    static void Main()
    {
        int value;
        string str1, str2;
        Method(out value, out str1, out str2);
        // value is now 44
        // str1 is now "I've been returned"
        // str2 is (still) null;
    }
}
分享到:
评论

相关推荐

    C#中关键字ref与out的区别

    如果我们将ref关键字换成out关键字,代码如下: static void TestRefAndOut() { string s1 = "Good Luck!"; //TestRef(ref s1); TestOut(out s1); Console.WriteLine(s1);//output: Hello World! } static...

    C#中的关键字

    C#中的关键字 C#语言中有多种关键字,用于定义类、方法、变量、语句等各种语言元素。在本文中,我们将对C#中的关键字进行总结和解释。 一、访问修饰符关键字 * public:访问修饰符,表示该成员可以从该类外部访问...

    c#中ref和out用法

    在名为`refAndoutTest`的压缩包文件中,可能包含了一个或多个C#源代码文件,这些文件用于演示`ref`和`out`关键字的实际应用。通过查看和分析这些代码,你可以更深入地理解这两个关键字的工作原理和应用场景。在学习...

    c#中的关键字(共76个)

    C# 中的关键字(共 76 个) C# 中的关键字是语言的基本组成部分,它们定义了程序的结构、行为和语义。下面我们将详细介绍 C# 中的 76 个关键字。 abstract:标识一个可以扩展但不能被实体化的类或方法。抽象类不能...

    C# ref和out的区别

    C#为此提供了`ref`和`out`两个关键字,它们虽然有着类似的功能,但在使用场景和约束条件上有明显差异。 #### 1. `ref` 关键字详解 - **初始化要求**:使用`ref`传递参数时,该参数必须已经初始化过。这意味着在调用...

    C#中的参数传递 - ref, out比较

    本文将深入解析C#中涉及的几种关键参数传递机制:值类型的基本传递、`ref`关键字以及`out`关键字,并通过具体示例来说明这些传递方式的区别及应用场景。 ### 值类型的参数传递 在C#中,当我们将一个值类型(如基本...

    C#中ref,out和params有什么区别

    ### C#中的`ref`、`out`和`params`的区别 #### 一、概述 在C#编程语言中,`ref`、`out`和`params`是三种不同的参数修饰符,它们分别用于控制方法如何处理传入的参数。这些关键字在不同的场景下提供了非常有用的...

    in.ref.out C#传值调用与引用调用

    通过上面的例子和解释,我们可以看到 `in`、`ref` 和 `out` 关键字在C#中的不同用途: - `in` 用于值传递,方法内部无法修改参数。 - `ref` 用于引用传递,可以在方法内部修改并更新原始变量。 - `out` 也是用于引用...

    c#学习体会使用 ref 和 out 传递数组

    在C#语言中,`ref`和`out`是两个非常重要的关键字,它们主要用于处理函数参数的传递方式。通常情况下,在C#中调用方法时,参数是以值传递的方式进行的,也就是说,方法内的参数改变不会影响到方法外的原始变量。然而...

    C_中out和ref的区别

    下面将详细探讨`out`和`ref`在C#中的具体应用及其差异。 ### `out`关键字 `out`关键字用于指示方法的参数应该被视作输出参数,这意味着方法将负责给该参数赋值。在调用带有`out`参数的方法时,传递给它的变量可以...

    c# 关键字 微软官方文档

    - 其他操作符关键字:例如 ref(引用传递参数)、out(输出参数)、in(输入参数)、out(输出参数)、namespace(定义命名空间)、using(用于命名空间或资源清理)、extern(外部方法的修饰符)等。 5. 异步编程...

    C#语法基础_关键字_值与非值

    C#是一种面向对象的编程语言,其语法结构严谨,包含了值关键字和非值关键字。值关键字主要用于声明变量,表示特定的数据类型,而非值关键字则用于构建程序结构和控制流程。 1. 值关键字: - `bool`:布尔类型,...

    C#中ref与out语法的使用

    在C#编程语言中,`ref`和`out`关键字是两种特殊的参数传递方式,它们允许函数修改调用者提供的变量的值。虽然这两种关键字在功能上有些相似,但它们的使用场景和语法规则有所不同。本文将深入探讨`ref`和`out`的用法...

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

    C# 中的三个关键字:params、ref、out 在 C# 编程语言中,有三个关键字非常重要,即 params、ref 和 out。这三个关键字都是用于方法参数的,但它们有不同的作用和用途。本文将详细介绍这三个关键字的用法和原理。 ...

    ref和out传值

    在C#编程语言中,`ref` 和 `out` 关键字用于参数传递,它们都是为了改变函数调用时实参的值。然而,两者在使用上存在一些关键区别,理解这些差异对于编写高效且正确的代码至关重要。 1. **传值方式**: 在C#中,...

    C#中ref和out的区别浅析

    因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢? MSDN:  ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该...

    (搜集整理的)C_中ref和out用法

    在C#编程中,`ref`和`out`关键字是用来处理方法参数的特殊方式,它们允许函数修改调用者提供的变量。虽然这两种关键字在某些方面很相似,但也存在关键的区别。 `ref`关键字: 1. `ref`参数要求在传递到方法之前必须...

    out和ref传值的区别

    - **调用者必须显式使用ref关键字**:在调用带有`ref`参数的方法时,调用者也必须使用`ref`关键字来传递参数。这样做的目的是为了让编译器能够确保在传递前变量已经被初始化。 ##### 示例代码: ```csharp void ...

    out和ref的区别

    在C#编程语言中,`out`和`ref`都是用于方法参数传递的关键字,它们允许函数修改调用者提供的变量值。虽然这两个关键字看似相似,但它们在使用上有着本质的区别,理解这些区别对于编写高效、清晰的代码至关重要。 ...

    C#编程中使用ref和out关键字来传递数组对象的用法

    在C#编程中,`ref`和`out`关键字是用来传递参数的重要机制,它们允许函数修改传入变量的值。这两个关键字在处理数组对象时也具有特殊的应用,因为数组在C#中被视为对象,拥有自己的引用。理解这些关键字在数组上下文...

Global site tag (gtag.js) - Google Analytics