先來講下C#中的數據類型.分值類型和引用類型兩大類.數組
值類型:直接存儲數據的值,保存在內存中ide
引用類型:存儲對值的引用,實際上存儲的就是一個內存的地址函數
C#預約義的簡單類型,像int,float,bool,char都是值類型,另外enum(枚舉),struct(結構)也是值類型spa
string,數組,自定義的class類、接口、委託和封裝就都是引用類型了.其中的string是比較特殊的引用類型code
C#函數的參數若是不加ref,out這樣的修飾符顯式申明參數是經過引用傳遞外,默認都是值傳遞.blog
值類型變量直接包含其數據,這與引用類型變量不一樣,後者包含對其數據的引用。所以,向方法傳遞值類型變量意味着向方法傳遞變量的一個副本。方法內發生的對參數的更改對該變量中存儲的原始數據無任何影響。若是但願所調用的方法更改參數的值,必須使用 ref 或 out 關鍵字經過引用傳遞該參數。爲了簡單起見,下面的示例使用 ref。接口
代碼 class PassingValByVal { static void SquareIt(int x) { x *= x; System.Console.WriteLine("The value inside the method: {0}", x); //25 } static void Main() { int n = 5; System.Console.WriteLine("The value before calling the method: {0}", n); //5 SquareIt(n); System.Console.WriteLine("The value after calling the method: {0}", n); //5 } }
下面的示例除使用 ref 關鍵字傳遞參數之外,其他與上一示例相同。參數的值在調用方法後發生更改內存
代碼 class PassingValByRef { static void SquareIt(ref int x) { x *= x; System.Console.WriteLine("The value inside the method: {0}", x);//25 } static void Main() { int n = 5; System.Console.WriteLine("The value before calling the method: {0}", n);//5 SquareIt(ref n); System.Console.WriteLine("The value after calling the method: {0}", n);//25 } }
本示例中,傳遞的不是 n 的值,而是對 n 的引用。參數 x 不是 int 類型,它是對 int 的引用(本例中爲對 n 的引用)。所以,當在方法內對 x 求平方時,實際被求平方的是 x 所引用的項:n。element
代碼 class PassingRefByVal { static void Change(int[] pArray) { pArray[0] = 888; pArray = new int[5] {-3, -1, -2, -3, -4}; System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);//-3 } static void Main() { int[] arr = {1, 4, 5}; System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr [0]);//1 Change(arr); System.Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", arr [0]);//888 } }
class PassingRefByRef { static void Change(ref int[] pArray) { pArray[0] = 888; pArray = new int[5] {-3, -1, -2, -3, -4}; System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);//-3 } static void Main() { int[] arr = {1, 4, 5}; System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr[0]);//1 Change(ref arr); System.Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", arr[0]);//-3 } }