在`.Where`子句的谓词中传递`this`会导致它变异吗?

Tra*_*s J 4 .net c# linq linq-to-entities entity-framework

使用Entity Framework,并将DbContext包装在如下的类中:

public class Demo : IDisposable
{
  internal DbContext context;
  internal int PrivateId = 5;      

  public Demo()
  {
   this.context = new MyDbContext();
  }
  public void Question()
  {
   //Is there going to be a problem using `this` in the predicate
   var issue = this.context.SomeTable.Where(st => st.ForeignKeyId == this.PrivateId);
  }
  public Dispose()
  {
   this.context.Dispose();
  }
}
Run Code Online (Sandbox Code Playgroud)

这就像我想出的那样简单.我不确定this当用作谓词的一部分时是否会以某种方式被更改或修改Where.基本上我只是想仔细检查,因为我不确定.我查看了Jon Skeet的重新实施,Where但仍然不完全清楚它this会保留其价值.

我的不确定性源于谓词在Func延迟执行时使用的问题.结果,似乎this可以在稍后的时间使用引用,而不是在Where被调用时立即使用.

我是在过度思考这种情况,还是有可能this改变?

Ser*_*rvy 5

this是只读的(对于参考类型).您无法更改引用this所指的内容.存储在this变量中的引用所引用的对象实际上可能随时间而变化.

因此,您可以确定,对于该代码,无论何时实际执行它都将使用对象的当前实例,并且您最终不会引用一些完全不同的Demo对象.然后它将转到该实例并在该时刻获取PrivateId变量的值.因此,如果已针对该特定实例进行了更改,则更改的值将是使用的值.PrivateId

这与Where引用类型的语义和延迟执行的整个概念的实现没有任何关系.

如果你想使用的价值PrivateId ,现在,不序时,实际上是重复,那么仅仅是变量的值复制到了一些新的变量,并关闭了那个,就像这样:

var idCopy = this.PrivateId;
var issue = this.context.SomeTable.Where(st => st.ForeignKeyId == idCopy );
Run Code Online (Sandbox Code Playgroud)