<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      小心C#中的只讀結構體成員

      示例

      • 我們先來看一段結構體的代碼 (基于 VS2022 + .NET 8.0)
      public struct MyStruct(int number)
      {
          public int Number = number;
          public void SetNumber(int number) => Number = number;
      }
      public class Program
      {
          private static MyStruct myStruct = new(1);
          public static void Main()
          {
              int before = myStruct.Number;
              myStruct.SetNumber(2);
              int after = myStruct.Number;
              Console.WriteLine($"before: {before}");
              Console.WriteLine($" after: {after}");
              Console.ReadKey();
          }
      }
      

      輸出如下:
      before: 1
      ?after: 2

      修改為只讀

      • private static readonly MyStruct myStruct = new(1);

      輸出如下:
      before: 1
      ?after: 1

      • 我們看到,修改只讀結構體成員的字段失敗了,但是編譯器竟然沒有報錯
      • 如果我們直接操作 myStruct.Number = 2; 編譯器是會報錯的,但是加了一個方法間接的修改,編譯器就歇菜了

      內部原理

      我們查看反匯編代碼,可以看到,在實際操作只讀結構體成員字段的時候,會把該字段的值拷貝一份到一個新的堆棧變量上,然后再基于拷貝后的這個變量計算

          17:         myStruct.SetNumber(2);
       mov         rcx,7FF9BD68E500h
       mov         edx,9
       call        CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE (07FFA1D15B6F0h)
       mov         rcx,26AE19DB1D0h         //rcx保存結構體Number的地址
       mov         rcx,qword ptr [rcx]      //拷貝Number的值到rcx
       mov         qword ptr [rbp+70h],rcx  //rcx的值賦值到臨時變量
       lea         rcx,[rbp+70h]
       mov         edx,2
       call        ConsoleTest_NET_8.MyStruct.SetNumber(Int32) (07FF9BD6A2BC8h)
      

      導致的問題

      • 我們先來看一段自旋鎖的代碼,基于 SpinLock
      public class Program
      {
          private static readonly SpinLock spinLock = new(false);
          public static void Main()
          {
              int sum = 0;
              Parallel.For(0, ushort.MaxValue, i =>
              {
                  bool lockToken = false;
                  try
                  {
                      spinLock.Enter(ref lockToken);
                      sum++;
                  }
                  finally
                  {
                      if (lockToken)
                      {
                          spinLock.Exit();
                      }
                  }
              });
              Console.WriteLine(sum);
              Console.ReadKey();
          }
      }
      
      • 我們期望的輸出是: 65535, 但實際不是,因為隱藏的只讀機制導致了字段值的拷貝, 這就造成了隱藏的 BUG

      結論

      • 警惕把結構體成員變量設置只讀

      • 在確定結構體內的字段只讀時,可以使用 readonly 直接修飾 結構體本身或者字段,比如

        public readonly struct MyStruct(int number)
        {
            public readonly int Number = number;
        }
        
      posted @ 2023-11-28 15:56  Broadm  閱讀(617)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲欧洲日产国码AV天堂偷窥| 国产在线观看免费观看| 日本高清中文字幕免费一区二区| 人妻少妇精品视频专区| 亚洲色大成网站www永久一区| 公天天吃我奶躁我的在线观看| 亚洲中文字幕无码中文字| 国产亚洲另类无码专区| 婷婷久久香蕉五月综合加勒比| 免费视频国产在线观看| 四虎国产精品成人免费久久| 蜜臀久久精品亚洲一区| 平湖市| 亚洲综合无码一区二区三区不卡 | 亚洲精品国产美女久久久| 国产精品鲁鲁鲁| 无码免费大香伊蕉在人线国产| 亚洲一区二区三区黄色片| 久久久久亚洲av成人网址| 亚洲精品天堂在线观看| 亚洲一区二区av免费| 久久亚洲人成网站| 欧美亚洲熟妇一区二区三区| 爱啪啪精品一区二区三区| 国产日韩综合av在线| 中文字幕精品亚洲二区| 久久综合97丁香色香蕉| 国产精品推荐视频一区二区| 国产日韩精品视频无码| 精品人妻一区二区| 55大东北熟女啪啪嗷嗷叫| 隆德县| 国产精品久久久久aaaa| 人妻少妇邻居少妇好多水在线 | 免费观看日本污污ww网站69| 国产精品国三级国产av| 亚洲真人无码永久在线| 午夜福利宅福利国产精品| 国产精品特级毛片一区二区三区| 在线观看精品视频网站| 亚洲夂夂婷婷色拍ww47|