SqlConnection类中的Private Constructor采用Parameter SqlConnection类

时间:2015-05-29 12:29:38

标签: c# oop sqlconnection

我使用.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;
}

1 个答案:

答案 0 :(得分:3)

您不需要使用Reflector,源代码为freely available online

更重要的是,免费提供的源代码在线版本会立即显示该构造函数的含义:它在SqlConnection的{​​{1}}实现中使用。新连接的属性应该与旧连接的属性匹配,最简单的方法是复制属性。类设计者决定不要尝试通过创建新的ICloneable.Clone来克隆SqlConnection,但显然,需要创建某些新的连接对象,而另一个公共构造函数不如SqlConnection的实现匹配。因此,创建了一个新的构造函数,并且它的访问受到限制,以便其他人不会(错误地)使用它。