C#中值传递与引用传递的区别

以值传递参数

当实参当作值来传递时,就产生了一个新的拷贝。

class Test     {

static void Main(string[] args)         {

int x=8;

Fo(x);

Console.WriteLine("x={0}", x);

}

static void Fo(int p)

{

p = p + 1;

Console.WriteLine("p={0}", p);

}

}    程序运行结果为:p=9,x=8;即X的值不会受P影响,给P赋一个新值并不会改变X的内容,因为P和X存在于内存中不同的位置。

同理,用传值的方式传递一个引用类型对象时,只是复制这个对象本身,即复制其地址值,而不是它指代的对象。下面代码中Fo中看到的StringBuilder对象,就是在Main方法中实例化的那一个,只是有不同的引用指向它而已。  static void Fo(StringBuilder foSB)

{

foSB.Append("test");

foSB = null;

}

static void Main()

{

StringBuilder sb = new StringBuilder();

Fo(sb);

Console.WriteLine(sb.ToString());

}    运行结果:test.

换句话说,sb和foSB是指向同一对象的不同引用变量。因为foSB是引用的拷贝,把它置为null并没有把sb置为 null.

ref修饰符

当使用rel关键字时,表示是用引用的方式传递参数。实参和形参引用的都是同一个对象,改变其中一个的引用值,另一个也会改变。

static void Main(string[] args)

{

int x = 8;

Fo(ref x);

Console.WriteLine("x={0}", x);

}

static void Fo(ref int p)

{

p = p + 1;

Console.WriteLine("p={0}", p);

}    运行结果:P=9;X=9  。

如果在函数FO中改变P的值,则X的值也会随之改变。  static void Main(string[] args)

{

int x = 8;

Fo(ref x);

Console.WriteLine("x={0}", x);

}

static void Fo(ref int p)

{

p = 10;

p = p + 1;

Console.WriteLine("p={0}", p);

}  运行结果:P=11,X=11;

ref修饰符在写函数和调用函数时都一定要出现。

ref修饰符主要应该于实现交换的方法中。  static void Swap(ref string a, ref string b)

{

string temp = a;

a = b;

b = temp;

}

static void Main()

{

string x = "Hello";

string y = "World";

Swap(ref x, ref y);

Console .WriteLine (x);

Console.WriteLine(y);

}   运行结果:World Hello

out修饰符

out修饰符与ref修饰符非常相似,除了以下两点为:

一,在调用函数时不需要赋值。

二,在函数退出前必须赋值。

out修饰符通常用于需要从方法中获取多个返回值的时候  static void Split(string name, out string firstName, out string lastName)

{

int i=name .LastIndexOf (‘ ‘);

firstName =name .Substring (0,i);

lastName =name .Substring (i+1);

}

static void Main()

{

string name = "Steven Francis";

string a, b;

Split(name, out a, out b);

Console .WriteLine (a);

Console .WriteLine (b);

}    运行结果:a=Steven,b=Francis  总结:  1,值传递时,为什么被调用的方法中的形参值的改变不会影响到相应的实参?

答:因为按值传递时,系统首先为被调用的方法的形参分配内存空间,然后把实参中的值按位置一一对应“复制”给形参。形参中存储的值只是一份实参的拷贝,因此被调用方法中形参值的任何改变都不会影响到相应的形参。

  2,值传递和引用传递有什么不同,什么是值参数,它以什么方式传递? 答:值 传递时,系统首先为被调用方法的形参分配内存空间,并将实参的值按位置一一对应地复制给形参,此后,被调用方法中形参值得任何改变都不会影响到相应的实 参; 而引用传递时,系统不是将实参本身的值复制后传递给形参,而是将其引用值(即地址值)传递给形参,因此,形参所引用的该地址上的变量与传递的实参相同,方 法体内相应形参值得任何改变都将影响到作为引用传递的实参。

  3,什么是形参,什么是实参? 答: 形参:在定义函数中指定的参数就是形参,在未出现函数调用时,他们并不占内存中的存储单元,只有在发生函数调用时,函数中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。
实参:实参可以是常量、变量和表达式,但要求有确定的值。在调用时将实参的值赋给形参。在内存中,实参单元和形参单元是不同的单元。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留原值。
理解: 实参就是送进去方法中的东西~~行参就是把送进来的东西在方法中进行拷贝加工,加工完后方法就返回一个东西--返回值。

  值传递的时候,实参是不变的~形参是随着计算而变化的~~ 引用传递的时候~~行参怎么变~实参就怎么变.... 
参数的传递分为:1.值方式参数传递,2.引用方式参数传递。

时间: 2024-08-30 11:43:59

C#中值传递与引用传递的区别的相关文章

Java中的值传递和引用传递

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

java中参数传递--值传递,引用传递

java中的参数传递--值传递.引用传递 参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递. 在 Java 应用程序中永远不会传递对象,而只传递对象引用.因此是按引用传递对象.Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数.参数可以是对象引用,而 Java 应用程序是按值传递对象引用的. Java 应用程序中的变量可以为以下两种类型之一:引用类型或基本类型.当作为参数传递给一个方法时,处理这两种类型的方式是相同的.两

java中值传递和引用传递

本来今天刚学习的内容,然后去其他博客看了下,发现都吵起来了,就是名字原因,有的说java有值传递和引用传递,有的说引用传递本质就是值传递,我管你杂说的,只要自己理解好,代码知道运行结果就好了. 我用自己的话,自己的理解来解释下,反正都是自己写着玩,自己看的 值传递:传递的值,这个值以后怎么改变,源值不会发生改变的. 引用传递:将对象的引用地址传递过去,如果值发生改变,那么源值也发生改变. 代码如下: 值传递: public class Test1 { public static void mai

第002弹:Java 中的值传递和引用传递

在 Java 的代码开发过程中,为了尽可能提高方法的复用性,明确方法的作用,同时防止一个方法内部过于臃肿的问题,往往会创建许多方法,那么不可避免地会涉及到参数传递的问题.通常来说,我们将 Java 中的参数传递分为两种:值传递和引用传递. 值传递:参数在进入方法时,将入参深度复制一个副本,在方法内部操作的是入参的副本,在方法执行完毕之后,外部的入参没有发生任何变化. 引用传递:在方法内部操作的是参数本身,对入参做出的修改会保留到方法的外部. 那么在 Java 中,哪些情况属于值传递,哪些情况属于

java中方法的参数传递机制(值传递还是引用传递)

看到一个java面试题: 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本.指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的. 以下是从其他文章里转的,只为加深理解 public class TempTest { private void te

Java中,函数参数的传递,是值传递还是引用传递

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递. 可以这么理解:有一个Person(name="S"),作为参数传给一个方法,在此方法中将此Person重新设置name=“B”,那么有一下结论 ①这个Person还是这个Person,一直都是他,但是他的名字被改了,不管是原来的引用还是方法里的引用,引用的都是一个对象,所以,所有引用的值都变了 ②如果在方法中重新new了一个Person赋给参数,

Java中的值传递与“引用传递”

首先,Java没有 引用传递 这么一说. Java只有值传递,传递的都是值,基本数据类型传递的是值,引用类型传递的是地址值. 我来理一下这其中犹如米线跟米面绞在一起了,再跟粉丝混在一起的关系. 好的,我们来看第一个例子: public static void main(String[] args) { int a = 1; int b = 4; System.out.println("Before : a=" + a + "," + "b=" +

java 中值传递和引用传递(转)

java中给函数传递参数的方式有两种:值传递和引用传递.一般而言,基本类型是值传递:引用类型是引用传递.但传值时到达发生了什么? 1.基本类型 8个基本类型(byte,short,int,long,float,double,char,boolean)是值传递. 1 public class ValueTest { 2 3 public static void main(String[] args) { 4 int a = 10; 5 changeVal(a); 6 System.out.prin

java中函数是值传递还是引用传递?

相信有些同学跟我一样,曾经对这个问题很疑惑.在网上也看了一些别人说的观点,评论不一.有说有值传递和引用传递两种,也有说只有值传递的,这里只说下个人见解 先看一个例子 public class Test1 { public static void main(String[] args) { int a = 10; changeNum(a); System.out.println("main a=" + a); } static void changeNum(int a) { a = 10

浅析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