浅析C#值传递与引用值传递

先上一段代码。

using UnityEngine;
using System.Collections;

public class TypePassing : MonoBehaviour {
    public Dog dog = new Dog (1, "xiaobai") ;
    //调用默认构造函数给struct里所有字段一个缺省值,对dog来说是null
    public Cat cat = new Cat ();//貌似在这里不能直接赋值dog属性
    int i = 0;
    void Start(){
        cat = new Cat (dog, 1, "xiaohua");
        ParameterPass (dog);
        Debug.Log (dog.number + dog.name);//1xiaobai
        ParameterPass (out dog);
        Debug.Log (dog.number + dog.name);//8yuzi
        ParameterPass (i);
        Debug.Log ("i="+i);//i=0
        ParameterPass (ref i);
        Debug.Log ("i="+i);//i=2
        Debug.Log (cat.name + cat.number + cat.dog.name);//xiaohua1xiaobai
        ParameterPass (cat);
        Debug.Log (cat.name + cat.number + cat.dog.name);//xiaohua1xiaobai
    }
    //不带ref的引用传递,只有在改变对象的字段时才会影响原来对象
    //推测是一个新的变量指向原来的地址,对值类型直接copy一份过来
    void ParameterPass(Dog dog){
        dog = new Dog(6,"xiaolong");
    }
    //使用ref的传递是彻底的引用传递,无论对参数进行什么操作都将影响原来对象
    /*void ParameterPass(ref Dog dog){
        dog = new Dog(7,"feizi");
    }*/
    //out与ref类似,不做任何复制,直接传递引用
    //out与ref不能重载,与不带out、ref的方法能重载
    void ParameterPass(out Dog dog){
        dog = new Dog(8,"yuzi");
    }
    void ParameterPass(int i){
        i = 1;
    }
    void ParameterPass(ref int i){
        i = 2;
    }
    void ParameterPass(Cat cat){
        cat.name = "simao";
        cat.dog = new Dog(8,"yuzi");
        cat.dog.name = "feizhu";
    }
}

public class Dog{
    public int number;
    public string name;
    public Dog(int number, string name){
        this.number = number;
        this.name = name;
    }
}
public struct Cat{
    public Dog dog;
    public int number;
    public string name;
    public Cat(Dog dog,int number,string name){
        this.dog = dog;
        this.number = number;
        this.name = name;
    }
}

 C#的值类型包括struct和enum,我们常用的int、byte等是一种特殊的值类型,声明一个int类型,实际上是声明一个System.Int32结构类型,所有的值类型都隐性继承自System.ValueType。C#的引用类型包括类、接口和委托。

  传递值类型的参数就是直接把该值复制一份传递给方法,传递引用类型的参数,可能是传递了一个指向该对象的新的变量给方法使用。对该变量进行赋值是不会影响原来对象的,但是改变该变量的字段属性则会影响原来对象,原因该变量与方法外部变量指向了堆内的同一个对象。

  当使用ref和out的时候,传递的就是原来的变量。对参数进行任何改动,就相当于直接对原来的变量进行改动。

  那么当结构类型里面包含引用类型,使用不带ref的参数进行值传递呢?对于结构里面的非引用部分,肯定是不会影响。对于引用部分,通过实验,也是不影响的。

时间: 2024-10-24 21:34:16

浅析C#值传递与引用值传递的相关文章

Java值传递以及引用的传递、数组的传递!!

转(http://blog.csdn.net/niuniu20008/article/details/2953785) 许多编程语言都有2种方法将参数传递给方法------按值传递和按引用传递. 与其他语言不同,Java不允许程序员选择按值传递还是按引用传递各个参数,基本类型(byte--short--int--long--float--double--boolean--char)的变量总是按值传递.就对象而言,不是将对象本身传递给方法,而是将对象的的引用或者说对象的首地址传递给方法,引用本身是

Java String 值传递 VS 引用传递

在Java代码中,如果方法参数中有String类型,那么这个参数是值传递还是方法传递呢? 基本类型容易理解,对象类型也容易理解,可偏偏String这个对象类型让人有些疑惑.别着急,看完你就清晰了. 其实,我们大可不必纠结于文字游戏,在Java中宣称只有值传递,而在C++程序员来看要区分为值传递和引用/指针传递,实质上是一致的. 1. 对于基本类型,如int.char,大家都能理解,属于值传递,一个方法中对于基本类型的修改,不会反馈到方法调用者. public static void main(S

这一次,彻底解决Java的值传递和引用传递

本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java只有值传递,有的博客说两者皆有:这让人有点摸不着头脑,下面我们就这个话题做一些探讨,对书籍.对论坛博客的说法,做一次考证,以得出信得过的答案. 其实,对于值传递和引用传递的语法和运用,百度一下,就能出来可观的解释和例子数目,或许你看一下例子好像就懂,但是当

堆栈详解 + 彻底理解Java的值传递和引用传递

本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java只有值传递,有的博客说两者皆有:这让人有点摸不着头脑,下面我们就这个话题做一些探讨,对书籍.对论坛博客的说法,做一次考证,以得出信得过的答案. 其实,对于值传递和引用传递的语法和运用,百度一下,就能出来可观的解释和例子数目,或许你看一下例子好像就懂,但是当

老生常谈--Java值传递和引用传递

起因 前两天面试被问到了这个问题,虽然之前老早就了解过这个问题,但是并没有深入了解,所以面试的时候一下子慌了,菜是原罪,今天菜鸡来补补基础知识. 其实这个问题一直是被讨论的,常见的三种说法就是,1,Java 值传递引用传递都有,2,只有值传递,3只有引用传递,今天查了很多资料,我发现这个问题并不是随随便便就能说清楚. 先说传参 方法的参数可以分为实参和形参,实参是指被调用时传入的实际的值,在方法调用前就已经初始化完毕.而形参是指方法中用来“承接”实参的参数,它是在这个方法里有效,即作用域.方法执

浅析java中的值传递与引用传递

public class Test { public static void main(String[] args) { String s = new String("aaa"); change(s); System.out.println(s); StringBuilder sb = new StringBuilder("111"); change(sb); System.out.println(sb); } static void change(String s

值传递,指针传递;引用传递(c++独有)本质

要理解值传递.指针传递和引用传递的区别,主要要理解函数的实参和形参,函数的作用域(自动变量.栈),内存的布局以及指针和引用的特点.这里主要总结三种参数传递方式使用的主要场合. 值传递:只给函数提供输入值,需要复制开销,大对象很少使用值传递. 指针传递:可以改变指针指向内容的值,但是不能改变指针本身,无需复制开销.如果需要改变指针本身,可以使用二重指针或者指针引用. 引用传递:除了提供输入值外,还返回操作结果,无需复制开销. #include<stdlib.h> //值传递,函数体内变量n是参数

Java中的值传递和引用传递

解释 1.Java中有没有引用传递? 答:Java中只有按值传递,没有按引用传递! 2.当一个对象被当作参数传递到一个方法中后,在此方法中可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递. Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言).如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的,如果在函数中改变了副本

c# 值类型与引用类型 值传递与引用传递

值类型与引用类型: 值类型 :1.值类型大小固定.存储在栈上.  2.不能继承,只能实现接口 3.派生自valuetype int double char float byte bool enum struct decimal 引用类型:1.在栈上存储了一个地址实际存储在堆中,大小不固定. 2.数组.类.接口.委托 string 数组 类 接口 委托 值传递与引用传递: 值类型按值传递.值类型按引用传递.引用类型按值传递.引用类型按引用传递. 值传递:默认传递都是值传递 ,把栈中内容拷贝一份引用