`
流星剑
  • 浏览: 94705 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C#中使用ref和out一点认识!

    博客分类:
  • .net
阅读更多

ref 
通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不将受到影响.此外我们还有其他向方法传递参数的形式,引用(ref)和输出(out).
有时,我们需要改变原来变量中的值,这时,我们可以向方法传递变量的引用,而不是变量的值.引用是一个变量,他可以访问原来变量的值,修改引用将修改原来变量的值.变量的值存储在内存中,可以创建一个引用,他指向变量在内存中的位置.当引用被修改时,修改的是内存中的值,因此变量的值可以将被修改.当我们调用一个含有引用参数的方法时,方法中的参数将指向被传递给方法的相应变量,因此,我们会明白,为什么当修改参数变量的修改也将导致原来变量的值.
创建参数按引用传递的方法,需使用关键字ref.例;
using System;
class gump
{
public double square(ref double x)
{
x=x*x;
return x;
}
}
    
class TestApp
{
public static void Main()
{
gump doit=new gump();
    
double a=3;
double b=0;
    
Console.WriteLine("Before square->a={0},b={1}",a,b);
    
b=doit.square(ref a);
Console.WriteLine("After square->a={0},b={1}",a,b);
}
}
    
通过测试,我们发现,a的值已经被修改为9了.
    
out
通过指定返回类型,可以从方法返回一个值,有时候(也许还没遇到,但是我们应该有这么个方法),需要返回多个值,虽然我们可以使用ref来完成,但是C#专门提供了一个属性类型,关键字为out.介绍完后,我们将说明ref和out的区别.
using System;
class gump
{
public void math_routines(double x,out double half,out double squared,out double cubed)
//可以是:public void math_routines(//ref double x,out double half,out double squared,out double cubed)
//但是,不可以这样:public void math_routines(out double x,out double half,out double squared,out double cubed),对本例来说,因为输出的值要靠x赋值,所以x不能再为输出值
{
half=x/2;
squared=x*x;
cubed=x*x*x;
}
}
    
class TestApp
{
public static void Main()
{
gump doit=new gump();
    
double x1=600;
double half1=0;
double squared1=0;
double cubed1=0;

/*
double x1=600;
double half1;
double squared1;
double cubed1;
*/
    
Console.WriteLine("Before method->x1={0}",x1);
Console.WriteLine("half1={0}",half1);
Console.WriteLine("squared1={0}",squared1);
Console.WriteLine("cubed1={0}",cubed1);
    
doit.math_rountines(x1,out half1,out squared1,out cubed1);

Console.WriteLine("After method->x1={0}",x1);
Console.WriteLine("half1={0}",half1);
Console.WriteLine("squared1={0}",squared1);
Console.WriteLine("cubed1={0}",cubed1);
}
}
    
通过使用out关键字,我们改变了三个变量的值,也就是说out是从方法中传出值.
    
我们发现,ref和out似乎可以实现相同的功能.因为都可以改变传递到方法中的变量的值.但是,二者本质本质的区别就是,ref是传入值,out是传出值.在含有out关键字的方法中,变量必须由方法参数中不含out(可以是ref)的变量赋值或者由全局(即方法可以使用的该方法外部变量)变量赋值,out的宗旨是保证每一个传出变量都必须被赋值.
上面代码中被/**/注释掉的部分,可以直接使用.也就是说,在调用方法前可以不初始化变量.但是"x1"是要赋值的,否则要报错.而ref参数,在传递给方法时,就已经是还有值的了,所以ref侧重修改.out侧重输出.  

分享到:
评论

相关推荐

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

    C#中关键字ref与out的区别 C#中关键字ref与out的区别是非常重要的知识点之一。这些关键字可以使参数按照引用来传递,而不是传递值的拷贝。通常情况下,我们向方法中传递的是值,方法获得的是这些值的一个拷贝,然后...

    c#中ref和out用法

    在C#编程语言中,`ref`和`out`是两个关键字,它们都用于方法参数传递,但有各自独特的用途和规则。理解并熟练运用`ref`和`out`是提高C#编程效率的关键。 首先,`ref`关键字用于当需要在方法内部修改传入的参数值,...

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

    ### 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关键字

    C#中的ref关键字详解 C#中的ref关键字是一个非常重要的概念,对于编程人员来说,正确理解ref关键字可以帮助他们更好地编写代码。在本文中,我们将详细地解释ref关键字的概念和用法,並结合实例代码来说明其正确用法...

    C#中ref与out语法的使用

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

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

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

    解析C#中的ref和out参数

    本文将通过实例和说明,给大家详细讲解C#中的ref和out参数。 代码如下:using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace RefAndOut{ class Program { static void...

    C#方法中参数ref和out详解

    C#方法中参数ref和out详解 ...C# 方法中参数 ref 和 out 是两种不同的参数类型,它们都可以用来传递参数,但是它们的使用场景和要求不同。了解这两种参数类型的区别和使用场景,可以帮助开发者更好地编写 C# 代码。

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

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

    ref和out传值

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

    C#中out与ref的区别实例解析

    本文实例讲述了C#中Out与Ref的区别,可以加深C#程序设计人员对Out和Ref用法的理解,具体分析如下: 一、区别分析: Out和Ref作为参数传递到方法体中,所传递的都是引用地址,两者在操作上本身没有区别。 但Out传递到...

    ref和out的作用(txt)

    在C#编程语言中,`ref`和`out`是两种用于方法参数的关键字,它们允许方法直接修改传递给它的参数值。这两种关键字的主要区别在于调用方法时参数的初始化以及参数的传递方式。 #### `ref`关键字 `ref`关键字使得...

    C#中ref和out的区别浅析

    在C#中通过使用方法来获取返回值时,通常只能得到一个返回值。因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢? MSDN:  ref 关键字使参数按引用传递。其效果是,当控制权...

    c#基础系列之ref和out的深入理解

    在C#编程语言中,`ref`和`out`关键字是用来处理方法参数的引用传递,它们都是为了在方法之间共享变量的值。虽然两者在某些方面相似,但它们的使用场景和规则有所不同。 首先,我们要明确一点,C#中参数传递有两种...

    详解C#中的out和ref

    要想充分理解C# out和ref,必须先明确如下两个概念(对值类型与引用类型掌握比较好的,可以跳过“一、明确两个基本概念”) 一、明确两个基本概念 值类型:  定义:通过值的方式来传递,即实际参数向形式参数传递...

    Ref和Out参数的例子

    在.NET编程中,`Ref`和`Out`参数是C#、VB.NET等语言中用于方法调用的重要特性,它们允许方法修改传递给它的变量值。这两种参数修饰符提供了与普通参数不同的行为,有助于处理复杂的数据传递场景。下面将详细探讨`Ref...

    C_中out和ref的区别

    在C#编程语言中,`out`和`ref`关键字都是用于传递参数的方式,它们都涉及到按引用传递,这意味着函数可以改变实参的值。然而,它们之间存在一些关键的区别,下面将详细解释这些概念。 1. **相同点**: - **按引用...

Global site tag (gtag.js) - Google Analytics