6

私が書いている Web サービスの静的ヘルパー クラスを作成しています。私は Telligent の API を利用しているので、これらの Telligent の「サービス」オブジェクトを作成して、プラットフォームで何かを行うことができます。たとえば、ヘルパー クラスで MembershipSerice オブジェクトを作成しているので、同じオブジェクトでメンバーシップを行うことができます。私のヘルパー クラスには、これらのオブジェクトの新しい 1 つを作成するゲッターを持つプロパティがあります。

private static MembershipService _MembershipService {
  get {
    return new MembershipService(path, usr, pwd);
  }
}

そして、そのプロパティを返すメソッドがあります:

public MembershipService getMembershipService() {
  return _MembershipService;
}

プロパティが静的であるため、ゲッターで作成された新しいオブジェクトは一度しか作成されないということですか? また、コーディングスタイルとしては、プロパティを公開した方が良いので、メソッドは必要ありません。

または...オブジェクトをプライベート変数として作成し、パブリックメソッドを介して返す方がよいでしょうか:

private static MembershipService _mbrSvc = new MembershipService(path, usr, pwd);
public MembershipService getMembershipService() {
  return _mbrSvc;
}

// then called elsewhere by me via:
MembershipService svc = MyHelperClass.getMembershipService();

効率的でパフォーマンスが良いようにこれをどのようにセットアップしたかについて、何か考えがある場合は、お知らせください。

4

3 に答える 3

14

プロパティが静的であるため、ゲッターで作成された新しいオブジェクトは一度しか作成されないということですか?

いいえ、あなたが持っているので

new MembershipService(path, usr, pwd);

ゲッター内では、_MembershipService宣言されているかどうかに関係なく、static呼び出しごとに新しいインスタンスが作成されます。このコンテキストでstatic意味するのは、定義クラスのインスタンスがなくてもメソッドを呼び出すことができるということだけです。

スタイルについてコメントする限り、まあ、それは本当にあなたが何をしたいかによって異なります. 単一のインスタンスが必要ですか? その場合は、静的メンバー変数を作成_mbrSvcし、ゲッターからそれを返します。

private static MembershipService _mbrSvc = new MembershipService(path, usr, pwd);
private static MembershipService _MembershipService {
    get {
        return _mbrSvc;
    }
}

それ以外はそのままで結構です。

于 2010-01-11T15:48:14.693 に答える
4

ジェイソン、マーク完全を期すために、これはMembershipServiceの定義にも依存します。MembershipService がクラスの場合、オブジェクトは呼び出し元のメソッド間で共有されます。MembershipService が構造体の場合、常にコピーが作成されます。DotNet ではすべてがオブジェクトであるため、MembershipService オブジェクトと呼ぶだけでは違いはわかりません。

オブジェクトの作成にコストがかかる場合は、遅延読み込みと組み合わせたシングルトン パターンの使用を検討してください。

private static MembershipService _mbrSvc;
private static MembershipService _MembershipService { 
    get { 
        if(_mbrSvc == null)
        {
          _mbrSvc = new MembershipService(path, usr, pwd); 
        }
        return _mbrSvc; 
    } 
} 
于 2010-01-11T16:28:36.907 に答える
1

newを使用するたびに、新しいオブジェクトが作成されます。

したがって、最初のアプローチでは、プロパティにアクセスするたびに新しいオブジェクトが作成されます。

あなたが探しているのは Singleton と呼ばれるものです - あなたの 2 番目のアプローチは、C# でそれを実装する 1 つの可能性です。

于 2010-01-11T15:48:37.657 に答える