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

 

时间: 2024-12-06 16:18:59

C#中的引用传递和值传递。的相关文章

理解Java中的引用传递和值传递

关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习和分析一下,着急可以先看最后的结论. >>基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型.基本类型的变量保存原始值,即它代表的值就是数值本身:而引用类型的变量保存引用值,"引用值"指向内存空间的地

(转载)理解Java中的引用传递和值传递

关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习和分析一下,着急可以先看最后的结论. 1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型.基本类型的变量保存原始值,即它代表的值就是数值本身:而引用类型的变量保存引用值,"引用值"指向内存空间的地址,代表了某

Java中没有引用传递只有值传递(在函数中)

◆传参的问题 引用类型(在函数调用中)的传参问题,是一个相当扯的问题.有些书上说是传值,有些书上说是传引用.搞得Java程序员都快成神经分裂了.所以,我们最后来谈一下“引用类型参数传递”的问题. 如下例子,假设现在要把刚才创建的那一坨字符串打印出来,我们会使用如下语句: StringBuffer str = new StringBuffer(); System.out.println(str); //这个语句又是什么意思捏?这时候就两说了. 第一种理解:可以认为传进函数的是str这个指针,指针说

Java中是引用传递还是值传递?

前言 在学习Java编程语言过程中最容易让你产生误解的问题之一就是 java是值传递还是引用传递.今天就来围绕这个话题揭开迷雾. 概念 首先先来认识一下什么是值传递什么是引用传递. 值传递: 将方法实际参数值复制到另一个变量,然后复制的对象被传递,这就是为什么它被称为"值传递" 引用传递:将实际参数的引用传递给该方法,这就是为什么它被引用称为"传递"的原因. 例子分析1 问题:如果java是使用引用传递的话,为什么在函数中 变量的交换会没有卵用呢? 答案:java通

关于java中是引用传递还是值传递的问题!!!经常在笔试中遇到,今天终于弄明白了!

关于JAVA中参数传递问题有两种,一种是按值传递(如果是基本类型),另一种是按引用传递(如果是對象).首先以两个例子开始:1)public class Test2 { public static void main (String [] args) { StringBuffer a = new StringBuffer ("A"); StringBuffer b = new StringBuffer ("B"); operate (a,b); System.out.

Java技术_Java千百问(0039)_引用传递和值传递有什么区别

点击进入_更多_Java千百问 1.什么是值传递 值传递,是将内存空间中某个存储单元中存放的值,传送给另一个存储单元.(java中的存储单元并不是物理内存的地址,但具有相关性) 例如: //定义了一个改变参数值的函数 public static void changeValue(int x) { ??x = x *2; } public class TestMain{ //调用该函数 int num = 5; System.out.println(num); changeValue(num);

引用传递与值传递

一.ECMAScript中的数据类型 1.基本数据类型:null.undefined.number.boolean.string 2.引用数据类型:object(obj.[].{}.function.RegExp等),是由一组无序的名值对组成的 3.typeof与instanceof作用: typeof是用来检测这些基本数据类型的: 返回"underfined",表示这个值只是被声明了,却没有给其定义,也可以理解为没有赋值 返回"boolean"表示这个值是布尔值,

Java Object 引用传递和值传递

Java Object 引用传递和值传递 @author ixenos Java中的引用传递: 除了在将参数传递给方法(或函数)的时候是"值传递",传递对象引用的副本,在任何用"="向引用对象变量赋值的时候都是"引用传递",传递对象的引用给另一个变量. 参数传递,传递引用的副本,这看起来是引用传递,实则是传递了副本,这已经是值传递的概念了: 变量赋值,传递引用,这算引用传递 Java参数传递中没有引用传递都是值传递 1.在 Java 应用程序中永

java引用传递和值传递

关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习和分析一下,着急可以先看最后的结论. 1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型.基本类型的变量保存原始值,即它代表的值就是数值本身:而引用类型的变量保存引用值,"引用值"指向内存空间的地址,代表了某

一道关于引用传递和值传递的JS题

先看题1 var obj = {name:"a"} function bar(obj) { console.log(obj.name); obj = {name:"b"}; console.log(obj.name) } console.log(bar(obj)) console.log(obj.name) 在chrome控制台执行以下看看,发现依次打印 aba 题2,稍微有点变化 var obj = {name:"a"} function ba