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

大家知道.结构(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按照我们的预期在运行.

最后,简单表述一下今天这段异常让我学习到的..
结构的赋值,应该是等同于类的浅表复制(成员是值就复制值,成员是引用就复制引用),而不是完全复制..
Appledotnet@hotmail.com 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;
}
}

时间: 2024-10-24 20:20:58

C#,结构成员是引用,会发生什么的相关文章

详解C++编程中类的声明和对象成员的引用_C 语言

C++类的声明和对象的创建 类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量:创建对象的过程也叫类的实例化.每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数. 与结构体一样,类只是一种复杂数据类型的声明,不占用内存空间.而对象是类这种数据类型的一个变量,占用内存空间. 类的声明 类是用户自定义的类型,如果程序中要用到类,必须先进行声明,或者使用已存在的类(别人写好的类.标准库中的类等),C++语法本身并不提供现成的类的名称.结构和内容. 一个简

新人求教!对非共享成员的引用要求对象引用的问题

问题描述 main页面代码没有问题,运行时提示对非共享成员的引用要求对象引用这里不是windoes窗体设计器生成的代码吗,为什么会错误?<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>_PartialClassmainInheritsSystem.Windows.Forms.Form'Form重写Dispose,以清理组件列表.<System.Diagnostics.DebuggerNonUserCod

c++-结构成员含string类型数组,成员的输入问题

问题描述 结构成员含string类型数组,成员的输入问题 要求输入的name可含空格,不知道错哪了,新手求好心人解答,万分感谢! #include#includeusing namespace std;struct donation{ string name; double number;};int main(){ cout<<""Input the number of donater: ""; int d_number; cin>>d_nu

如果类成员被引用,类不被引用,类会被释放吗?

问题描述 直接写例子:packagecom.test;publicclasstest{publictest(){//TODOAuto-generatedconstructorstub}publicclassnothing{Stringhah;nothing(Stringhh){hah=hh;}}publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubtesttt=newtest();nothingll=tt.newnoth

C语言及程序设计进阶例程-12 结构体成员的引用

贺老师教学链接  C语言及程序设计进阶 本课讲解 结构体作函数参数 #include <stdio.h> struct Student { int num; char name[20]; char sex; int age; double score; char addr[30]; }; void print(struct Student s) { printf("%d %s %c\n", s.num, s.name, s.sex); //可再加-- return; } i

遍历修改结构成员

问题描述 假设我有个结构PublicStructuremystruDimaAsSingleDimbAsSingleEndStructure又声明一个数组dimstruarray(4)asmystru然后我把一个数组dimc(1)assingle分别赋值给strucarray(i).astruarray(i).b我不想用以下方法fori=0to4getdata(c)'获取数组的值strucarray(i).a=c(0)strucarray(i).b=c(1)nexti我想用反射fori=0to4D

C++语言基础 例程 对象成员的引用

贺老师的教学链接  本课讲解 通过对象名和成员运算符访问对象中的成员 #include <iostream> using namespace std; class Time { public: void set_time( ); void show_time( ); private: int hour; int minute; int sec; }; int main( ) { Time t1; t1.set_time( ); t1.show_time( ); Time t2; t2.set_

《C++ primer plus》读书笔记(二)_C 语言

第五章 1.for循环--for(initialization; test-expression; update-expression) body // test-expression 会被转换为bool,0为false,非零为true 2.表达式--表达式是值或值与运算符的组合.赋值表达式的值为其左侧成员的值,而赋值运算符是从右到左结合的. 3.a++和++a-- (1)对于内置类型,两种执行效率相同. (2)若重载运算符,对于类而言,前缀将值加1,返回结果:后缀会复制一个副本,加1后返回副本

结构体数组的定义和引用(五)

2)指针法若p指向数组的某一个元素,则p++就指向其后续元素.3)指针的数组表示法若p=student,我们说指针p指向数组student,p[i]表示数组的第i个元素,其效果与student[i]等同.对数组成员的引用描述为:p[i].name.p[i].num等.[例7-4]指向结构体数组的指针变量的使用.structdata/*定义结构体类型*/{intday,month,year;};structstu/*定义结构体类型*/{char name[20];long num;struct d