C#中参数的传递方式详解

 更新时间:2022年07月31日 11:56:18   作者:Darren Ji  
本文详细讲解了C#中参数的传递方式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

值类型参数按值传递

    class Program 
    { 
        static void Main(string[] args) 
        { 
            int a = 10; 
            Add(a); 
            Console.WriteLine("传递之后的值为:" + a); 
            Console.ReadKey(); 
        }
 
        private static void Add(int i) 
        { 
            Console.WriteLine("传递之前的值为:" + i); 
            i = i + 10; 
           
        } 
    }

结果:

可见,值类型参数在被方法调用的时候,是对本身实例的拷贝和操作,在方法调用前后参数值不变。

引用类型参数按值传递

当引用类型参数传递时,是对托管堆上对象实例内容的操作。
也就是引用类型按值传递,传递的是引用变量的指针,指向托管堆上的对象实例。

    class Program 
    { 
        static void Main(string[] args) 
        { 
            Student student = new Student(); 
            Add(student); 
            Console.WriteLine("参数传递之后的值为:" +student._score); 
            Console.ReadKey(); 
        }
 
 
        private static void Add(Student s) 
        { 
           Console.WriteLine("参数传递之前的值为:" + s._score); 
            s._score = 90; 
        } 
    }
 
    public class Student 
    { 
        public int _score = 80; 
    }

结果

可见,引用类型参数在被方法调用的时候,是针对变量的引用的操作,一旦引用对象内容发生改变,原来变量的值也随着改变。

按引用传递 ref和out

引用类型参数按值传递和按引用传递的不同之处:

  • 按值传递,传递的是参数本身的值,即引用指针。
  • 按引用传递,传递的是参数的地址,也就是实例指针。

另外,值类型也有按引用传递,这时候,传递的是值类型的地址。

   class Program 
    { 
        static void Main(string[] args) 
        { 
            int i = 100; 
            string str = "one"; 
            ChangeByValue(ref  i); 
            ChangeByRef(ref str); 
            Console.WriteLine(i); 
            Console.WriteLine(str);
 
            Console.ReadKey(); 
        }
 
        private static void ChangeByValue(ref int iValue) 
        { 
            iValue = 200; 
        }
 
        private static void ChangeByRef(ref string sValue) 
        { 
            sValue = "One more"; 
        } 
    }

可见,不管是值类型,还是引用类型,加入关键字ref作为参数,就意味着是对参数地址的操作,即托管堆上实例地址的改变。

另外:

  • 如果需要按引用传递,方法的定义和方法的调用,都要显式地使用ref和out。
  • 如果一个方法的参数除了ref和out关键字不同,还有其他参数不同,这才构成方法的2个重载。如果仅仅ref和out关键字不同,会报错"...不能仅在ref和out上有差别的重载方法"。

ref和out使用时的不同点:

out告诉编译器,参数会在方法内部初始化,而在方法之前不需要初始化。

int x;
Foo(out x);

ref告诉编译器,参数在方法之前必须初始化。

int y = 0;
Foo(ref y);

特殊引用类型string的传递

    class Program 
    { 
        static void Main(string[] args) 
        { 
            string str = "Old String"; 
            Console.WriteLine("传递之前的值为:" + str); 
            ChangeStr(str); 
            Console.WriteLine("传递之后的值为:"+str); 
            Console.ReadKey(); 
        }
 
        private static void ChangeStr(string astr) 
        { 
            astr = "Change String"; 
        } 
    }

结果:

可见,虽然string是引用类型,但按值传递的表现和值类型按值传递的表现一样。

总结

  • 引用类型按值传递,改变的是引用变量指向的托管堆上对象实例的内容。
  • 引用类型按引用传递,改变的是引用变量指向的托管堆上对象实例的地址。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • 探讨如何用委托处理排序

    探讨如何用委托处理排序

    本篇文章是对用委托处理排序进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Unity实现人物旋转和移动效果

    Unity实现人物旋转和移动效果

    这篇文章主要为大家详细介绍了Unity实现人物旋转和移动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • 一篇文章教会你用Unity制作网格地图生成组件

    一篇文章教会你用Unity制作网格地图生成组件

    网格地图这个功能在策略型游戏中应用比较广泛,基本情况下会将地图分割成正方形网格或者六边形网格,这篇文章主要给大家介绍了如何通过一篇文章学会用Unity制作网格地图生成组件的相关资料,需要的朋友可以参考下
    2021-08-08
  • C#如何自定义线性节点链表集合

    C#如何自定义线性节点链表集合

    C#如何自定义线性节点链表集合,这篇文章主要为大家详细介绍了C#基于泛型的自定义线性节点链表集合示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • C#生成随机数功能示例

    C#生成随机数功能示例

    这篇文章主要介绍了C#生成随机数功能,涉及C#数学运算与字符串操作相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2017-01-01
  • C#使用DeflateStream解压缩数据文件的方法

    C#使用DeflateStream解压缩数据文件的方法

    这篇文章主要介绍了C#使用DeflateStream解压缩数据文件的方法,较为详细的分析了DeflateStream方法对文件进行压缩及解压缩的步骤与技巧,需要的朋友可以参考下
    2015-04-04
  • C# XML文件操作之相机参数保存和读取

    C# XML文件操作之相机参数保存和读取

    XML是可扩展标记语言是一种数据语言,它将数据以一种简单的文本格式存储,可以被人类和几乎任何计算机理解。本文将利用C#实现相机参数读取并保存至XML文件,感兴趣的可以学习一下
    2022-11-11
  • C#多线程TPL模式下使用HttpClient

    C#多线程TPL模式下使用HttpClient

    这篇文章介绍了C#多线程TPL模式下使用HttpClient的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • C++泛型编程Generic Programming的使用

    C++泛型编程Generic Programming的使用

    本文主要介绍了C++泛型编程Generic Programming的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • C#获取指定目录最后写入时间的方法

    C#获取指定目录最后写入时间的方法

    这篇文章主要介绍了C#获取指定目录最后写入时间的方法,涉及C#中LastWriteTime属性的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04

最新评论