2011-06-21 19 views
4

ヘルパークラス内にいくつかのヘルパーメソッドがあります。ヘルパーメソッドはC#で静的クラスを使用する必要があります

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

非静的クラスとしてこれらを有し、かつ周りたびにインスタンスを作成することに利点があります:私の会社では、私は他の人が以下のようにこれらのヘルパーメソッドを使用することを参照してください? staticとしてヘルパークラスを宣言し、次の操作を実行するために、より良いではないでしょう:

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

私は後者が、私はstaticとしてヘルパークラスとの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

についてどのような私は、通常、ヘルパークラスの静的メソッドを使用しますが、あなたのヘルパーは状態を持っているし、おそらく彼らはインスタンス化を必要とするクラスに収まる場合は、インスタンスメソッドを持っている必要があります。

私はあなたの状況に応じてに従属すると思われます。

関連する問題