ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递。对于编译后的程序而言,它们之间没有任何区别,也就是说它们只有语法区别。总结起来,他们有如下语法区别:
1、ref传进去的参数必须在调用前初始化,out不必,即:
int i;
SomeMethod( ref i );//语法错误
SomeMethod( out i );//通过
2、ref传进去的参数在函数内部可以直接使用,而out不可:
public void SomeMethod(ref int i)
{
int j=i;//通过
//...
}
public void SomeMethod(out int i)
{
int j=i;//语法错误
}
3、ref传进去的参数在函数内部可以不被修改,但out必须在离开函数体前进行赋值。
总结:
应该说,系统对ref的限制是更少一些的。out虽然不要求在调用前一定要初始化,但是其值在函数内部是不可见的,也就是不能使用通过out传进来的值,并且一定要赋一个值。也就是说函数承担初始化这个变量的责任。
如下示例一个简单的使用。
1.OUT
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Text(out string name , out string sex, out string age)
{
name = "louis";
sex = "male";
age = "25";
}
static void Main(string[] args)
{
string name, sex, age;
Text(out name,out sex,out age);
Console.WriteLine("My name is {0},I'm {1},I'm {2}", name, sex, age);
Console.ReadKey();
}
}
}
2.REF
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void TextOut(out string name , out string sex, out string age)
{
name = "louis";
sex = "male";
age = "25";
}
static void TextRef(ref string name, ref string sex, ref string age)
{
name = "ice";
sex = "female";
age = "24";
}
static void Main(string[] args)
{
//string name, sex, age;
//TextOut(out name,out sex,out age);
string name = "louis";
string sex = "male";
string age = "25";
TextRef(ref name, ref sex, ref age);
Console.WriteLine("My name is {0},I'm {1},I'm {2}", name, sex, age);
Console.ReadKey();
}
}
}
很多童鞋要问了,我们不是有引用类型吗?那干嘛还要用ref和out呢?对,我们是有引用类型,可是用out和ref的话就可以把数值类型也当成引用类型了,那不是很方便了?可能调用方方法要接受多个数值类型的变量,而且要对传入的多个数值类型变量都要做操作。传递引用的话,不是可以很方便么?!是吧?当然,不全只是为了方便,我们需要是了解实质。当传递一个数值对象的时候,是传递这个对象的一个副本到被调用方的方法,而传递一个REF和OUT参数呢,是传递这个对象的引用,那么在被调用方就能实际操作被传递进来的对象的实际版本咯。2者差距,是本质的,是吧?
嗯,当然,ref和out不仅只是为值类型对象而存在的,他们也能包装引用类型的对象。
这里有一点要注意:1.使用ref和out传递值的话,在调用方和被调用方方法都要显示注明这2个关键字。
2.ref和out修饰的参数是不作为方法的签名考虑。意思是说,如果有2个方法的签名除了参数包装的关键字只是相差ref和out的话,那么这2个方法的签名是被认为一样的,不是重载。如下代码:
static void Test(out string name);
static void Test(ref string name);//这2个方法被编译了以后,是一样的,不能认为是重载了。
但是如下的2个方法就认为是重载了
static void Test(string name);
static void Test(ref string name);
分享到:
相关推荐
### C#中的`ref`、`out`和`params`的区别 #### 一、概述 在C#编程语言中,`ref`、`out`和`params`是三种不同的参数修饰符,它们分别用于控制方法如何处理传入的参数。这些关键字在不同的场景下提供了非常有用的...
在C#编程语言中,`ref`和`out`是两个关键字,它们都用于方法参数传递,但有各自独特的用途和规则。理解并熟练运用`ref`和`out`是提高C#编程效率的关键。 首先,`ref`关键字用于当需要在方法内部修改传入的参数值,...
### C#学习体会:使用`ref`和`out`传递数组 在C#语言中,`ref`和`out`是两个非常重要的关键字,它们主要用于处理函数参数的传递方式。通常情况下,在C#中调用方法时,参数是以值传递的方式进行的,也就是说,方法内...
C#为此提供了`ref`和`out`两个关键字,它们虽然有着类似的功能,但在使用场景和约束条件上有明显差异。 #### 1. `ref` 关键字详解 - **初始化要求**:使用`ref`传递参数时,该参数必须已经初始化过。这意味着在调用...
在C#编程语言中,`out`和`ref`关键字被用于传递参数,尤其是在方法调用时,它们允许方法修改其外部作用域内的变量。这两个关键字虽然在功能上有些相似,但其实现机制和使用场景有着本质的区别。下面将详细探讨`out`...
`out` 关键字也允许通过引用传递参数,但它与 `ref` 有一个关键的区别:`out` 参数必须在方法内部被赋值,并且在调用方法时可以不需要初始化该变量。 **示例代码解析**: ```csharp int c; AMethod(in a, ref b, ...
本文实例讲述了C#中Out与Ref的区别,可以加深C#程序设计人员对Out和Ref用法的理解,具体分析如下: 一、区别分析: Out和Ref作为参数传递到方法体中,所传递的都是引用地址,两者在操作上本身没有区别。 但Out传递到...
本文将深入解析C#中涉及的几种关键参数传递机制:值类型的基本传递、`ref`关键字以及`out`关键字,并通过具体示例来说明这些传递方式的区别及应用场景。 ### 值类型的参数传递 在C#中,当我们将一个值类型(如基本...
- C#不允许仅基于`ref`和`out`区分的重载方法,因为它们在语义上有不同。 - `ref`既可以用于输入也可以用于输出,而`out`主要用于输出,不能在方法调用时已有值。 总的来说,`ref`和`out`都是用于在方法之间共享...
C#中关键字ref与out的区别 C#中关键字ref与out的区别是非常重要的知识点之一。这些关键字可以使参数按照引用来传递,而不是传递值的拷贝。通常情况下,我们向方法中传递的是值,方法获得的是这些值的一个拷贝,然后...
要想充分理解C# out和ref,必须先明确如下两个概念(对值类型与引用类型掌握比较好的,可以跳过“一、明确两个基本概念”) 一、明确两个基本概念 值类型: 定义:通过值的方式来传递,即实际参数向形式参数传递...
C# 中的参数类型有四种:值参数、ref 参数、out 参数和 params 参数。今天,我们将详细介绍 C# 中的 out 参数、ref 参数和值参数的用法及区别。 值参数 -------- 在使用参数时,把一个值传递给函数使用的一个变量...
C#中的ref关键字详解 C#中的ref关键字是一个非常重要的概念,对于编程人员来说,正确理解ref关键字可以帮助他们更好地编写代码。在本文中,我们将详细地解释ref关键字的概念和用法,並结合实例代码来说明其正确用法...
在C#编程语言中,`out`和`ref`都是用于方法参数传递的关键字,它们允许函数修改调用者提供的变量值。虽然这两个关键字看似相似,但它们在使用上有着本质的区别,理解这些区别对于编写高效、清晰的代码至关重要。 ...
在C#编程语言中,`ref`和`out`关键字是两种特殊的参数传递方式,它们允许函数修改调用者提供的变量的值。虽然这两种关键字在功能上有些相似,但它们的使用场景和语法规则有所不同。本文将深入探讨`ref`和`out`的用法...
在C#编程中,`ref`和`out`关键字是用来处理方法参数的特殊方式,它们允许函数修改调用者提供的变量。虽然这两种关键字在某些方面很相似,但也存在关键的区别。 `ref`关键字: 1. `ref`参数要求在传递到方法之前必须...
在C#编程语言中,`ref` 和 `out` 关键字用于参数传递,它们都是为了改变函数调用时实参的值。然而,两者在使用上存在一些关键区别,理解这些差异对于编写高效且正确的代码至关重要。 1. **传值方式**: 在C#中,...
`ref` 和 `out` 关键字在 C# 中就是用来实现引用传递的,它们都是对原始变量进行操作,但有各自的特性和使用场景。 **`ref` 关键字** `ref` 关键字用于在方法调用中传递参数时保持对原始变量的引用。这意味着,当在...
在C#编程语言中,函数调用时参数传递的方式有多种,其中`out`和`ref`关键字是用于值类型(如int、struct等)参数传递的重要方式。这两种方式虽然都能实现将局部变量的值传递给方法,但它们之间存在一些重要的区别。 ...