2014-09-25 50 views
5

看看下面的代碼陳列品A:TryGetValue - 傳遞未初始化的值好嗎?

的字典
string sql; 
if (!GetQueries.TryGetValue(type.TypeHandle, out sql)) 

文件說,如果該鍵不存在,引用類型將被設置爲null。好沒關係。

如果找到密鑰,變量'sql'如何填充? 克隆的密鑰是否已找到值? 是否找到創建的項目的對象類型,然後複製對象的內容? 這是安全的嗎?

或者,設置爲出站對象駐留的地方,應該將呼叫被設置爲顯示出B:

var sql = string.Empty; 
if (!GetQueries.TryGetValue(type.TypeHandle, out sql)) 

然後,變量「SQL」被初始化,該對象的安全的地方存在。

(我的問題來自於我對我的C編程天空指針的厭惡。)

+0

['out' C#Reference](http://msdn.microsoft.com/en-us/library/t3c3bfhx.aspx)「雖然作爲out參數傳遞的變量不必在傳遞之前進行初始化,方法需要在方法返回之前分配一個值。「 – Habib 2014-09-25 13:49:01

回答

8

在我看來,最好將它設置爲一個值。畢竟,這個值是保證被方法調用替換(假設不會拋出異常),那麼爲什麼還要指定一個毫無意義的值呢?它只是誤導讀者認爲它有所作爲。

out參數是在那個特殊的變量,你用它來提供一個值,它並沒有被調用之前明確分配,但是呼叫後明確分配。調用之前的任何值都不會對該方法可見。

(注:ref參數不行爲是那樣的 - 他們必須事先明確賦值。)

查看我在C# argument passing文章在C#中的不同參數模式的更多細節。

如果找到密鑰,變量'sql'如何填充?克隆的密鑰的發現價值?是否找到創建的項目的對象類型,然後複製對象的內容?

方法中參數的值將成爲調用者代碼中變量的值,方法與正常分配相同。沒有任何對象克隆正在進行。

+1

我們還想補充一點,'ref'參數與'out'參數不同,因爲它們必須在傳遞給函數之前被初始化。 – Anthony 2014-09-25 13:49:04

+0

@Anthony:是的,會添加那個細節。 – 2014-09-25 13:49:23

+0

還值得注意的是,如果初始化變量爲一個值,然後將其傳遞給TryGetValue,那麼像Resharper這樣的體面代碼分析工具會警告您該變量被分配了一個永遠不會使用的值,並且建議您刪除無用的初始化 – 2014-09-25 13:51:17

0

如果找到密鑰,變量'sql'如何填充?

你可以認爲它像這樣:

var sql = GetQueries[type.TypeHandle]; 

或者,建立出站對象居住的地方,應該調用被設置爲附件B:

沒有其實沒關係。您不必將sql初始化爲一個值,因爲您將它作爲out參數傳遞。該函數通過聲明它爲out來確保它將設置它的參數的值。