2011-06-21 29 views
4

我在幫助器類中有許多幫助器方法。在我的公司,我看到別人如下使用這些輔助方法:我的幫助器方法應該在C#中使用靜態類嗎?

var abc = new HelperClass() 
var def = abc.doAction("ghi"); 

是否有具有這些非靜態類,並每次都圍繞創建一個實例有什麼好處?這豈不是更好申報輔助類靜態和執行以下操作:

var def = HelperClass.doAction("ghi"); 

如果我做了後者,然後我需要聲明兩個輔助類和doAction方法靜態?

下面是一些代碼,我用一個例子:

namespace Power.Storage.Helpers 
{ 
    public class SimplerAES 
    { 
     private static byte[] key = { 123, 217, 19, 11, 24, 26, 85, 45, 114, 184, 27, 162, 37, 112, 222, 209, 241, 24, 175, 144, 173, 53, 196, 29, 24, 26, 17, 218, 131, 236, 53, 209 }; 
     private static byte[] vector = { 146, 64, 191, 111, 23, 3, 113, 119, 231, 121, 221, 112, 79, 32, 114, 156 }; 
     private ICryptoTransform encryptor, decryptor; 
     private UTF8Encoding encoder; 

     public SimplerAES() 
     { 
      RijndaelManaged rm = new RijndaelManaged(); 
      encryptor = rm.CreateEncryptor(key, vector); 
      decryptor = rm.CreateDecryptor(key, vector); 
      encoder = new UTF8Encoding(); 
     } 

     ... 

     public byte[] Encrypt(byte[] buffer) 
     { 
      MemoryStream encryptStream = new MemoryStream(); 
      using (CryptoStream cs = new CryptoStream(encryptStream, encryptor, CryptoStreamMode.Write)) 
      { 
       cs.Write(buffer, 0, buffer.Length); 
      } 
      return encryptStream.ToArray(); 
     } 

     public byte[] Decrypt(byte[] buffer) 
     { 
      MemoryStream decryptStream = new MemoryStream(); 
      using (CryptoStream cs = new CryptoStream(decryptStream, decryptor, CryptoStreamMode.Write)) 
      { 
       cs.Write(buffer, 0, buffer.Length); 
      } 
      return decryptStream.ToArray(); 
     } 
    } 
} 

難道是正確的說這不應該是靜態的,因爲它有一個實例其他類的構造函數。

回答

8

你應該讓他們static避免浪費類實例的內存。一般來說,any method that does not depend on the state of an instance should be static

輔助類只包含靜態方法本身應聲明爲static以防止您意外地添加非靜態成員和實例化類。

+0

謝謝。我剛剛添加了一個我使用的類(從互聯網)的例子。我注意到這個類的作者並沒有把它變成靜態的,這就是我開始思考的東西。也許這應該成爲另一個問題的主題,但你能看出作者爲什麼沒有把它變成靜態的任何原因嗎? – JonAndMarie

+2

這段代碼並不好。 ICryptoTransform應該被丟棄,而不是被重用。因此,它不應該是有狀態的。另外,**不要硬編碼密鑰**! – SLaks

+0

謝謝SLaks。鍵只是硬編碼在這裏作爲例子:-) – JonAndMarie

0

是的,是的,最好使用具有靜態功能的靜態類。

這個怎麼樣

namespace Power.Storage.Helpers 
{ 
public class SimplerAES 
{ 
private static byte[] key = { 123, 217, 19, 11, 24, 26, 85, 45, 114, 184, 27, 162, 37, 112, 222, 209, 241, 24, 175, 144, 173, 53, 196, 29, 24, 26, 17, 218, 131, 236, 53, 209 }; 
private static byte[] vector = { 146, 64, 191, 111, 23, 3, 113, 119, 231, 121, 221, 112, 79, 32, 114, 156 }; 
private static RijndaelManaged rm = new RijndaelManaged(); 

public byte[] Encrypt(byte[] buffer) 
{ 
MemoryStream encryptStream = new MemoryStream(); 
ICryptoTransform encryptor = rm.CreateEncryptor(key, vector); 

using (CryptoStream cs = new CryptoStream(encryptStream, encryptor, CryptoStreamMode.Write)) 
{ 
cs.Write(buffer, 0, buffer.Length); 
} 
return encryptStream.ToArray(); 
} 

public byte[] Decrypt(byte[] buffer) 
{ 
MemoryStream decryptStream = new MemoryStream(); 
ICryptoTransform decryptor = rm.CreateDecryptor(key, vector); 

using (CryptoStream cs = new CryptoStream(decryptStream, decryptor, CryptoStreamMode.Write)) 
{ 
cs.Write(buffer, 0, buffer.Length); 
} 
return decryptStream.ToArray(); 
} 
} 
} 
+0

我剛剛添加到原來的問題。 – JonAndMarie

0

我通常使用的輔助類的靜態方法,但如果你的助手有狀態,也許他們適合在需要實例化一個類,那麼你應該有實例方法。

我想是依賴對你的情況。

相關問題