国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

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

2024-07-21 02:19:35
字體:
來源:轉載
供稿:網友
  • 本文來源于網頁設計愛好者web開發社區http://www.html.org.cn收集整理,歡迎訪問。
  • 大家知道.結構(struct)是值類型,類(class)是引用類型,現在我們考慮一個問題,如果結構里面有引用類型的成員,那會產生什么樣的情況?
    現在我們有一個結構oneline,先介紹一下它的特性,它對外基本可以看作是一行字符串,但同時它又是由幾部分構成的,我舉個例:"abcd",在某些應用中,我可能需要知道這個字符串是由哪幾個元素構成的,是a/b/c/d還是abc/d,而且考慮到這一行是可以添加的,所以我用了一個arraylist來放入這些元素,以后調用的時候,就知道了,噢,是abc/d,而不是a/b/c/d,從而作出相應的處理;
    現在,我們來看我的測試代碼(附調試器圖片):
    oneline line_1=new oneline("test");
    oneline line_2=line_1;
    oneline line_3=line_1.copy();
    line_1.add("new_line");
    return;
    如果結構中的引用類型在結構被賦值給另一個結構的時候是復制一份副本,那么line_2和line_3應該是一樣的.
    我在寫一個程序時就這么想當然了..結果出現了令人很抓狂的異常,見圖,比如你在下面的代碼里使用line_2的時候,你如果認為它里面只有"test"這一個元素,錯誤就在所難免了.
    找出了這個問題,我就寫了一個copy方法,來返回這個結構的復制,問題就再也沒有出現,可以從圖上看到,line_3按照我們的預期在運行.

    最后,簡單表述一下今天這段異常讓我學習到的..
    結構的賦值,應該是等同于類的淺表復制(成員是值就復制值,成員是引用就復制引用),而不是完全復制..
    [email protected] 2004/07/08 附oneline結構代碼見后



    public struct oneline
    {
    int length;
    string line;
    arraylist al;
    public oneline(string line)//初始化
    {
    this.line=line;
    this.length=line.length;
    this.al=new arraylist();
    this.al.add(line);
    }
    public bool add(string newline)//增加一行
    {
    foreach(object obj in al)
    if(((string)obj)==newline)return false;
    this.al.add(newline);
    this.line=this.line+newline;
    this.length=this.line.length;
    return true;
    }
    override public string tostring()
    {
    return line;
    }
    public oneline copy()//返回一個復制的副本
    {
    oneline ol=new oneline(this.al[0].tostring());
    for(int i=1;i< al.count;i++)
    ol.add(al[i].tostring());
    return ol;
    }
    }

    發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 柳林县| 汾阳市| 清水县| 三都| 抚顺市| 津市市| 吉水县| 麻城市| 临西县| 迭部县| 基隆市| 马关县| 磐石市| 金川县| 阿拉尔市| 柘城县| 楚雄市| 砚山县| 中山市| 翁源县| 永丰县| 安平县| 罗甸县| 南昌县| 观塘区| 东阿县| 平罗县| 山东省| 德钦县| 天气| 定南县| 玉林市| 旬邑县| 夏津县| 德安县| 临沂市| 嘉黎县| 白河县| 浦北县| 内乡县| 贺州市|