手动管理数据库连接时,始终打开和关闭它。有时您需要在执行某些操作之前检查连接是否具有某种状态。 经典情况是在关闭连接之前检查未关闭状态。 像
这样的东西if (connection.State != ConnectionState.Closed)
connnection.Close();
当MSDN表示ConnectionState是枚举WITH FLAGS。这意味着连接状态可以同时具有不同的状态。可能会被打破+关闭或其他...
如果您反编译System.Data.ConnectionState枚举,您将看到
[Flags]
public enum ConnectionState
{
Closed = 0,
Open = 1,
Connecting = 2,
Executing = 4,
Fetching = 8,
Broken = 16,
}
已结算商品的价值为零。这意味着以下总是如此:
connection.State.HasFlag(ConnectionState.Closed)
因此。有什么建议为什么这个枚举有Flags属性?或者(如果此枚举必须是Flags)为什么Closed项目有0值?
答案 0 :(得分:8)
我相信他们计划使用基于标志的枚举的原始.NET 1.1实现,但是如果你看一下注释in the remarks section
注意:强>
此枚举中的值不能用作一组标志。
您无需检查标记,进行直接==
测试是安全的。他们没有删除Flags
属性,因为它会破坏他们不会做的与.NET 1.1的二进制兼容性。
答案 1 :(得分:2)
枚举上的 [Flags] 属性允许您一次为枚举分配多个值,否则这是不可能的。您可以通过按位操作来执行此操作,这意味着您可以存储具有A和C集的枚举(两者一次),而不仅仅是A而不仅仅是C.
在这种情况下,有时可能意味着ConnectionState为打开和正在执行。
已关闭的值被指定为零,因此它可能并不意味着ConnectionState既关闭又打开。
This post将就此问题提供更多说明。
答案 2 :(得分:0)
零表示未选择任何内容。 如果是打开00001,如果是连接00010,如果是打开和连接00011 ......
0 0 0 0 0
B F E C O
Open = 1,
Connecting = 2,
Executing = 4,
Fetching = 8,
Broken = 16,