首页 > 其他 > 详细

C# 值类型传参、引用类型传参

时间:2014-04-09 18:05:58      阅读:453      评论:0      收藏:0      [点我收藏+]

C# 值类型传参、引用类型传参

一、传递参数

C#传递参数方式有两种,可以通过按值传递也可以按引用传递。而其本身类型有值类型与引用类型两种,下面分类详细说明。

二、按值传参

1.值类型

值类型存储在栈中,故按值传递时只是简单传递一份复制数据,接受参数的函数操作的只是一个副本,对原数据未做任何修改。

示例代码:

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

namespace ConsoleApplication1
{
    class Program
    {
        public static void ChangeValue(Int32 k)
        {
            k = 200;
        }
        static void Main(string[] args)
        {
            Int32 number = 100;
            Console.WriteLine("修改前:{0}", number);
            ChangeValue(number);
            Console.WriteLine("修改后:{0}", number);
        }    
    }
}

输出结果:

修改前:100
修改后:100


2.引用类型

引用类型存储空间在堆栈和堆中都有,堆栈中存储其在堆中的地址,按值传递引用类型时,传递的是地址的副本,在函数内部修改时,只会修改到原对象的数据,而不能实现对原对象的整体修改(因为对象存储在堆中,修改对象只是在堆中新建一个对象)。

实例代码:

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

namespace ConsoleApplication1
{
    class Program
    {
        public static void ChangeValue(Int32[] k)
        {
            k[0] = 1;
            k = new Int32[3] { 3, 3, 3 };
        }
        static void Main(string[] args)
        {
            Int32[] number = {100,200,300};
            Console.WriteLine("修改前:{0},{1},{2}", number[0],number[1],number[2]);
            ChangeValue(number);
            Console.WriteLine("修改后:{0},{1},{2}", number[0], number[1], number[2]);
        }    
    }
}
输出结果:

修改前:100,200,300
修改后:1,200,300

三、按引用传递

1.值类型

值类型按引用传参时,传递的是其在栈中的地址,因此,函数修改数据时,会根据传递过来的地址去取数据(获得原数据),因此修改的是本身。

示例代码:

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

namespace ConsoleApplication1
{
    class Program
    {
        public static void ChangeValue(ref Int32 k)
        {
            k= 1;
        }
        static void Main(string[] args)
        {
            Int32 number = 100;
            Console.WriteLine("修改前:{0}", number);
            ChangeValue(ref number);
            Console.WriteLine("修改后:{0}", number);
        }    
    }
}

输出结果:

修改前:100
修改后:1


2.引用类型

按引用传参时,传递的是栈中的地址,继而会根据改地址找到对应的堆中的对象数据,因此,修改的也会是对象本身。

示例代码:

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

namespace ConsoleApplication1
{
    class Program
    {
        public static void ChangeValue(ref Int32[] k)
        {
            k = new Int32[3] { 3, 3, 3 };
            k[0] = 1;
        }
        static void Main(string[] args)
        {
            Int32[] number = {100,200,300};
            Console.WriteLine("修改前:{0},{1},{2}", number[0],number[1],number[2]);
            ChangeValue(ref number);
            Console.WriteLine("修改后:{0},{1},{2}", number[0], number[1], number[2]);
        }    
    }
}

输出结果:
修改前:100,200,300
修改后:1,3,3
、ref与out、params区别

按引用传参时需要用到ref与out两个关键字,其区别如下:

1.ref传参时,传入的参数必须是初始化之后的数据;而out,必须在方法中对其完成初始化;

2.使用out可以返回一个值

3.params用于传递数组参数


参考:http://blog.csdn.net/trustin_/article/details/9943617(有图解释,比较直观)


C# 值类型传参、引用类型传参,布布扣,bubuko.com

C# 值类型传参、引用类型传参

原文:http://blog.csdn.net/fengzhongzhishenfu/article/details/23254371

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!