標籤:
以值傳遞參數
當實參當作值來傳遞時,就產生了一個新的拷貝。
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.引用方式參數傳遞。
C#中值傳遞與引用傳遞的區別