分配的值不在任何执行路径中使用 - C#

San*_*anu 1 c# oop instantiation

Resharper显示此警告:当我编写以下代码时,"在任何执行路径中都没有使用赋值":

List<obj> testObj = new List<obj>();
testObj = testMethod();
Run Code Online (Sandbox Code Playgroud)

这里testMethod()返回类型List<obj>.但是,当我直接分配testMethod()没有实例化它时,我没有得到警告.

List<obj> testObj = testMethod();
Run Code Online (Sandbox Code Playgroud)

请原谅我的无知,如果我错过了基础知识,但我没有关注编译器如何在testObj没有实例化的情况下分配内存.

其中一个帖子提到了类似的问题:C#这个初始化器真的是多余的吗?但是我没有找到任何关于我的问题的答案,关于testObj变量存储它收到的值的位置testMethod?与原始数据类型不同,"对象类型"只有在实例化后才能存储值.如果我错过了什么,请告诉我.

Vov*_*ova 6

您正在List<object>第一行创建a的实例.然后通过为testObj变量分配从方法返回的另一个值来抛弃此对象testMethod.这个new List<obj>()对象是多余的.您有效地创建了垃圾收集器在某些时候必须清理的垃圾.

这就是ReSharper向您展示警告的原因.

如果可以在定义变量的同一行中使用实际值初始化变量,则执行此操作.

编辑(假设我们正在讨论问题中提供的情况):

  1. new运算符本身不处理变量.它在堆中创建一个新对象(对于引用类型).
  2. =操作者分配一个,以在一个变量堆栈.在这种情况下,value是对堆中对象的引用.
  3. 为从方法或对象构造函数返回的变量赋值是没有区别的.对象构造函数实际上也是一种方法.
  4. 在可以为其赋值之前,不需要初始化变量.实际上,按定义初始化是将初始值赋值给变量.