c# - using 语句中的对象不是不可变的?

标签 c# using-statement

在我工作的一些遗留项目中,我看到很多引用 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/

相关文章:

c# - IF 语句检查控件是否有标记值

C#:使用语句中的 IEnumerator<T>

c# - 将一个 Using block 包裹在另一个 Using block 中 - 是不是太过分了?

c# - 事件触发前的对象处理和垃圾收集

c# - 为什么 mvccontrib 的 AssertViewRendered().ForView ("Edit") 由于 View 名称是完整的 cshtml 路径而失败?

c# - ASP.net 有效渲染元标记

c# - 如何在 C# 中找到泛型类的属性?

c# - Windows 服务无法创建文本文件

.net - 为什么我的 FileStream 对象在我 "using"是 BinaryReader 对象时被处理?

c# - 使用不工作的 Visual Studio 2019 自动导入