Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中,如何知道赋值运算符(=)何时将复制值或内存地址(引用)?_C# - Fatal编程技术网

在C#中,如何知道赋值运算符(=)何时将复制值或内存地址(引用)?

在C#中,如何知道赋值运算符(=)何时将复制值或内存地址(引用)?,c#,C#,例如,在这段代码运行之后,list2包含什么,我如何才能对此有信心 List<SomeClass> list1 = new List<SomeClass>(); List<SomeClass> list2 = new List<SomeClass>(); SomeClass sc = new SomeClass(); // assume assignment operator (=)

例如,在这段代码运行之后,list2包含什么,我如何才能对此有信心

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