Pass by value & pass by reference
来源:互联网 发布:小站托福怎么下载mac版 编辑:程序博客网 时间:2024/04/30 02:24
CR: http://blog.sina.com.cn/s/blog_499e0a9101000527.html
学过C#的人都知道,通过值或通过引用,值类型和引用类型都可以作为方法参数传递。在C#中,不管是值类型或者是引用类型,所有方法参数在默认情况下是通过值传递的。而在Visual Basic 6中,默认通过引用传递参数。
对于值类型和引用类型来说,通过值传递有不同的含义。以下将分别进行叙述:
1)通过值传递值类型
在通过值传递作为方法参数的变量时,传递给方法的是数据副本。在方法中对该数据的任何修改都不会对初始值有任何影响。
在下面的Visual Basic程序中:
Private Sub Form_Load()
Dim value as integer
value=50
DoSomething value
MsgBox value
End Sub
Public Sub DoSomething(parameter As Integer)
parameter=100
End Sub
在执行时,这个程序将显示一个包含值为100的消息框。这说明了在DoSomething方法中改变值会影响在Form_Load中定义的初始变量。这也就意味着改值是通过引用传递的。现在如果改变DoSomething的定义如下:
Public Sub DoSomething(ByVal parameter Integer)
现在弹出的消息框显示值为50,这次参数是通过值传递的,意味着值的副本是传递给子例程的,而不是初始变量的引用。
在默认情况下,Visual Basic6 通过引用传递参数,而C#通过值。看如下代码:
using System;
class MyExecutableClass
{
static void Main(string[] args)
{
int value=50;
DoSometing(value);
Console.WriteLine(value);
}
static void DoSomething(int parameter)
{
parameter=100;
}
}
程序的输出为50.也许你会感到奇怪,为什么不是100呢?因为变量value是通过值而不是引用传递的。我们不需要添加任何特殊的关键字,而是依赖于C#的默认行为,通过值传递值类型。
1)通过值传递值类型
现在弹出的消息框显示值为50,这次参数是通过值传递的,意味着值的副本是传递给子例程的,而不是初始变量的引用。
结果正如你所料,输出为100.
3)通过值传递引用类型
一般来说,通过值传递意味着传递存储在栈中的值。对于引用类型来说,存储在栈上的值表示对
内存中对象实际位置的引用。因此,如果通过值传递引用类型,就意味着传递的是对象的引用(它的堆栈)
.使用该引用作的改变最终会改变堆中的同一对象。
通过值传递引用类型不像通过值传递值类型---它更像通过引用传递值类型。在如下代码中,
我们将Person用作引用类型。
using System;
class MyExecutableClass
{
static void Main(string[] args)
{
Person person=new Person(50);
DoSomething(person);
Console.WriteLine(person.Age);
}
static void DoSomething(Person somePerson)
{
somePerson.Age=100;
}
}
class Person
{
public int Age;
public Person(int Age);
{
this.Age=Age;
}
}
运行程序,可以发现输出值为100.如果对DoSometing方法作如下修改;
static void DoSomething(Person somePerson)
{
somePeron=new Person(100);
}
内存中对象实际位置的引用。因此,如果通过值传递引用类型,就意味着传递的是对象的引用(它的堆栈)
.使用该引用作的改变最终会改变堆中的同一对象。
我们将Person用作引用类型。
using System;
class MyExecutableClass
class Person
调用DoSomething()方法时,我们创建了一个引用副本,它仍然指向同一对象,因此,对对象的改变会影响主程序。而对引用的改变则不会,在方法结束时,消失的只是引用的副本。
4) 通过引用传递引用类型
我们知道,在通过值传递引用类型时,我们传递对内存中对象位置的引用。而通过引用传递引用类型时,我们将传递引用的引用。
- Pass by value & pass by reference
- pass by value & pass by reference
- pass by value vs pass by reference
- pass by value 与pass by reference 小结
- [转]Does Java pass by reference or pass by value?
- 关于pass-by-reference-to-const和pass-by-value
- java pass by value 。do not exist pass by reference
- Does Java pass by reference or pass by value?
- Java is Pass-by-Value, Never pass by reference
- Pass by reference和pass by value区别举例
- Does Java pass by reference or pass by value?
- Is Java pass by VALUE or pass by REFERENCE?
- 关于 pass-by-reference-to-const 和 pass-by-value
- Pass By Value or Pass By Reference in java
- Does Java pass by reference or pass by value?
- 002:Is Java “pass-by-reference” or “pass-by-value”?
- Java Pass By Value and Pass By Reference
- Java: pass by value or reference?
- Memory:DRAM SRAM PROM EPROM EEPROM FLASH 区别 定义
- JadePool应用范例:完善China软件项目架构(一)
- Pyside-uic问题
- 【创新中国】91金融超市:打造简简单单的线上金融超市
- 快鲤鱼研报:健康导航应用ZocDoc
- Pass by value & pass by reference
- 风投把钱砸在了这十家初创公司
- Word Ladder
- Hibernate自动生成Java代码似乎是个垃圾
- 网络编程
- 正则表达式
- 基础加强-1(1.5新特性)
- JS 打开新窗口的方法
- JS刷新当前页面