使用实体框架,并将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
或类似的内容,则可以这样做Zip
或ForEach
,但是简单的Where
或Select
不应更改任何内容。
使用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);
}