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