关闭

方法参数ref,out的问题!

776人阅读 评论(0) 收藏 举报

对于值型变量作为方法参数时,可以有三种情况:
1.没有ref和out参数  (直接传值,不能改变实参)
2.使用ref参数       (引用传递,输入,可以改变实参)
3.使用out参数       (引用传递,输出,可以改变实参)

4.ref和out的区别在于一个需要初始化,另一个不需要...

例子:

例子(一)

using System;
using System.Collections.Generic;
using System.Text;

namespace TestRef
{
    class Program
    {
        static void TestRef(ref int i){i+=5;}
        static void Test(int i){i+=5;}
        static void Main(string[] args)
        {
            int i1, i2;
            i1 = 10;
            i2 = 10;
            TestRef(ref i1);//
            Test(i2);//
            Console.WriteLine("i1={0}, i2={1}", i1, i2);
            Console.ReadLine();
        }
    }
}
结果:i1=15, i2=10
分析
如果不用ref那么方法Test对实参i2的改变(i2=i2+5)到那里去了?合理的解释是,传的是一个考贝.


例子(二)

为了证明其传的是一个复制本,那么设计一个新测试如下:
using System;
using System.Collections.Generic;
using System.Text;

namespace TestRef
{
    class Program
    {
        static void TestRef(ref int i)
        {
            i += 5;
        }
        static void Test(int i)
        {
            Console.WriteLine("Test中的实参为: {0}", i);
            i += 5;
            Console.WriteLine("Test中的实参为修改后为: {0}", i);
        }
        static void Main(string[] args)
        {
            int i1, i2;
            i1 = 10;
            i2 = 10;
            TestRef(ref i1);//
            Test(i2);//
            Console.WriteLine("i1={0}, i2={1}", i1, i2);
            Console.ReadLine();
        }
    }
}
结果:
Test中的实参为: 10
Test中的实参为修改后为: 15
i1=15, i2=10

这充分说明了,再传递实参(区别于函数定义时称为"形式参数"的称法)时是传递实参的一个复制本这个复制本与实参值相等,但处于内存中不同的位置,换言之如果单独对其中任何一个进行修改,那么这种修改的影响只会对其本身产生影响而与其它任何内在位置的其自身的复制本无关!

 

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:264490次
    • 积分:4155
    • 等级:
    • 排名:第7364名
    • 原创:117篇
    • 转载:92篇
    • 译文:0篇
    • 评论:37条