12

私はC#を使用しています。任意のc#.netプロジェクト(デスクトップまたはWebベース)に含めることができるクラスを作成しましたが、クラスのそのアプリケーションで作成されるオブジェクトは10個だけにする必要があります。オブジェクトインスタンスが10を超えて作成された場合、エラーが発生するか、単純では機能しません。

2つの状況が考えられます。

  1. myclass.csファイルをプロジェクトに含めるか
  2. クラスをDLLにバンドルしてから、任意のアプリケーションに含めます

どちらの状況でも、アプリケーションでクラスのインスタンスが10個を超えて作成された場合は、エラーが発生する必要があります。

この質問は私の先生から尋ねられました、彼は私にインターネットで答えを探すように言いました、私は試しましたが、この問題の解決策はどこにも見つかりませんでした、私たちはオブジェクトを制限できると聞いていませんか?

はいの場合、それは可能ですか?

ありがとう

4

6 に答える 6

20

作成されたインスタンスの数で静的変数を保持します。オブジェクトの構成ごとにその数を増やします。オブジェクトをIDisposableにし、Dispose()を呼び出すたびにその番号をデクリメントします。スレッドセーフにしたい場合は、Interlocked.Increment()とInterlocked.Decrement()を使用して、++と-の代わりにこの変数の値を変更します。

于 2009-08-09T14:05:51.643 に答える
12

なんらかの形のマルチトンパターンが必要だと思います。

マルチトンパターンはシングルトンパターンのバリエーションですが、オブジェクトのn個のインスタンスが可能です。シングルトンクラスが単一インスタンスを保持する静的変数を持っているのと同じように、マルチトンは、インスタンスにアクセスする方法に応じて、静的配列またはインスタンスのマップで実装されることがよくあります-配列は数値アクセスのみを許可しますが、マップでは、インスタンスに文字列キーを指定して、名前を付けることができます。

于 2009-08-09T14:05:24.577 に答える
9

作成されたインスタンスの数のカウンターでファクトリパターンを使用する必要があるだけです。その後、ファクトリメソッドは例外をスローし、nullを返します。

例:

public class Foobar
{
    private static int numInstances = 0;

    public static Foobar CreateFoobar()
    {
        if (numInstances++ < 10)
        {
            return new Foobar();
        }

        return null;
    }

    protected Foobar()
    {
        ...
    }
}

上記の方法は、単一インスタンスアプリケーションでは完全に機能しますが、複数インスタンスアプリケーションでは、この種の状況(アクセスの制限)を正確に対象としたセマフォ(実装はに存在します)を使用することをお勧めします。System.Threadingリソース/オブジェクトへ)。クラスの複数のインスタンスがほぼ同時に要求され、カウントチェックが失敗するという問題を回避します。

于 2009-08-09T14:06:04.173 に答える
0

インスタンスを破棄するには、静的アンロードメソッドも作成します(AppDomainと同様)。Interlocked.Decrementを使用してカウンターをデクリメントし、インスタンスを破棄するIDisposableのunloadメソッド呼び出し実装を用意します。

(インスタンス内に管理するリソースがあるインスタンスの数を制限している場合を想定しています。)

ジェネリックスを使用して、ファクトリクラスを再利用してさまざまなクラスのインスタンスを制限することもできます。制約を使用して、IDisposibleを実装し、デフォルトのコンストラクターを持つようにインスタンスを要求します。また、実際のインスタンスを返すための非静的プロパティを提供します。


public class foo : IDisposable 
   {
   public foo() { ; }
   public string Name;

   public void Dispose()  { ; } 
   // Real class would free up instance resources
   }

  LimitedInstance< foo > li = LimitedInstance< foo >.CreateInstance();

  li.Instance.Name = "Friendly Name for instance";
  // do stuff with li

  LimitedInstance< foo >.UnloadInstance( ref li );

唯一の問題は、C#で代入演算子をオーバーロードできないことです。したがって、次のことを行う場合:


   li = null;

アンロードメソッドを呼び出す代わりに、インスタンスはヒープ上に残り、GCが発生するまで、インスタンス数のカウンターはデクリメントされません。

于 2010-09-10T03:21:01.967 に答える
0

静的整数を作成し、新しいオブジェクトをインスタンス化するときに更新します。

class YourClass
{
    static int Count = 0;

    public YourClass()
    {
       Count++;
       if(Count > 10)
       {
           //throw exception
       }
    }
}
于 2009-08-09T14:07:12.877 に答える
0

クラスで静的カウンターを取得し、count> 10の場合は、クラスコンストラクターで例外をスローします

于 2009-08-09T14:07:14.560 に答える