2014-01-30 13 views
2

看起來他們在.NET 3.5的示例中犯了一個錯誤,因此我使用的是.NET 3.5,但代碼示例適用於.NET 4及更高版本。 (因爲Dispose()方法在.NET 3.6中不可用)我是否實現自己的Dispose()或者是否使用.NET 3.5的RNGCryptoServiceProvider的Finalize()?

我有實現我自己的Dispose()還是使用Finalize()?或者我應該效仿.NET 2.0的例子嗎?

這裏是出現在你所選擇的.NET 3.5

//The following sample uses the Cryptography class to simulate the roll of a dice. 

using System; 
using System.IO; 
using System.Text; 
using System.Security.Cryptography; 

class RNGCSP 
{ 
private static RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider(); 
// Main method. 
public static void Main() 
{ 
    const int totalRolls = 25000; 
    int[] results = new int[6]; 

    // Roll the dice 25000 times and display 
    // the results to the console. 
    for (int x = 0; x < totalRolls; x++) 
    { 
     byte roll = RollDice((byte)results.Length); 
     results[roll - 1]++; 
    } 
    for (int i = 0; i < results.Length; ++i) 
    { 
     Console.WriteLine("{0}: {1} ({2:p1})", i + 1, results[i], (double)results[i]/(double)totalRolls); 
    } 
    rngCsp.Dispose(); 
    Console.ReadLine(); 
} 

// This method simulates a roll of the dice. The input parameter is the 
// number of sides of the dice. 

public static byte RollDice(byte numberSides) 
{ 
    if (numberSides <= 0) 
     throw new ArgumentOutOfRangeException("numberSides"); 

    // Create a byte array to hold the random value. 
    byte[] randomNumber = new byte[1]; 
    do 
    { 
     // Fill the array with a random value. 
     rngCsp.GetBytes(randomNumber); 
    } 
    while (!IsFairRoll(randomNumber[0], numberSides)); 
    // Return the random number mod the number 
    // of sides. The possible values are zero- 
    // based, so we add one. 
    return (byte)((randomNumber[0] % numberSides) + 1); 
} 

private static bool IsFairRoll(byte roll, byte numSides) 
{ 
    // There are MaxValue/numSides full sets of numbers that can come up 
    // in a single byte. For instance, if we have a 6 sided die, there are 
    // 42 full sets of 1-6 that come up. The 43rd set is incomplete. 
    int fullSetsOfValues = Byte.MaxValue/numSides; 

    // If the roll is within this range of fair values, then we let it continue. 
    // In the 6 sided die case, a roll between 0 and 251 is allowed. (We use 
    // < rather than <= since the = portion allows through an extra 0 value). 
    // 252 through 255 would provide an extra 0, 1, 2, 3 so they are not fair 
    // to use. 
    return roll < numSides * fullSetsOfValues; 
} 

}

回答

6

你的情況是靜態的,應繼續下去的話MSDN上的例子。沒有理由把它扔掉或重新生成它。您應該只有一個應用程序生命週期中的字節並從中提取字節。所以永遠不要處理或確定它。這是因爲發電機和強度的一致性可以保證真的沒有理由回收或再生密碼RNG

在程序退出所有可支配資源已經被照顧。

相關問題