我們都知道C++傳遞參數有三種形式,傳值,傳指針和傳引用,而一般C#中只有傳值和傳引用,但無論是在C#中還是C++參數傳遞實際上只有兩種:值傳遞和引用傳遞,值傳遞就是將對象拷貝一份到棧上,引用傳遞則傳遞的就是對象本身。在弄清楚值傳遞和引用傳遞之前一定要弄清楚引用和指針的區別,指針的概念我想很容易理解,因為在C++中它是實實在在占據內存的一個東東,但是“引用”一詞通常容易讓初學者混淆,個人認為引用更多是語義上的東西,在C++中把引用就看成是變量本身,調用方法的時候無論傳遞的是值還是指針,其實傳遞的都是拷貝,而傳遞引用的時候即所謂的引用傳遞傳遞的就是實參本身。
#include "stdafx.h" #include <iostream> using namespace std; void Func1(int x) { cout<<"實參x的地址:"<<&x<<endl; x+=10; } void Func2(int *x) { x=new int(30); cout<<"實參的地址:"<<&x<<endl; cout<<"*x="<<*x<<endl; delete(x); //(*x)+=10; } void Func3(int &x) { cout<<"實參的地址:"<<&x<<endl; x=50; } int _tmain(int argc, _TCHAR* argv[]) { int x=10; /*Func1 Test*/ cout<<"Func1 Test"<<endl; cout<<"x="<<x<<",x的地址:"<<&x<<endl; Func1(x); cout<<"x="<<x<<",x的地址:"<<&x<<endl; /*Func2 Test*/ cout<<"Func2 Test"<<endl; cout<<"x="<<x<<",x的地址的地址:"<<&x<<endl; Func2(&x); cout<<"x="<<x<<",x的地址的地址:"<<&x<<endl; /*Func3 Test*/ cout<<"Func3 Test"<<endl; cout<<"x="<<x<<",x的地址的地址:"<<&x<<endl; Func3(x); cout<<"x="<<x<<",x的地址的地址:"<<&x<<endl; cin.get(); return 0; }
而在C#中引用語義上更像是C++中的指針,傳遞引用實際上也是值傳遞,傳遞的是拷貝,而C#中實現引用傳遞需要關鍵字ref和out。
class Program { static void Main(string[] args) { int x = 10; Console.WriteLine("Func1 Test"); Console.WriteLine("x="+x); Func1(x); Console.WriteLine("x=" + x); Console.WriteLine("Func2 Test"); Console.WriteLine("x=" + x); Func2(ref x); Console.WriteLine("x=" + x); Console.WriteLine("Func3 Test"); A a = new A(); a.X = 10; Console.WriteLine("a.X="+a.X); Func3(a); Console.WriteLine("a.X=" + a.X); Console.WriteLine("Func4 Test"); A b = new A(); b.X = 10; Console.WriteLine("a.X=" + b.X); Func4(ref b); Console.WriteLine("a.X=" + b.X); Console.Read(); } static void Func1(int x) { x += 10; Console.WriteLine("x="+x); } static void Func2(ref int x) { x += 10; Console.WriteLine("x=" + x); } static void Func3(A a) { //a仍然只是實參a的一個拷貝 a = new A(); a.X = 20; Console.WriteLine("a.X="+a.X); } static void Func4(ref A a) { //a就是實參b本身 a = new A(); a.X = 20; Console.WriteLine("a.X=" + a.X); } } class A { public int X; }
那么到底是指傳遞還是引用傳遞呢?值傳遞的好處是傳遞時對傳人對象的修改實際上是對對象副本的修改,不會影響到原對象的狀態(因為傳遞的是指針或者C#中的引用而影響到原來所指的對象是另外一回事)。按引用傳遞不需要發生拷貝行為,因此速度更快,特別是大對象的時候,這種優勢很明顯,如果又不想原對象被修改在C++中采用const引用傳遞無疑是最好的方法。