2011-09-17 52 views
-4

爲什麼我需要在我的LINQ查詢中調用ToList()方法?LINQ和剪貼板安全問題

例如:

private void btnEnc_Click(object sender, RoutedEventArgs e) 
{ 
    SHA1 sha = new SHA1Managed(); 
    string sResult = ""; 

    var v = sha.ComputeHash(
     UTF8Encoding.Unicode.GetBytes(tbxWordToEncrypt.Text) 
     ).Select(
      p => sResult += string.Format("{0:x2}", p) 
     ).ToList(); 

    Clipboard.SetText(sResult); 

    tbxEncrypted.Text = sResult; 
} 

此外,當我試圖訪問剪貼板我得到一個安全對話框。我怎樣才能防止這一點?

SilverLight ClipBoard Access MessageBox

+8

這是兩個完全不同的問題。如果發佈兩個不同的問題,SO社區會更好地服務。 – AnthonyWJones

回答

4

您需要調用列表的原因是因爲只有評估了由LINQ語句創建的表達式時,纔會評估Select中的表達式。因爲您使用它來附加到sResult,所以除非您使用ToList()「運行」LINQ表達式,否則該變量在將其放在剪貼板上之前不會更改其值。請注意,ToList()的輸出基本沒有價值。

更大的問題是您濫用選擇。你真的應該使用string.Join而不是在Select子句中構建字符串。在Select子句中構建它對於閱讀你的代碼並且難以理解的人來說是意想不到的。

var sResult = string.Join("", 
       sha.ComputeHash(
         UTF8Encoding.Unicode.GetBytes(tbxWordToEncrypt.Text) 
       ).Select(
         p => string.Format("{0:x2}", p) 
       )); 
+0

非常感謝。我怎麼能像你一樣思考?有沒有什麼書能發展我的觀點? – uzay95

+1

@ uzay95 - 我不能指向一本書,但我確實專注於學習和改進。對於每個軟件開發者來說Code Complete是一本非常好的書,如果你還沒有讀過,但還不夠。我讀了一大堆博客 - 羅伯特馬丁,菲爾哈克,斯科特格思裏。我花了相當長的時間回答關於SO的問題 - 這常常迫使我更多地瞭解有關的技術。你可能想嘗試回答更多的問題,或者更重要的是,找到一個與你正在做的事情有關的問題,你不知道答案並開始研究,直到你能夠回答它爲止。 – tvanfosson

+0

謝謝千次.... – uzay95

5

默認情況下,您在部分信任運行。當調用ClipBoard.SetText()(或ClipBoard.SetText(...))時,用戶必須確認訪問權限。

如果您創建瀏覽器外應用程序並請求提升信任,則此限制不再適用,並且不會顯示對話框。

您可以配置您的應用程序以要求提升信任度。您需要在應用程序的清單中設置它。

欲瞭解更多信息,看看MSDN:

http://msdn.microsoft.com/en-us/library/ee721083(v=vs.95).aspx

  1. 打開項目的屬性,然後導航到Silverlight標籤。
  2. 選中「允許運行應用程序退出瀏覽器」選項。
  3. 單擊「瀏覽器外設置」按鈕。一個新的對話框將彈出。
  4. 選中「在瀏覽器外部運行時需要提升信任」選項。

當用戶安裝Silverlight應用程序時,他們將收到安全警告,然後才能繼續。這隻發生一次。當以這種方式運行應用程序時,ClipBoard.SetText()調用將不再觸發安全對話框。

+0

Silverlight正在處理您的建議。謝謝... – uzay95

0

至於對LINQ:

你只需要調用ToList()如果你想對數據進行評估imediatly。

大多數Linq運營商的設計是lazy,這是一件好事。