gpt4 book ai didi

c# - 为什么 IEnumerable.Where 方法允许可以更改数据的谓词?

转载 作者:行者123 更新时间:2023-11-30 13:15:14 25 4
gpt4 key购买 nike

我正在寻找关于为什么允许编译以下代码行的解释:

var results = someCollection.Where(x => x.SomeBooleanProperty = true);

请注意单个相等运算符的使用(可能开发人员处于 SQL 模式),这是一个很容易犯的错误。这会编译并在评估结果时(例如 someCollection.ToList())它会将整个集合的标志更改为 true!!

如果您正在使用 Entity Framework 或任何其他 ORM,那么这可能会被检测为更改。我刚刚在生产代码中遇到过这个问题,但幸运的是,它只是在只读屏幕上引起了一个小问题(但完全是骗人的)。试想一下,如果数据真的被持久化,这可能会导致可怕的逻辑和数据问题。

只是为了确保我没有发疯并且它确实更改了我编写的测试失败的数据:

[Test]
public void Test_because_im_scared()
{
var falseProperty = new TestModel {BooleanProperty = false};
var trueProperty = new TestModel {BooleanProperty = true};

var list = new List<TestModel>{falseProperty, trueProperty};

var results = list.Where(x => x.BooleanProperty = true);

Assert.IsFalse(falseProperty.BooleanProperty);
Assert.IsTrue(trueProperty.BooleanProperty);

//all fine so far, now evaluate the results
var evaluatedResults = results.ToList();

Assert.IsFalse(falseProperty.BooleanProperty); //test fails here!
Assert.IsTrue(trueProperty.BooleanProperty);
}

最佳答案

= 运算符实际上做了两件事:

  • 将左侧的字段/属性设置为右侧的值。
  • 返回新分配的值。

这也是为什么这样的语句有效的原因:

object item;
while ((item = getItem()) != null)
processItem(item);

关于c# - 为什么 IEnumerable.Where 方法允许可以更改数据的谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10654300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com