必威体育Betway必威体育官网
当前位置:首页 > IT技术

C#中ref和out关键字的应用以及区别。

时间:2019-11-02 16:13:24来源:IT技术作者:seo实验室小编阅读:71次「手机版」
 

out

C#中ref和out关键字的应用以及区别。

  • ref
    • ref的定义
    • ref 的使用
  • out
    • out的定义:来自MSDN
    • out的用法
  • ref和out的区别
    • Stack Overflow的解释:

之前要学习一下C#的更深入的东西时,看到了ref和out的概念。看了一些教程之后,感觉还是明白了用法,但是不知道语言的深层含义。所以整理了一番,写成博客,帮助大家可以理解,并且于我,也是一个重新整理思路的过程。

首先国际惯例,要了解一个东西的时候,首先明白它是什么,然后明白它能做什么,最后要知道为什么。

ref

ref的定义

ref:MSDN的定义为:“The ref keyword indicates a value that is passed by reference.”就是通过引用来传递参数。ref也是Reference的缩写。了解了定义之后,ref怎么用呢?首先我们要明白值类型和引用类型的概念。这里的ref基本上就是服务于值类型的。

ref 的使用

//不使用 ref;
void Method(int myRefInt)
{
    myRefInt += 66;
}

int number = 1;
Method(number);
console.WriteLine(number);
**//输出 : 1;**
//使用ref
void Method(ref int myRefInt)
{
    myRefInt += 66;
}

int number = 1;
Method(ref number);
Console.WriteLine(number);

**//输出:67**

看到这里想必已经明白了:

  • 不使用ref的时候,函数收到的值是1,然后在Method(int myRefInt)方法中,局部变量myRefInt做了累加之后,在方法执行完成之后就已经销毁了。number的值还是1。
  • 使用ref的时候,函数Method(ref int myRefInt)值收到的是number的地址,函数中执行的myRefInt+=66;此时相当于number+=66;直接修改了number地址的值。

    那就可以等处结论了:ref是通过给方法传递值类型的参数,直接操作同一个变量的关键字。

out

out的定义:来自MSDN

  • As a parameter modifier, which lets you pass an argument to a method by reference rather than by value./“out”作为一个参数修饰符,允许您通过引用而不是通过值将参数传递给方法。
  • In generic type parameter declarations for interfaces and delegates, which specifies that a type parameter is covariant./在接口和委托的泛型类型参数声明中,它指定类型参数是协变的。

    今天的语境下,我们只讨论第一种作为引用传递参数的定义。

out的用法

int number;

Method(number);

void Method(int myRefInt)
{
    myRefInt = 66;
}

Console.WriteLine(number);
//输出:0
int number;

Method(out number);

void Method(out int myRefInt)
{
    myRefInt = 66;
}

Console.WriteLine(number);
//输出:66

从上述out用法的表现来看,out和ref其实都可以允许通过引用来传递参数。那么问题来了既然ref 、out的作用看起来一样,为什么还定义了两个关键字呢?

ref和out的区别

Stack Overflow的解释:

在这里插入图片描述

意思就是:当你在使用ref传递参数的时候,ref修饰的参数必须要有值,但是out可以使用一个未赋值的变量作为参数传递。下面我也用代码做了验证。

 class RefAndOut
    {
        public static void OutDouble(out int outInt)
        {
            outInt = 2;
            Console.WriteLine("outInt is:"+outInt);
        }
        public static void RefDouble(ref int parInt)
        {
            parInt *= 2;
            Console.WriteLine("refInt is:"+parInt);
            Console.ReadKey();
        }
        public static void NormalDouble(int IntPar)
        {
            IntPar = 1;
            IntPar *= 2;
            Console.WriteLine("normalInt is:" + IntPar);
            Console.ReadKey();
        }
        static void Main(string[] args)
        {
            int refInt;
            int outInt;
            int normalInt;
            OutDouble(out outInt);
            RefDouble(ref refInt);
            NormalDouble(normalInt);
        }
    }

这段代码在两处地方有错误:即在使用ref,和不使用修饰符的时候,必须要传递一个有值的参数。所以你看,ref和out几乎就只有一个区别,那就是out可以使用未赋值的变量。

在这里插入图片描述

但是此处还有一个未解的地方,就是为什么Out不需要赋值呢?这也是这篇博客拖了一周的原因。。今天大概能解释了。我们看下图,不管有没有对静态变量outInt赋值,只要出使用out修饰符,就必须对out修饰的参数outIntPar赋值。

所以out应该是在方法内部做了分配地址的操作,然后把地址赋给外部的变量。但是ref的话是直接传递外部地址进方法。OK至此已经解释清楚ref和out的区别了。

如果有错误的地方还请指出一同讨论。

在这里插入图片描述

文章最后发布于: 2018-11-01 23:35:42

相关阅读

C# DateTime.Compare时间大小对比

转载于:https://www.cnblogs.com/lbonet/p/10215723.html

c#KeyValuePair初始化

KeyValuePair初始化 在小括号不在大括号,记一下以免以后忘了

C# 条件运算符

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; nam

location.href与location.hash的区别

综:window.location.href表示重定向,后面跟着的是完整的url地址,与其相似的还有window.location.hash, 下面来比较window.location.hr

C# 斐波拉契数列求第n个值

斐波拉契数列,求第n个值是多少 有这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,求出第n 位的值 int num1 = 1, num2 = 1, sum =

分享到:

栏目导航

推荐阅读

热门阅读