C#中ref和out关键字的应用以及区别(参数修饰符)

 

ref

ref的定义

ref是reference的缩写,通过引用来传递参数的地址,ref基本上是服务于值类型的

ref的使用

复制代码
//不使用 ref;
void Method(int myRefInt)
{
    myRefInt += 66;    //在不使用ref的时候,方法在对参数执行操作后会直接销毁
}

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**
复制代码

out

out的定义

作为参数修饰符,通过引用而不是通过值传递参数

out的使用

复制代码
//从结果和传参的方式来看和ref几乎没有区别
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
复制代码

ref和out的区别

使用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);        //success  可以传入一个未赋值的变量
            RefDouble(ref refInt);          //error  使用了未赋值的变量
            NormalDouble(normalInt);   //error  使用了未赋值的变量
        }
    }
复制代码

ref和out存在区别的原因

ref:直接将外部变量的地址传进方法

out:在方法内部为传进来的参数非配地址,然后将地址返回并赋值给外部的变量(这就是out可以传进未赋值的变量,因为在内部重新分配地址

---------------

原文地址:http://t.csdn.cn/QHRWN

posted @   派大没有星  阅读(445)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示