C#按值传递和按引用传递

C#--方法

1、访问修饰符(Access Modifier)

  • public:                     可以被任意调用。
  • protected:                 可以被内部类(containing class)和派生类(derived class)调用。
  • internal:                    只可以被当前assembly的所有成员调用。
  • protected internal:    不仅可以被当前assembly的所有成员调用,还允许任意assembly中内部类(containing class)的派生类(derived class)调用。
  • private(default):    只可以被内部类(containing class)调用。
2、参数(Parameters)

  • 按值传递(value parameters)按值传递的变量可以是值类型或者引用类型,理解这一点很重要。这就意味着存在按值传递引用类型变量(Using a Value Parameter to Modify a Reference Type)按值传递值类型变量(Using a Value Parameter to Modify a Value Type)两种情况,代码示例如下
  • using System;
    namespace MyApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                int number= 0;
                Good mygood = new Good(200,"Watch");
                Console.WriteLine("Price = {0},Name = {1},number = {2}", mygood.Price, mygood.Name,number);
                test(mygood, number);
                Console.WriteLine("Price = {0},Name = {1},number = {2}", mygood.Price, mygood.Name, number);
                Console.ReadLine();
            }
            static void test(Good good,int num)
            {
                good.Price = 500;
                good.Name = "Phone";
                num = 5;
                Console.WriteLine("Price = {0},Name = {1},number = {2}",good.Price,good.Name,num);
            }
        }
        class Good 
        {
            int price;
            string name;
            public Good(int p,string n)
            {
                price = p;
                name = n;
            }
            public int Price
            {
                get { return price; }
                set { price = value; }
            }
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
        }
    }


  • 运行结果:
    • Price = 200,Name = Watch,number = 0
      Price = 500,Name = Phone,number = 5
      Price = 500,Name = Phone,number = 0
    • 结果分析: test函数分别按值传递引用类型的Good变量和值类型的number变量。test函数good和主函数的mygood虽然是两个不同的变量,但引用的是同一个Good实例。因此利用good改变实例的字段之后,mygood访问得到的必然也是变化后的实例。number和num是两个不同的值类型的变量,对值类型的变量修改只修改自身的内容。

  • 按引用传递(reference parameters)同理,按引用传递也分为按引用传递引用类型变量(Using a Reference Parameter to Modify a Reference Type)和按引用传递值类型变量(Using a Reference Parameter to Modify a Value Type,代码示例如下:
  •  <span style="color:#330099;">class Program
        {
            static void Main(string[] args)
            {
                int number= 0;
                Good mygood = new Good(200,"Watch");
                Console.WriteLine("Orignal data:");
                Console.WriteLine("Price = {0},Name = {1},number = {2}", mygood.Price, mygood.Name,number);
                test_ref(ref mygood, ref number);
                Console.WriteLine("Price = {0},Name = {1},number = {2}", mygood.Price, mygood.Name,number);
                test_val(mygood, number);
                Console.WriteLine("Price = {0},Name = {1},number = {2}", mygood.Price, mygood.Name, number);
                Console.ReadLine();
            }
            static void test_ref(ref Good good,ref int num)
            {
                good = new Good(100, "Phone");
                num = 5;
                Console.WriteLine("after test_ref:");
                Console.WriteLine("good.Price = {0},good.Name = {1},num={2}",good.Price,good.Name,num);
            }
            static void test_val(Good good, int num)
            {
               good = new Good(50, "Television");
                num = 10;
                Console.WriteLine("after test_val:");
                Console.WriteLine("good.Price = {0},good.Name = {1},num={2}", good.Price, good.Name,num);
            }
        }</span>
  • 运行结果:
  • Orignal data:
    Price = 200,Name = Watch,number = 0
    after test_ref:
    good.Price = 100,good.Name = Phone,num=5
    Price = 100,Name = Phone,number = 5
    after test_val:
    good.Price = 50,good.Name = Television,num=10
    Price = 100,Name = Phone,number = 5

  • 结果分析:
  • test_ref(ref mygood,ref number),good是mygood的引用,而mygood是Good实例的引用,对good重新赋值就相当于对mygood赋值,会改变原Good实例。而test_val(mygood,number),good和mygood两个不同的Good型引用,对二者进行赋值操作不会相互影响。(注意:这里的赋值指的是对引用赋值,与通过引用对字段赋值是不同的)。




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值