c#

位置:IT落伍者 >> c# >> 浏览文章

当C#结构成员是引用,会发生什么


发布日期:2023年09月04日
 
当C#结构成员是引用,会发生什么

大家知道结构(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;

}

}               

上一篇:在 C# 中处理结构内的数组源代码分析

下一篇:Delphi8里在VCL.NET使用ADO.NET