<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          再聊一次值類型和引用類型

          共 2805字,需瀏覽 6分鐘

           ·

          2021-08-31 11:12

          C#值類型,作為函數(shù)形參,形參被修改,不影響原值

          這是我們?cè)诔跏紝W(xué)習(xí)編程時(shí)需要記住的內(nèi)容,我們也是一直這樣踐行的。

          先說結(jié)論:這是不準(zhǔn)確的(我都不敢說不正確??)。


          為什么提出這樣看似很淺顯的問題,是因?yàn)橛写挝以谑褂?code style="white-space:pre-wrap;-webkit-tap-highlight-color: transparent;color: rgb(221, 17, 68);line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 13.5px;background: rgba(27, 31, 35, 0.05);padding: 3px 5px;border-radius: 4px;">ArraySegment<byte>值類型時(shí),有感而發(fā)。

          這是一個(gè)托管的值類型,表示array的一個(gè)片斷, 在用做websocket接收數(shù)據(jù)的載體時(shí)我發(fā)現(xiàn)每次值傳遞后, 這個(gè)ArraySegment<byte>貌似發(fā)生了變化。這勾起了我的探究欲。

          我們做一個(gè)簡(jiǎn)單的實(shí)驗(yàn), 來證明【值類型作為函數(shù)形參, 形參被修改,不影響原值】不準(zhǔn)確。

          struct Slice 
              {
                    public Array Array { get; set; }
                    public int Offset { get; set; }
                    public int Count { get; set; }
              }

              class Program
              {
                  static void Main(string[] args)
                  {
                      var slice = new Slice { Array = Array.CreateInstance(typeof(int), 5)};
            Test(slice);

                      foreach(var i  in slice.Array)
                      {
                          Console.WriteLine(i); 
                      }
                      Console.ReadLine();
                  }
          // 值類型傳參,值傳給tmp變量
                  static void Test(Slice tmp)
                  {
                      tmp.Array.SetValue(1,1);
                      tmp.Offset = 1;
                      tmp.Count = 1;
                  }
              }
              
           // 輸出  0 1 0 0 0
          slice變量的引用類型屬性體現(xiàn)了變化,值類型Offset Count屬性不會(huì)變化。

          這個(gè)簡(jiǎn)單的Demo告訴我們:

          大部分情況下:“值類型作為函數(shù)形參,形參被修改,不影響原值”, 但是如果修改的是值類型的引用類型字段,原值類型照樣能體現(xiàn)修改

          歸根到底由值類型和引用類型的特性決定:

          值類型的變量直接存儲(chǔ)數(shù)據(jù),而引用類型的變量持有的是數(shù)據(jù)的引用,數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)堆中;

          寬泛地講:函數(shù)傳參,都是值傳遞(拷貝), 只是引用類型傳遞的是原對(duì)象的引用或地址值。

          本篇文章沒啥干貨,算是日常小記吧,各大佬輕噴。

          基礎(chǔ)不牢 地動(dòng)山搖


            面試官:實(shí)現(xiàn)一個(gè)帶值變更通知能力的Dictionary

           你管這叫"線程安全"?

           ASP.NET Core端點(diǎn)路由中三種讓人困惑的路由函數(shù)

           你怕是對(duì)MD5算法有誤解

           String是一個(gè)奇怪的引用類型

           難纏的布隆過濾器,這次終于通透了

          瀏覽 37
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  北条麻妃在线播放一区二区 | 国内精品视频在线观看免费 | 国产精品人妻人伦a 6 2v久软件 特级西西444www无码视频免费看 | 天天干天天弄 | 亚洲视频大全 |