【发布时间】:2023-03-31 15:32:01
【问题描述】:
我想知道我的代码中是否有很少的列表对象,如果我想在一行中声明所有列表是否等于在单独的行中声明:
ListA = ListB = ListC ... = new List<MyType>();
是否等于:
ListA = new List<MyType>();
ListB = new List<MyType>();
ListC = new List<MyType>();
...
我必须确定这样我不会有别名问题
【问题讨论】:
-
这些都不是声明。它们只是赋值语句。而且,不,它们不相等。第一个创建一个新的列表对象 (
new List<MyType>()) 并将对该新对象的引用分配给每个变量ListA、ListB和ListC(请记住,List<T>是一个引用类型 - 所有三个变量现在将引用同一个对象)。第二个示例创建三个新列表对象,并将对每个新列表的引用分配给每个变量。在这种情况下,三个变量都引用了不同的对象 -
当您尝试示例代码并检查结果时,是什么促使您在这里提出问题?
-
@Flydog57 - 好像你正确指出了谢谢!
-
@Rufus L - 作为调查代码重构后奇怪行为的一部分。
-
降低代码复杂度是进行重构的一个很好的理由。只是盲目地减少代码行数可能会导致错误的结果。了解值类型和引用类型之间的区别是很好的。如果您有三个 int 变量 A、B 和 C,并且您有这行代码:
A=B=C=42,那么您会将三个 int 变量中的每一个都初始化为数字 42。但是,List<T>是引用类型,您的第一个代码会初始化您的三个变量,以便它们都引用同一个对象(您的new表达式创建的对象。ListA.Add(x)将在ListC中可见
标签: c# declaration