C#參數傳遞(還是給懶得看書的人看的)

來源:互聯網
上載者:User

再發幾篇可以搞個懶人系列了

這個例子講的是C#參數傳遞的基本概念,比較適合初學者。

參數傳遞方式往往是在你接觸一門語言時,需要你留意的地方,c++,java,c#都有所不同。

而這玩意又是頻頻被用到的。如果你不清楚的話,可能你編程的時候就會留下一些bug,

可能你寫到有關參數傳遞的時候會有些不放心,而每次又沒什麼大問題,所以就懶得去研究它。

那麼這篇小隨筆可以幫幫你 :)    最近考試沒那麼多時間寫“大”作,就記些小隨筆聊以充數,不過這篇就不放team裡了,說來這個小程式重複代碼好多啊;P  言歸正傳

首先記住一點,c#參數傳遞傳的是值,不是引用,不過這個值有點特殊,是所傳對象的地址值。

那麼如果你將一個對象作為參數傳遞到一個方法中,你就要注意了,你對它的修改是會影響到原來的對象的。下面的例子就能說明問題。大家看第一段測試代碼,你會發現para1的str被修改了。如果你知道ref,out關鍵字可能這時就會問,那還要它們幹嗎?呵呵,接著看。

我們再看第二段代碼,如果你運行了一下,你就會發現str沒有被修改,怎麼回事?

呵呵,這就是string對象搞得鬼。我想大家在編程中可能經常傳個自己的對象,有時又傳個string對象。

而它們的表現卻各不相同,弄的很鬱悶 ;p 這就大家經常談到的string is a immune object ,即string對象不可被修改(那個C++CLI先不考慮),在執行p.str="original be modified !!"這步操作的時候,你做的是什麼呢?

首先你建立了一個string對象,它的值是"original be modified !!",然後你這個新對象的地址值賦給了para.str的地址值,注意哦,之所以說c#傳值,就是指這裡的para.str只是地址的值而已,所以前面那個賦值只是將0x02改成什麼0xaa之類的,下次para.str取值的時候還是到原來的0x02這個地方來取。


(希望這裡大家能看懂啊~~~)

那麼我們要修改string的值怎麼辦?這時候ref就派上用場了,這個時候傳的就是地址引用而不是地址值了。在這裡有點類似於c++二級指標的概念。

說完了,大家有興趣的話看看在java中如何?交換兩個字串。你會有收穫的。

另外由於c#傳的是對象的地址值,而又不提供對傳值const修飾符,那麼除了對傳遞的對象做一個深拷貝,怎麼才能避免所傳值被修改,有什麼好的意見嗎?

using System;

namespace Test

{


 public class Parameter

 {

  public string str="original";


 }


 public class TestParameterPass

 {

  

  public  void ModifyParameter (Parameter p)

  {

   p.str="original be modified !!";

  }


  public  void ModifyString(string str)

  {

   str="original be modified !!";

  }


  public  void ModifyStringRef(ref string str)

  {

   str="original be modified !!";

  }

   

 }


 public class TestMain

 {

  public  static void  Main(string []args)

  {

   


   TestParameterPass tpp=new TestParameterPass();


                                                  //第一段測試代碼

   Parameter para1=new Parameter();

   Console.Out.WriteLine("string in parameter = {0}", para1.str);

   tpp.ModifyParameter(para1);   //修改成功

   Console.Out.WriteLine("string in parameter = {0}", para1.str);

                                                      

    //第二段測試代碼

   Parameter para2=new Parameter();

   Console.Out.WriteLine("string in parameter = {0}", para2.str);

   tpp.ModifyString(para2.str);    //修改失敗

   Console.Out.WriteLine("string in parameter = {0}", para2.str);


    //第三段測試代碼

   Parameter para3=new Parameter();

   Console.Out.WriteLine("string in parameter = {0}", para3.str);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.