C#中的引用传递和值传递

最近在写项目中有同事碰到这样的传值问题,可能很多对这个参数的传递还有点疑惑,自己也是对这个基础知识做一个回顾和巩固。

首先什么是值类型和引用类型可以去园里看一下相关的资料,都有介绍。

常用值类型包括:int ,long ,bool,decimal,char,float 等

常用的引用类型包括:string,arry,delegate, interface,class 等

一。传递值类型参数

向方法传递值类型变量意味着向方法传递变量的一个副本。方法内发生的对参数的更改对该变量中存储的原始数据无任何影响。如果希望所调用的方法更改参数的值,必须使用 ref 或 out 关键字通过引用传递该参数。

   static void SquareInt(int x)
    {
        x *= x;
        System.Console.WriteLine("步骤二: {0}", x);
    }
    static void Main()
    {
        int n = 5;
        System.Console.WriteLine("步骤一: {0}", n);

        SquareInt(n);  
        System.Console.WriteLine("步骤三: {0}", n);
    }

以上通过值传递值类型,输出:

步骤一:5  步骤二:25  步骤三:5

        static void SquareInt(ref int x)
        {
            x *= x;
            System.Console.WriteLine("步骤二: {0}", x);
        }  

       static void Main()
        {
            int n = 5;
            System.Console.WriteLine("步骤一: {0}", n);

            SquareInt(ref n);
            System.Console.WriteLine("步骤三: {0}", n);
        }

以上通过引用传递值类型,输出:步骤一:5  步骤二:25  步骤三:25

二。传递引用类型参数

引用类型的变量不直接包含其数据;它包含的是对其数据的引用。当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值。但是无法更改引用本身的值;也就是说,不能使用相同的引用为新类分配内存并使之在块外保持。若要这样做,应使用 ref 或 out 关键字传递参数。

        public class People
        {
            public string name { get; set; }

            public int age { get; set; }
        }

       static void Main()
        {
            People model = new People();
            model.name = "张三";
            model.age = 18;
            System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
            Change(model);
            System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
        }

        private void Change(People model)
        {
            model.name = "李四";
            model = new People() { name = "王五", age = 20 };
            System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
        }

以上通过值传递引用类型,输出:

姓名:张三,年龄:18         姓名:王五,年龄:20        姓名:李四,年龄:18

        public class People
        {
            public string name { get; set; }

            public int age { get; set; }
        }

       static void Main()
        {
            People model = new People();
            model.name = "张三";
            model.age = 18;
            System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
            Change(ref model);
            System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
        }

        private void Change(ref People model)
        {
            model.name = "李四";
            model = new People() { name = "王五", age = 20 };
            System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age);
        }

以上通过引用传递引用类型,输出:

姓名:张三,年龄:18         姓名:王五,年龄:20        姓名:王五,年龄:20

二。传递特殊的引用类型参数string

string是引用类型,没错,但它的很多操作是与值类型看齐的,下面直接代码演示

        static void Main()
        {
            string str1 = "张三";
            StringBuilder str2 = new StringBuilder();
            str2.Append("李四");
            System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString());

            SwapStrings(str1, str2);
            System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString());
        }

        private void SwapStrings(string s1,StringBuilder s2)
        {
            s1 = "张三疯";
            s2.Append("李四疯");
            s2 = new StringBuilder();
            s2.Append("王五");
            System.Console.WriteLine("str1是{0}str2是{1}", s1, s2.ToString());
        }
以上通过值传递引用类型string,输出:
str1是张三str2是李四               str1是张三疯str2是王五            str1是张三str2是李四李四疯
        static void Main()
        {
            string str1 = "张三";
            StringBuilder str2 = new StringBuilder();
            str2.Append("李四");
            System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString());

            SwapStrings(ref str1, ref str2);
            System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString());
        }

        private void SwapStrings(ref string s1,ref StringBuilder s2)
        {
            s1 = "张三疯";
            s2.Append("李四疯");
            s2 = new StringBuilder();
            s2.Append("王五");
            System.Console.WriteLine("str1是{0}str2是{1}", s1, s2.ToString());
        }

以上通过引用传递引用类型string,输出:

str1是张三str2是李四               str1是张三疯str2是王五           str1是张三疯str2是王五

weinxin
我的微信
一个码农、工程狮、集能量和智慧于一身的、DIY高手、小伙伴er很多的、80后奶爸。
Igor
  • 版权声明: 发表于 2019-12-2216:26:31
  • 转载注明:http://blog.tsingmac.com/prolions/codelanguage/mscs/2288/
c# - 异步使用MySQL DB C/C++/C#

c# – 异步使用MySQL DB

C#异步读取MySQL数据库的问题解决。 我试图了解异步使用数据库。为此,我用一个表创建了简单的MySQL数据库,然后可以通过以下方式从中获取信息: public static void SyncRe...
如何移动 nuget 缓存文件夹 C/C++/C#

如何移动 nuget 缓存文件夹

本文告诉大家如何移动 nuget 缓存文件夹。 因为 nuget 文件夹一般比较大,现在我的 nuget 文件夹有 10 G,默认的 nuget 文件夹是在C盘,所以需要移动他。
OpenCV在C#中应用—OpenCVSharp OpenCV

OpenCV在C#中应用—OpenCVSharp

之前一直是基于OpenCV开发视觉算法,但C++语言对于GUI的开发相对于C#来说确实很不方便,之前就了解到C#下使用OpenCV可以使用EmguCV,这段时间也确实是调通了,但是是通过把C++封装成...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: