• 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是王五    

     

  • 相关阅读:
    用java程序启动电脑中的软件 分类: java 20091105 01:03 355人阅读 评论(0) 收藏
    关于nextSibling的用法 20091103 01:53 311人阅读 评论(0) 收藏
    HTML中的标签用法 分类: 网页编程【html、js】 20091103 00:53 282人阅读 评论(0) 收藏
    我总结的正则表达式 分类: 正则表达式 20091106 23:01 298人阅读 评论(0) 收藏
    [正则表达式]非常经典的正则表达式 分类: 正则表达式 20091106 03:18 393人阅读 评论(0) 收藏
    读取zip,过滤中文名称 分类: java 20091106 22:46 385人阅读 评论(0) 收藏
    MS SQL与Oracle常用函数对比 分类: 数据库 20091105 23:41 259人阅读 评论(0) 收藏
    读取zip,不过滤中文名,即中文名称也能成功读取 分类: java 20091106 22:48 296人阅读 评论(0) 收藏
    根据字节数截取字符串... 分类: java 20091105 19:21 235人阅读 评论(0) 收藏
    Pattern类 分类: java 20091105 01:00 240人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/gangtienanzi/p/5535625.html
Copyright © 2020-2023  润新知