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 关键字:
示例
上面的示例演示发生的情况,当您通过值类型的引用。还可以使用 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# 语法和用法的权威资料。