熱點推薦:
您现在的位置: 電腦知識網 >> 操作系統 >> Windows優化 >> 正文

當C#結構成員是引用,會發生什麼

2022-06-13   來源: Windows優化 

  大家知道結構(struct)是值類型類(class)是引用類型現在我們考慮一個問題如果結構裡面有引用類型的成員那會產生什麼樣的情況?
  
  現在我們有一個結構OneLine先介紹一下它的特性它對外基本可以看作是一行字符串但同時它又是由幾部分構成的我舉個例:ABCD在某些應用中我可能需要知道這個字符串是由哪幾個元素構成的是A/B/C/D還是ABC/D而且考慮到這一行是可以添加的所以我用了一個ArrayList來放入這些元素以後調用的時候就知道了是ABC/D而不是A/B/C/D從而作出相應的處理;
  
  現在我們來看我的測試代碼(附調試器圖片):
  OneLine Line_=new OneLine(test);
  OneLine Line_=Line_;
  OneLine Line_=Line_Copy();
  Line_Add(new_line);
  return;
  如果結構中的引用類型在結構被賦值給另一個結構的時候是復制一份副本那麼Line_和Line_應該是一樣的
  
  我在寫一個程序時就這麼想當然了結果出現了令人很抓狂的異常見圖比如你在下面的代碼裡使用Line_的時候你如果認為它裡面只有test這一個元素錯誤就在所難免了
  
  找出了這個問題我就寫了一個Copy方法來返回這個結構的復制問題就再也沒有出現可以從圖上看到Line_按照我們的預期在運行
  
  最後簡單表述一下今天這段異常讓我學習到的
  
  結構的賦值應該是等同於類的淺表復制(成員是值就復制值成員是引用就復制引用)而不是完全復制
  App //  附OneLine結構代碼見後
  
  public struct OneLine
  {
    int Length;
    string Line;
    ArrayList AL;
    public OneLine(string Line)//初始化
    {
      thisLine=Line;
      thisLength=LineLength;
      thisAL=new ArrayList();
      thisALAdd(Line);
    }
    public bool Add(string newLine)//增加一行
    {
      foreach(object obj in AL)
      if(((string)obj)==newLine)return false;
      thisALAdd(newLine);
      thisLine=thisLine+newLine;
      thisLength=thisLineLength;
      return true;
    }
    override public string ToString()
    {
      return Line;
    }
    public OneLine Copy()//返回一個復制的副本
    {
      OneLine OL=new OneLine(thisAL[]ToString());
      for(int i=;i< ALCount;i++)
        OLAdd(AL[i]ToString());
      return OL;
    }
  }
From:http://tw.wingwit.com/Article/os/youhua/201311/10837.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.