我正在查看我不久前编写的一些代码,并意识到我对 C# 中的赋值运算符做了一个假设。这是有问题的代码行(它按预期工作):
pointsChecked = pointsChecked ?? new List<Point>();
pointsChecked
是一个列表,指定为递归函数的参数。它是具有默认值的默认参数null
。我想要做的是将它初始化一次,然后构建一个我已经检查过的点的集合,所以它应该只在第一次迭代期间被初始化。
我的假设是 C# 可以防止自赋值,就像 C++在重载时operator=
应该提供保护一样(即if(this == &rightHandSide) return *this;
)。但是,我无法找到任何明确声明这适用于 C# 的资源。
我发现的最接近的例子是这个关于 null-coalescing operator 的问题,如果不是,则似乎对象被分配回自身null
。没有人对那个例子中的自我分配说任何话,但我想确定这不是一个坏习惯,并且没有负面影响。
在 MSDN 上搜索我还发现(根据我的理解解释)右侧的值被复制到左侧的值并返回。因此,我再次不确定进行自我分配是否是一件坏事。
我知道我可以执行以下操作以更安全:
if(pointsChecked == null)
{
pointsChecked = new List<Point>();
}
但我宁愿了解自我分配实际发生的情况。