在C#中,如何知道赋值运算符(=)何时将复制值或内存地址(引用)?
例如,在这段代码运行之后,list2包含什么,我如何才能对此有信心在C#中,如何知道赋值运算符(=)何时将复制值或内存地址(引用)?,c#,C#,例如,在这段代码运行之后,list2包含什么,我如何才能对此有信心 List<SomeClass> list1 = new List<SomeClass>(); List<SomeClass> list2 = new List<SomeClass>(); SomeClass sc = new SomeClass(); // assume assignment operator (=)
List<SomeClass> list1 = new List<SomeClass>();
List<SomeClass> list2 = new List<SomeClass>();
SomeClass sc = new SomeClass(); // assume assignment operator (=)
// is defined for this class
list1.Add(sc);
list2.Add(new SomeClass());
list2[0] = list1[0];
list1.RemoveAt(0);
List list1=新列表();
List list2=新列表();
SomeClass sc=新的SomeClass();//假设赋值运算符(=)
//是为此类定义的
列表1.添加(sc);
列表2.Add(newsomeclass());
list2[0]=list1[0];
列表1.RemoveAt(0);
操作符通过值复制struct
类型,通过引用复制class
类型
< P> C不允许重写<代码> = /COD>操作符,如C++中所做的。< /P>
假设你来自C++的视角,考虑C++中的值/引用语义是由类型的用户决定的,而C中则是类型的设计者决定。
因此,假设
SomeClass
是一个名为class
的类,当示例代码完成时,list2
将包含sc
,为list2
创建的匿名实例将无法访问,并将被垃圾收集
list1.RemoveAt[0]
的语法也不正确。您必须使用()
而不是[]
操作符按值复制
类型,按引用复制类
类型
< P> C不允许重写<代码> = /COD>操作符,如C++中所做的。< /P>
假设你来自C++的视角,考虑C++中的值/引用语义是由类型的用户决定的,而C中则是类型的设计者决定。
因此,假设
SomeClass
是一个名为class
的类,当示例代码完成时,list2
将包含sc
,为list2
创建的匿名实例将无法访问,并将被垃圾收集
list1.RemoveAt[0]
的语法也不正确。必须使用()
而不是[]
应用于值类型的=
运算符将一个值复制到变量。在所有其他(引用类型)上,它将“复制”内存地址
值类型的完整列表(源):
- 布尔
- 字节
- 煤焦
- 十进制
- 双重的
- 枚举
- 浮动
- int
- 长的
- 斯拜特
- 短
- 结构
- 尤因
- 乌龙
- 乌什特
关于=
运算符(根据):
赋值运算符(=)将其右侧操作数的值存储在由其左侧操作数表示的存储位置、属性或索引器中,并返回该值作为其结果。操作数的类型必须相同(或者右侧操作数必须隐式转换为左侧操作数的类型)
应用于值类型的=
运算符将一个值复制到变量。在所有其他(引用类型)上,它将“复制”内存地址
值类型的完整列表(源):
- 布尔
- 字节
- 煤焦
- 十进制
- 双重的
- 枚举
- 浮动
- int
- 长的
- 斯拜特
- 短
- 结构
- 尤因
- 乌龙
- 乌什特
关于=
运算符(根据):
赋值运算符(=)将其右侧操作数的值存储在由其左侧操作数表示的存储位置、属性或索引器中,并返回该值作为其结果。操作数的类型必须相同(或者右侧操作数必须隐式转换为左侧操作数的类型)
如果我在那里得到这个类和结构,两个类将是依赖的,这意味着如果你有
List<SomeClass> list1 = new List<SomeClass>();
List<SomeClass> list2 = new List<SomeClass>();
List list1=新列表();
List list2=新列表();
如果你修改了列表1,列表2会变成,列表2指向同一个类
但是如果你使用struck,它将不会改变,因为它们不依赖并且不指向同一个位置。如果我在那里得到这个类和结构,那么两个类将是依赖的,这意味着如果你有
List<SomeClass> list1 = new List<SomeClass>();
List<SomeClass> list2 = new List<SomeClass>();
List list1=新列表();
List list2=新列表();
如果你修改了列表1,列表2会变成,列表2指向同一个类
但是如果您使用Stroked,它不会改变,因为它们不依赖并且不指向同一个位置。是否有任何类型的=
没有定义?您运行过此代码吗?如果有,列表2包含了什么?你希望它包含什么?结果是否与您预期的不同?@CharlesBretana问题更为严重:赋值运算符不能重载。因此,它是为所有类型定义的-根据语言规范。@dcastro,啊,是的,你是对的,我忘了。。。虽然现在你提醒了我这一点,但我认为这个问题一点也不深刻,实际上是没有意义的。我将删除我的评论。是否有任何类型的=
未定义?是否运行此代码?如果有,列表2包含了什么?你希望它包含什么?结果是否与您预期的不同?@CharlesBretana问题更为严重:赋值运算符不能重载。因此,它是为所有类型定义的-根据语言规范。@dcastro,啊,是的,你是对的,我忘了。。。虽然现在你提醒了我这一点,但我认为这个问题一点也不深刻,实际上是没有意义的。我将删除我的注释。关于struct
s呢?它在值类型列表中。如上所述。由于ISER可能创建自己的自定义struct
s,因此无法创建完整的值类型列表。@DrewNoakes:它将始终保持为struct
。它永远不会成为类
@DrewNoakes