2015-05-29 116 views
1

我檢查SqlConnection並使用.Net ReflectorSqlConnection類中的私有構造函數參數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; 
} 
+2

至於你的第二個問題,私人構造函數常用於[singleton pattern](http://csharpindepth.com/articles/general/singleton.aspx)。 – Eminem

+0

看起來像*複製構造函數*在C++ –

+0

我猜這是它如何處理混合模式身份驗證(SQL與Windows)。我再次猜測。 –

回答

3

你並不需要使用反射器,源代碼是freely available online。更重要的是,免費的在線版本的源代碼會立即向您顯示該構造函數的要點:它在SqlConnection的實現ICloneable.Clone中使用。新連接的屬性應該與舊連接的屬性匹配,最簡單的方法是通過複製屬性。班級設計師決定不要試圖通過創建新的SqlConnection來克隆SqlConnection,但很明顯,需要創建新的連接對象,並且其他公共構造函數不太適合執行Clone。因此,創建了一個新的構造函數,並且其訪問受到限制,以使其他人無法使用(錯誤)。

+0

謝謝。我發現這個私人構造函數的其他用法是「查找使用高級」,但沒有時間仔細檢查。根據新用法更新問題,並可能將您的答案標記爲已接受。 – guneysus

+0

@guneysus我很驚訝。如果構造函數是「私人」的,並且不會被該類另外公開,那就不可能。無可否認它是一個「部分類」,但據我所知,這只是因爲使用了[這個文件](http://referencesource.microsoft.com/#System.Data/System/Data/ProviderBase/DbConnectionHelper.cs)作爲插入所有DbConnection派生類的通用代碼的模板,並且它也不調用任何構造函數。我會等待看到你找到的。 – hvd

+0

不幸的是,我檢查了'包括超載'。 :)總之,我發現只有一個用法對象ICloneable.Clone()' – guneysus

相關問題