我使用.Net Reflector进行了SqlConnection
检查。
我注意到有一个私有构造函数,有趣的是它将SqlConnection
类作为参数。
我怀疑的主要问题
*为什么SqlConnection
需要SqlConnection
课程?
*私人建设者的用途是什么?
private SqlConnection(SqlConnection connection)
{
this._reconnectLock = new object();
this._originalConnectionId = Guid.Empty;
this.ObjectID = Interlocked.Increment(ref _objectTypeCount);
GC.SuppressFinalize(this);
this.CopyFrom(connection);
this._connectionString = connection._connectionString;
if (connection._credential != null)
{
SecureString password = connection._credential.Password.Copy();
password.MakeReadOnly();
this._credential = new SqlCredential(connection._credential.UserId, password);
}
}
public SqlConnection()
{
this._reconnectLock = new object();
this._originalConnectionId = Guid.Empty;
this.ObjectID = Interlocked.Increment(ref _objectTypeCount);
GC.SuppressFinalize(this);
this._innerConnection = DbConnectionClosedNeverOpened.SingletonInstance;
}
更新 在Hvd's answer的指南下,我找到了一种用法:
object ICloneable.Clone()
{
SqlConnection sqlConnection = new SqlConnection(this);
Bid.Trace("<sc.SqlConnection.Clone|API> %d#, clone=%d#\n", this.ObjectID, sqlConnection.ObjectID);
return (object) sqlConnection;
}
答案 0 :(得分:3)
您不需要使用Reflector,源代码为freely available online。
更重要的是,免费提供的源代码在线版本会立即显示该构造函数的含义:它在SqlConnection
的{{1}}实现中使用。新连接的属性应该与旧连接的属性匹配,最简单的方法是复制属性。类设计者决定不要尝试通过创建新的ICloneable.Clone
来克隆SqlConnection
,但显然,需要创建某些新的连接对象,而另一个公共构造函数不如SqlConnection
的实现匹配。因此,创建了一个新的构造函数,并且它的访问受到限制,以便其他人不会(错误地)使用它。