程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c# 當引用類型作為方法的參數

c# 當引用類型作為方法的參數

編輯:C#入門知識

c# 當引用類型作為方法的參數


c#(java)中,參數傳遞都是傳遞的參數本身的值,   對於值類型,傳遞的是值本身。   對於引用類型,定義引用類型變量的時候,一個是在棧中的變量,存儲的是一個指針,指向在堆中分配的對象實例的地址,當然,如果對象沒有實例化,給null值的時候例外。   傳遞引用類型變量的時候,傳遞的也是值,   但它的值是內存地址,地址指定堆中的對象。   所以當我們在方法中改變對象內容的時候,我們外圍 的引用類型變量操作的對象也發生了變化,因為他們指向的是同一個。   但是如果我們在操作的方法中對 對象進行了新的實例化,則就會在堆中新生成一個對象,和原來的就是兩個不同的對象了,在操作的方法結束,這個對象如果沒有特別處理,就沒有變量指向它了,它就會被銷毀。   示例:     new Thread(() =>   {   try   {   StringBuilder sb = null;   //addline(ref sb);   addline(sb);   rtb_log.InvokeIfRequired(()=> rtb_log.AppendText(sb.ToString()+"\r\n"));   }   catch (Exception ex)   {   rtb_log.InvokeIfRequired(() => rtb_log.AppendText(ex.Message + "\r\n"));   }   finally { if (conn != null && conn.State == ConnectionState.Open) conn.Close(); }   }).Start();          void addline( StringBuilder sb)   {   if (sb == null) sb = new StringBuilder();   sb.Append("hello world!");   }             調用時會發生 對象空引用的異常。   原因是因為在方法中進行了對象的初始化,但是外圍的sb和方法中的sb是兩個不同的變量,在方法中分配了對象實例後,外圍 的sb指定的還是null.   如果想解除這個異常,有幾個方法,第一個是對對象進行有效初始化,不要置為null值,如果這裡可以直接new StringBuilder()。不要在方法內部再實例化。第二個是如果對象在外圍無法初始化,像接口對象,需要延遲到方法中進行初始化的,可以使用返回值的方式或者是ref參數的方法。   例如:   void addline(ref StringBuilder sbx)   {   if (sbx == null) sbx = new StringBuilder();   sbx.Append("hello world!");   }   或者   StringBuilder addline2(StringBuilder sbx)   {   if (sbx == null) sbx = new StringBuilder();   sbx.Append("hello world!");   return sbx;   }  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved