巧妙理解方法的值参数与引用参数
2010-03-25 21:55
267 查看
巧妙理解方法的值参数与引用参数
方法的传值与传地址一直是困扰很多初学者的问题,下面有一种容易理解的方法,先看下面的程序:
class Program
{
static void SwapValue(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
static void Main(string[] args)
{
int a = 100;
int b = 10;
Console.WriteLine("执行传值函数前a={0},b={1}",a,b);
SwapValue(a, b);
Console.WriteLine("执行传值函数后a={0},b={1}", a, b);
Console.ReadLine();
}
}
运行的结果为:
可见,调用方法SwapValue(int a,int b) 后,实参a,b的值并没有改变.
参数可以通过引用或值传递给方法。在变量通过引用传递给方法时,被调用的方法得到的就是这个变量,所以在方法内部对变量进行的任何改变在方法退出后仍旧发挥作用。而如果变量是通过值传送给方法的,被调用的方法得到的是变量的一个副本,也就是说,在方法退出后,对变量进行的修改会丢失。对于复杂的数据类型,按引用传递的效率更高,因为在按值传递时,必须复制大量的数据。
现在举例便于理解:
建立两个文件夹 SwapValue和Main
在Main文件夹中建立两个文本文件a和b,存放的类容分别是100和10
由于如果变量是通过值传送给方法的,被调用的方法得到的是变量的一个副本,也就是说复制了一份,那么,把刚才Main文件夹下面的a和b两个文件都复制到SwapValue文件夹下面
然后把文件a的类容改为10,文件b的类容改为100,这类似方法的值传递,改变数值是在复制的副本上进行更改的,显然Main文件夹的类容不会改变.
再看看传引用参数的程序示例:
class Program
{
static void SwapRef(ref int a,ref int b)
{
int temp = a;
a = b;
b = temp;
}
static void Main(string[] args)
{
int a = 100;
int b = 10;
Console.WriteLine("执行传址函数前a={0},b={1}",a,b);
SwapRef(ref a,ref b);
Console.WriteLine("执行传址函数后a={0},b={1}", a,b);
Console.ReadLine();
}
}
运行结果为:
结果a和b的值互换了.
通过值传送变量是默认的,也可以迫使值参数通过引用传送给方法。为此,要使用ref关键字。如果把一个参数传递给方法,且这个方法的输入参数前带有ref关键字,则该方法对变量所作的任何改变都会影响原来对象的值.
举例如下,另外建立一个文件夹SwapRef
在SwapRef文件夹下面建立两个快捷方式,分别指向Main文件夹中的a和b 文件
然后把SwapRef 文件夹下面的a 文件类容改为10,b文件类容改为100保存,再打开Main
下面的a文件,发现类容改了,成来了10,b类容也改了,成了100.
快捷方式其实就是指向原文件的地址的引用,它和原文件共用一块区域.
这与引用参数有相似之处,引用参数并不创建新的存储单元,它与方法调用中的实在参数变量同处一个存储单元,因此,再方法内对形参的修改就是对外部实参变量的修改.
这样就容易理解多了吧.
方法的传值与传地址一直是困扰很多初学者的问题,下面有一种容易理解的方法,先看下面的程序:
class Program
{
static void SwapValue(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
static void Main(string[] args)
{
int a = 100;
int b = 10;
Console.WriteLine("执行传值函数前a={0},b={1}",a,b);
SwapValue(a, b);
Console.WriteLine("执行传值函数后a={0},b={1}", a, b);
Console.ReadLine();
}
}
运行的结果为:
可见,调用方法SwapValue(int a,int b) 后,实参a,b的值并没有改变.
参数可以通过引用或值传递给方法。在变量通过引用传递给方法时,被调用的方法得到的就是这个变量,所以在方法内部对变量进行的任何改变在方法退出后仍旧发挥作用。而如果变量是通过值传送给方法的,被调用的方法得到的是变量的一个副本,也就是说,在方法退出后,对变量进行的修改会丢失。对于复杂的数据类型,按引用传递的效率更高,因为在按值传递时,必须复制大量的数据。
现在举例便于理解:
建立两个文件夹 SwapValue和Main
在Main文件夹中建立两个文本文件a和b,存放的类容分别是100和10
由于如果变量是通过值传送给方法的,被调用的方法得到的是变量的一个副本,也就是说复制了一份,那么,把刚才Main文件夹下面的a和b两个文件都复制到SwapValue文件夹下面
然后把文件a的类容改为10,文件b的类容改为100,这类似方法的值传递,改变数值是在复制的副本上进行更改的,显然Main文件夹的类容不会改变.
再看看传引用参数的程序示例:
class Program
{
static void SwapRef(ref int a,ref int b)
{
int temp = a;
a = b;
b = temp;
}
static void Main(string[] args)
{
int a = 100;
int b = 10;
Console.WriteLine("执行传址函数前a={0},b={1}",a,b);
SwapRef(ref a,ref b);
Console.WriteLine("执行传址函数后a={0},b={1}", a,b);
Console.ReadLine();
}
}
运行结果为:
结果a和b的值互换了.
通过值传送变量是默认的,也可以迫使值参数通过引用传送给方法。为此,要使用ref关键字。如果把一个参数传递给方法,且这个方法的输入参数前带有ref关键字,则该方法对变量所作的任何改变都会影响原来对象的值.
举例如下,另外建立一个文件夹SwapRef
在SwapRef文件夹下面建立两个快捷方式,分别指向Main文件夹中的a和b 文件
然后把SwapRef 文件夹下面的a 文件类容改为10,b文件类容改为100保存,再打开Main
下面的a文件,发现类容改了,成来了10,b类容也改了,成了100.
快捷方式其实就是指向原文件的地址的引用,它和原文件共用一块区域.
这与引用参数有相似之处,引用参数并不创建新的存储单元,它与方法调用中的实在参数变量同处一个存储单元,因此,再方法内对形参的修改就是对外部实参变量的修改.
这样就容易理解多了吧.
相关文章推荐
- Java中方法参数传递----传值与传引用的理解
- Java语言中的方法参数——值传递与引用传递
- 详解java中给方法传递参数的两种方式:按值传递,引用传递
- jquery引用方法时传递参数原理分析
- JAVA方法传递参数:传值?传引用?
- Java方法参数引用
- c#学习笔记之十 socket编程的listen()方法参数的理解,即backlog
- 抽象类和接口的区别,内部类引用外部方法final参数,守护线程和用户线程
- Java:方法的参数是传值还是传引用
- 在java中实现C#语法里的按引用传递参数的方法
- ref和out,以及一般方法的引用参数和值参数寻解
- 【java】值传递和引用传递---对象作为方法的参数传入属于哪种传递
- 方法传递参数&按值传递和按引用传递
- Java方法参数-值传递、引用传递
- Java参数传递造成参数值改变的情况--值传递和引用传递的初步理解
- java方法参数基本类型和方法参数是引用类型的区别
- C++的三种传递参数到函数的方法:按值传递,用引用参数按引用传递,用指针参数按引用传递
- 泛型类引用有参数的构造函数方法
- 小静的心路历程--javase基础语法第一章--方法的参数是基本数据类型和引用类型
- 深入理解Javascript动态方法调用与参数修改的问题