将传递"这个"在".'子句的谓词在哪里导致它变异?



使用实体框架,并将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();
  }
}

这就像我想出的那样简单。我不确定将this用作Where的谓词一部分时是否会以某种方式更改或修改。基本上,我只是想仔细检查,因为我不确定。我检查了乔恩·斯基特(Jon Skeet)对Where的重新实现,但尚不完全清楚this会保留其价值。

我的不确定性源于与递延执行一起使用时谓词作为Func传递的问题。结果,似乎可以在以后的时间使用this的参考,而不是在调用Where时立即使用。

我是在思考这种情况,还是有可能更改this

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

因此,您可以肯定的是,对于该代码,每当执行它时 will 使用对象的当前实例,并且最终不会引用某些完全不同的Demo目的。然后,它将转到该实例,并在时间中拿起其PrivateId变量的值。因此,如果PrivateId在该特定实例上发生了变化,则更改的值就是所使用的。

这与Where的实现完全无关,而是参考类型的语义和整个延期执行的概念。

如果您现在想使用PrivateId 的值,而不是在序列实际迭代时,则只需将该变量的值复制到某个新变量中,然后超过,喜欢:

var idCopy = this.PrivateId;
var issue = this.context.SomeTable.Where(st => st.ForeignKeyId == idCopy );

no, this不会突变。您没有为此分配任何内容,并且仅被用作普通变量。

这是另一个可能使其更清楚的示例:

var id = "12345";
var issue = this.context.SomeTable.Where(st => st.ForeignKeyId == id);

执行Where语句后id的值是多少?与以前相同," 12345"。

this本身永远无法改变,但是其中的字段可以。如果您有this.IEnumerable或类似的内容,则可以这样做ZipForEach,但是简单的WhereSelect不应更改任何内容。

使用this以这种方式没有问题。此外,即使您不指定"此",也仍将使用引用,因为PrivateId在类上定义。

public void Question()
{
  //Is there going to be a problem using `this` in the predicate
  var issue = context.SomeTable.Where(st => st.ForeignKeyId == PrivateId);
}

最新更新