C# 在访问之前,Out参数可能未初始化
下面的代码是什么C# 在访问之前,Out参数可能未初始化,c#,initialization,out,C#,Initialization,Out,下面的代码是什么 private static List<WorkflowVariableDataSet> MergeDatasetsListBranch(out List<WorkflowVariableDataSet> datasetsList) { if(datasetsList == null) datasetsList=new List<WorkflowVariableDataSet>(); datasetsList=
private static List<WorkflowVariableDataSet> MergeDatasetsListBranch(out List<WorkflowVariableDataSet> datasetsList)
{
if(datasetsList == null)
datasetsList=new List<WorkflowVariableDataSet>();
datasetsList=new List<WorkflowVariableDataSet>();
return datasetsList;
}
我知道在这一点上它应该是未初始化的,但是单词可能表明错误在于可能的未初始化对象访问(当它甚至没有被访问时,它是被检查的引用)。Ofc这不会发生在ref
关键字上,但我很好奇引用检查是如何违反参数策略的
编辑
我已经编辑了问题和示例:out对象无论如何都将在方法内部初始化。问题是:为什么未初始化的对象不能为空?这与:
object o;
if(o==null)
...
使用未分配的参数“parameter”编译器无法
验证out
参数在使用前已分配值;
赋值时,其值可能未定义。请确保为其指定一个值
在访问值之前,请在被调用的方法中输出参数。如果你
需要使用传入变量的值,请使用ref
参数
相反
因此,将out
-参数视为未赋值。你是负责的人
因此,如果
,只需删除:
datasetsList = new List<WorkflowVariableDataSet>();
datasetsList=newlist();
如果您想处理传递给此方法的列表,请使用ref
intead(如上所述):因为无论您的错误代码是从不初始化参数,还是有时不初始化参数,都是相同的错误
对于同一个bug,根据它是在所有代码路径中命中还是仅在一个代码路径中命中,没有必要为它提供单独的错误消息;如果在初始化之前使用参数的地方有一个代码路径,那么它就有这个错误,如果没有一个代码路径,那么它就没有
因此,如果我们考虑:
private static List<WorkflowVariableDataSet> MergeDatasetsListBranch(out List<WorkflowVariableDataSet> datasetsList)
{
if(_someBooleanField)
datasetsList = null;
if(datasetsList == null)
datasetsList=new List<WorkflowVariableDataSet>();
return datasetsList;
}
private static List MergeDatasetsListBranch(out List datasetsList)
{
if(_someBooleanField)
datasetsList=null;
if(datasetsList==null)
datasetsList=新列表();
返回数据集列表;
}
在这里,使用未初始化的out参数可能会发生,也可能不会发生,但这足以说明它具有相同的错误
就错误而言,这两种情况之间确实没有任何显著差异
因此,即使在始终应用错误消息的情况下,错误消息也可能会使用。Out参数在传递之前不需要初始化,调用方法需要在方法返回之前分配一个值
修改了你的代码
private static List<WorkflowVariableDataSet> MergeDatasetsListBranch(out List<WorkflowVariableDataSet> datasetsList)
{
return datasetsList = new List<WorkflowVariableDataSet>();
}
private static List MergeDatasetsListBranch(out List datasetsList)
{
return datasetsList=new List();
}
我没有问如何解决这个问题。这是显而易见的。我在问为什么不能将未初始化的对象引用与null
进行比较。我不是在访问未初始化的对象,而是在检查引用。引用怎么可能没有任何值?如果它不指向任何地方,它应该为NULL。如果我愿意:objecto代码>如果(object==null)
则它未初始化,但编译器不会按预期进行抗议。@Tarec:您正在比较苹果和桔子。编译器错误是特定于参数的out
,因为out
参数与其他变量不同。它必须在方法中初始化,而不是在外部。该错误只是帮助您记住在访问/读取之前对其进行初始化。@Tarec:no,如果调用方通过列表,此时可以初始化out
-参数。因此,您甚至可以在调试器中看到它的值,但无法访问它。但是编译器不需要关心,因为规则是严格的:在没有在这个方法中分配任何内容之前,不要碰它。请注意,编译器总是尝试采用最短的方法,因为它最重要的要求之一是高效。考虑一下,如果检查某人是否通过了<代码> null <代码>,或者从编译时的任何地方初始化对象,那么要花费多少钱(在CPU周期上)。这是不可能检查的,而且它是多余的。我已经编辑了示例:它将始终在方法中初始化,错误保持不变。不,不会,在初始化之前,您仍在测试如果(datasetsList==null)
。这既是一个错误,也是多余的(它不能为null,因为它没有被设置为任何值——包括null——那么为什么要测试呢?)
private static List<WorkflowVariableDataSet> MergeDatasetsListBranch(out List<WorkflowVariableDataSet> datasetsList)
{
return datasetsList = new List<WorkflowVariableDataSet>();
}