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