在我工作的一些遗留项目中,我看到很多引用 dbContext 的 using 语句:
using (myContext dal = new myContext())
{
dal.DoSomeDatabaseThing
}
我相信这是相当标准的,没有发现任何问题。然而,在很多地方,我看到这样的事情:
using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(...)
{
sqlBulkCopy.DestinationTableName = myTable;
sqlBulkCopy.BatchSize = 10000;
}
这么多年了,我已经明白 using 语句中引用的对象是不可变的。事实上,MSDN 文档指出,“在 using block 中,对象是只读的,不能修改或重新分配。”尽管如此,像上面这样的代码块似乎工作得很好。
我在这里缺少什么?显然,为对象的属性赋值就是修改对象,不是吗?我和团队负责人谈过,但他似乎并不关心——如果它没有坏,就不要修理它——之类的事情。但是,这让我很恼火!
有什么想法吗? 谢谢
最佳答案
规范对 using 语句中获取的资源的只读性有这样的规定:
Local variables declared in a resource-acquisition are read-only, and must include an initializer. A compile-time error occurs if the embedded statement attempts to modify these local variables (via assignment or the ++ and -- operators), take the address of them, or pass them as ref or out parameters.
值得注意的是,正如评论中所指出的,这涉及局部变量本身,而不是它引用的对象,using
语句可能无法使其不可变。本身不走极端。
假设您的 IDisposable
有一个方法,在调用时会增加一个私有(private)字段以在处置之前跟踪使用情况。该对象显然是可变的,但突变作为副作用被隐藏了。 using
是否应该尝试阻止这种情况?我强烈怀疑。在 C# 中实现不变性并不是特别容易,类型的设计必须考虑到不变性。即使将字段标记为只读,也只会影响字段变量引用类型,仍然可以通过方法调用和设置字段或属性来修改。
关于c# - using 语句中的对象不是不可变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55639783/