引用型別和值型別傳入函式的區別
阿新 • • 發佈:2019-02-15
引用型別和值型別
背景:當一個變數以引數形式傳入函式的時候,在函式進行操作後。該值改變了嗎?
基礎:引用型別和值型別;作用域;靜態函式;
答案及原理:
當引數為值型別的時候,傳入函式的是值而不是地址。該函式會自己建立一份記憶體來儲存這份值。所以無論函式內如何操作,函式外的值是永遠不會變的。
當引數為引用型別的時候,傳入函式的是地址。該函式內所有操作都是對地址所指向的記憶體單元進行才做。SO,函式內的操作會影響函式外的一切。
程式碼演示:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace RefValTest { //班級 public class Class { //班級名稱 public string className { get; set; } //班級編號 public string classCode { get; set; } public Class(string className ,string classCode){ this.classCode = classCode; this.className = className; } } class Program { public static Class staticClass = new Class("源動力_Static", "007_Static"); public static Class staticClass1 = new Class("源動力_Static", "007_Static"); /// <summary> /// 測試引用型別和值型別 /// </summary> /// <param name="args"></param> static void Main(string[] args) { //值型別 int i = 0; //引用型別 Class yuanDongLi = new Class("源動力_Common", "007_Common"); Class yuanDongLi1 = new Class("源動力_Common", "007_Common"); //普通呼叫 ChangeVlaue(i, yuanDongLi, staticClass); Console.WriteLine("i:" + i + " yuanDongLi:" + yuanDongLi.className + " staticClass:" + staticClass.className); //ref out 引用 int j; ChangeVlaue(ref i,out j, ref yuanDongLi1, out staticClass1); Console.WriteLine("i:" + i + " yuanDongLi:" + yuanDongLi.className + " staticClass:" + staticClass.className+" j:"+j); } /// <summary> /// 普通方法 /// </summary> /// <param name="i"></param> /// <param name="yuanDongLi"></param> /// <returns></returns> public static void ChangeVlaue(int i, Class yuanDongLi, Class staticClass) { i = i + 1; yuanDongLi.classCode += "_Change"; yuanDongLi.className += "_Change"; staticClass.classCode += "_Change"; staticClass.className += "_Change"; } /// <summary> /// ref out 引靜態變數 /// </summary> /// <param name="i"></param> /// <param name="yuanDongLi"></param> /// <returns></returns> public static void ChangeVlaue(ref int i,out int j, ref Class yuanDongLi, out Class tempClass) { j = i; i = i + 1; j = j + 1; yuanDongLi.classCode += "_Change"; yuanDongLi.className += "_Change"; tempClass = staticClass1; tempClass.classCode += "_Change"; tempClass.className += "_Change"; } } }
執行結果: