ref(C# 参考)

ref 关键字会导致通过引用传递的参数,而不是值。 通过的效果引用指向该参数的任何更改。方法反映在基础参数变量在被调用的方法上。 引用参数的值始终是相同基础参数变量的值。

备注

不要将“通过引用传递”概念与“引用类型”概念相混淆。这两个概念不同。方法参数无论是值类型还是引用类型,都可通过 ref 进行修饰。通过引用传递值类型时没有值类型装箱。

如下面的示例所示,若要使用 ref 参数,方法定义和调用的方法必须显式使用关键字,ref。

    class RefExample
    {
        static void Method(ref int i)
        {
            // Rest the mouse pointer over i to verify that it is an int.
            // The following statement would cause a compiler error if i
            // were boxed as an object.
            i = i + 44;
        }

        static void Main()
        {
            int val = 1;
            Method(ref val);
            Console.WriteLine(val);

            // Output: 45
        }
    }

传递给 ref 参数的参数必须初始化,则通过之前。 这与 out 参数不同,参数不需要显式初始化,在通过之前。 有关更多信息,请参见 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 RefOverloadExample
    {
        public void SampleMethod(int i) { }
        public void SampleMethod(ref int i) { }
    }

在需要匹配,如隐藏或重写,ref 和 out 签名的其他情况下是该签名的一部分,而且不会互相匹配。

属性不是变量。 它们是方法,而不能传递到 ref 参数。

有关如何传递数组的信息,请参见使用 ref 和 out 传递数组(C# 编程指南)

不能为以下方法使用 ref 和 out 关键字:

  • 异步方法,或者使用 异步 修饰符,定义。

  • 迭代器方法,包括一个 将返回 或 yield break 语句。

示例

上面的示例演示发生的情况,当您通过值类型的引用。 还可以使用 ref 关键字通过引用类型。 通过引用键入引用允许调用方法来修改引用参数引用的对象。 对象的存储位置传递给方法作为引用参数的值。 如果更改参数的存储位置,您更改基础参数的存储位置。 下面的示例通过引用类型的实例作为 ref 参数。 有关如何通过的更多信息按值引用类型和引用,请参见 传递引用类型参数(C# 编程指南)

class RefExample2
{
    static void ChangeByReference(ref Product itemRef)
    {
        // The following line changes the address that is stored in  
        // parameter itemRef. Because itemRef is a ref parameter, the
        // address that is stored in variable item in Main also is changed.
        itemRef = new Product("Stapler", 99999);

        // You can change the value of one of the properties of
        // itemRef. The change happens to item in Main as well.
        itemRef.ItemID = 12345;
    }

    static void Main()
    {
        // Declare an instance of Product and display its initial values.
        Product item = new Product("Fasteners", 54321);
        System.Console.WriteLine("Original values in Main.  Name: {0}, ID: {1}\n",
            item.ItemName, item.ItemID);

        // Send item to ChangeByReference as a ref argument.
        ChangeByReference(ref item);
        System.Console.WriteLine("Back in Main.  Name: {0}, ID: {1}\n",
            item.ItemName, item.ItemID);
    }
}

class Product
{
    public Product(string name, int newID)
    {
        ItemName = name;
        ItemID = newID;
    }

    public string ItemName { get; set; }
    public int ItemID { get; set; }
}

// Output: 
//Original values in Main.  Name: Fasteners, ID: 54321

//Back in Main.  Name: Stapler, ID: 12345

C# 语言规范

有关更多信息,请参见 C# 语言规范。该语言规范是 C# 语法和用法的权威资料。

请参见

参考

传递参数(C# 编程指南)

方法参数(C# 参考)

C# 关键字

概念

C# 编程指南

其他资源

C# 参考