静的プロパティのゲッターに作成の新しいオブジェクトは、一度だけ作成されていますか?

StackOverflow https://stackoverflow.com/questions/2042857

質問

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

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();
あなたは私はその効率的にこれを設定し、うまく実行する方法のスタイル上の任意の考えを持っている場合は、

、私に教えてくださいます。

役に立ちましたか?

解決

  

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

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

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;
    }
}

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

他のヒント

ジェイソン、マーク ただ、完全酒のために、それはALS MembershipServiceの定義に依存します。 MembershipServiceがクラスである場合、オブジェクトは、呼び出し元のメソッドの間で共有されています。 MembershipServiceが構造体である場合は、コピーが常に作成されています。ただ、過去ログのすべてがオブジェクトであるであるため、違いを指定していないそれをMembershipServiceオブジェクトを呼び出します。

オブジェクトを作成するのに高価である場合、遅延読み込みと組み合わせシングルトンパターンを使用することを検討します:

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

は、使用毎回の新しいの新しいオブジェクトが作成されます。

このため、第1のアプローチは、プロパティがアクセスされた新しいオブジェクト毎回作成します。

あなたが探していることはシングルトンと呼ばれている - あなたの第二のアプローチは、C#で、それを実現するための1つの可能性である。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top