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

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 a={0},b={1}",a,b);
        b = doit.Square(ref a);
        Console.WriteLine("After a={0},b={1}", a, b);
        Console.ReadLine();
    }
}

  通过测试我们发现,变量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_rotines(//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 cubed1 = 0;
        double squared1 = 0;
        double half1 = 0;

        Console.WriteLine("Before method->x1={0}", x1);
        Console.WriteLine("Before method->half1={0}",half1);
        Console.WriteLine("Before method->squared1={0}",squared1);
        Console.WriteLine("Before method->cubed1={0}",cubed1);

        doit.math_routines(x1, out half1, out squared1, out cubed1);

        Console.WriteLine("After method->x1={0}", x1);
        Console.WriteLine("After method->half1={0}", half1);
        Console.WriteLine("After method->squared1={0}", squared1);
        Console.WriteLine("After method->cubed1={0}", cubed1);

        Console.ReadLine();
    }
}

通过使用out关键字,我们改变了三个变量的值,也就是说out是从方法中传出值

我们发现,ref和out似乎可以实现相同的功能,因为都可以改变传递到方法中的变量的值,但是二者本质的区别就是,ref是传入值,out是传出值,在含有out关键之的方法中,变量 必须有方法参数中不含out(可以是ref)的变量赋值或者由全局(即方法可以使用的该方法外部变量)变量赋值,out的宗旨是保证每一个传出变量都必须被赋值

在传入变量的时候,out关键字的变量可以不被初始化,但是没有out 关键字的值要被赋值。而ref参数在传递给方法是,就已经被赋值了,所以ref侧重修改,out侧重输出。

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

时间: 2024-12-05 17:35:25

C#中使用ref 和 out 的一点认识的相关文章

C# 中的 ref 和 out 的意义和使用方法

原文C# 中的 ref 和 out 的意义和使用方法 向方法传递一个实参时,对应的形参会用实参的一个副本来初始化,不管形参是值类型(例如 int),可空类型(int?),还是引用类型,这一点都是成立的.也就是随便在方法内部进行什么修改,都不会影响实参的值.例如,对于引用类型,方法的改变,只是会改变引用的数据,但实参本身并没有变化,它仍然引用同一个对象. 代码如下: using System; using System.Collections.Generic; using System.Linq;

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

在C#中,ref与out是很特殊的两个关键字.使用它们,可以使参数按照引用来传递. 总的来说,通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不将受到影响.此外我们还有其他向方法传递参数的形式,引用(ref)和输出(out). 有时,我们需要改变原来变量中的值,这时,我们可以向方法传递变量的引用,而不是变量的值.引用是一个变量,他可以访问原来变量的值,修改引用将修改原来变量的值.变量的值存储在内存中,可以创建一个引用,他指

C#方法中的ref和out

ref        通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不将受到影响.此外我们还有其他向方法传递参数的形式,引用(ref)和输出(out).    有时,我们需要改变原来变量中的值,这时,我们可以向方法传递变量的引用,而不是变量的值.引用是一个变量,他可以访问原来变量的值,修改引用将修改原来变量的值.变量的值存储在内存中,可以创建一个引用,他指向变量在内存中的位置.当引用被修改时,修改的是内存中的值,因此变量

在typeScript+vue项目中使用ref

因为vue项目是无法直接操作dom的,但是有时候开发需求迫使我们去操作dom. 两个办法,一个是很low的再引入jq,然后通过jq来操作,但是这样就失去了我们使用vue的意义, 可惜的是我曾经这样干过,而且当时觉得我就是个天才. 另一个就是添加ref属性,对ref进行操作. 好了完美解决. 很不巧,新项目用的是vue还是vue+typeScript的,直接,单纯的this.$refs.xxx不好用了,报错,识别不了,很尴尬. 经过不懈努力终于找到了在typeScript+vue(不要在意这两个前

react中的ref的3种方式

2020-03-31 react中ref的3种绑定方式 方式1: string类型绑定 类似于vue中的ref绑定方式,可以通过this.refs.绑定的ref的名字获取到节点dom 注意的是 这种方式已经不被最新版的react推荐使用,有可能会在未来版本中遗弃 方式2: react.CreateRef() 通过在class中使用React.createRef()方法创建一些变量,可以将这些变量绑定到标签的ref中 那么该变量的current则指向绑定的标签dom 方式3: 函数形式 在clas

c#中的ref、out、params参数

out参数 与c++的引用的对比 out参数可以用来传递方法返回值,与c++中的引用有点像,但是还有有些不同: - 调用方法的时候必须写out参数 - 调用方法之前必须先分配空间 - 调用方法之前不用先赋值. - 必须在方法内部对out参数赋值; 下面自己实现一个tryparse函数 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threadin

.net中的ref与out的区别和使用总结

ref和out的使用及区别 1.  ref的使用:使用ref进行参数的传递时,该参数在创建时,必须设置其初始值,且ref侧重于修改: 2. out的使用: 采用out参数传递时,该参数在创建时,可以不设置初始值,但是在方法中必须初始化,out侧重于输出: 注释:当希望方法返回多个值时,可以用out,并且一个方法中的参数可以有一个或多个out参数:使用 out 参数,必须将参数作为 out 参数显式传递到方法中,但是out 参数的值不会被传递到 方法中,且属性不是变量,不能作为 out 参数传递.

网络应用编程中的 ref

C#中的数据有两种类型:引用类型(reference types)和值类型(value types) 其实,你也不用理解得多复杂! 你只要知道,如果用上ref的话,操作的是同一个变量, 所以会改变值,如果没用上ref的话,操作的不是同一个变量,所以值不会改变. 这就行了!其他的,以后学得深入了,你就会懂了!现在弄这些问题,只会令你学得很痛苦的! 只不过用ref的话,调用的参数要在调用前就要初始化,初始化,你懂吧?就是赋值!

react native 中View组件中的ref属性是什么

在用Reactnative写工程时,默认奇妙的有一种像OC中,或者Java 中或者当前类的私有属性的想法,state 和props都不能满足时,就是ref   它能达到其他语言中持有一个view组件,并且局部的刷新 ref 接受值为string类型的参数或者一个函数function callback.这一特性让开发者对ref的使用更加灵活. render() { return <TextInput ref={(c) => this._input = c} />; }, component