0

私はC#が初めてで、これをやりたいと思っていますが、知らないし、知らないかもしれません!

SyncJob というクラスがあります。My Documents からファイルをバックアップするインスタンスを作成できるようにしたい (ほんの一例)。次に、SyncJob の別のインスタンスを作成して、別のフォルダーにファイルをバックアップしたいと考えています。つまり、メモリ内に同じクラスのインスタンスを複数持つことができます。

コード内で最初にオブジェクト var を宣言しているので、その下にあるすべてのメソッドからアクセスできます。

私の質問は、同じインスタンス名を使用するとオブジェクトの新しいインスタンスがメモリ内に作成されますが、これらのオブジェクトを管理するにはどうすればよいですか? つまり、プロパティの 1 つを設定したい場合、どのインスタンスに変更を適用するかをコンパイラに伝えるにはどうすればよいでしょうか?

最初に言ったように、これは同じクラスの複数のインスタンスを管理するための間違ったスキームかもしれません...もっと良い方法があるかもしれません。

ここに私のプロトタイプコードがあります:

Form1.cs

namespace Class_Demo
{
    public partial class Form1 : Form
    {
        BMI patient; // public declarition
        public Form1()
        {
            InitializeComponent();
        }

        private void btnCreateInstance1_Click(object sender, EventArgs e)
        {
            patient = new BMI("Instance 1 Created", 11); // call overloaded with 2 arguments
            displayInstanceName(patient);
        }

        private void displayInstanceName(BMI patient)
        {
            MessageBox.Show("Instance:"+patient.getName()+"\nwith Age:"+patient.getAge());
        }

        private void btnCreateInstance2_Click(object sender, EventArgs e)
        {
            patient = new BMI("Instance 2 Created", 22); // call overloaded with 2 arguments
            displayInstanceName(patient);
        }

        private void btnSetNameToJohn_Click(object sender, EventArgs e)
        {
            // this is the issue: which instance is being set and how can I control that?
            // which instance of patient is being set?
            patient.setName("John");
        }

        private void btnDisplayNameJohn_Click(object sender, EventArgs e)
        {
            // this is another issue: which instance is being displayed and how can I control that?
            // which instance of patient is being displayed?
            displayInstanceName(patient);
        }
    }
}

クラスファイル:

namespace Class_Demo
{
    class BMI
    {
        // Member variables
        public string _newName { get; set; }
        public int _newAge { get; set; }

        // Default Constructor
        public BMI() // default constructor name must be same as class name -- no void
        {
            _newName = "";
            _newAge = 0;
        }

        // Overload constructor
        public BMI(string name, int age)
        {
            _newName = name;
            _newAge = age;
        }

        //Accessor methods/functions
        public string getName()
        {
            return _newName;
        }
        public int getAge()
        {
            return _newAge;
        }
        public void setName(string name)
        {
            _newName = name;
        }

    }
}
4

2 に答える 2

4

public List<BMI> PatientList { get; set; }代わりに持つことができますBMI patient;

ある場合、patientどのアイテムにアクセスするかわからない場合、それを割り当てると以前のアイテムが置き換えられます

    public List<BMI> PatientList { get; set; }
    public Form1()
    {
        InitializeComponent();
        PatientList = new List<BMI>();
    }

リストを使用するとBMI、以下のようなアイテムを追加できます

PatientList.Add(new BMI("Instance 1 Created", 11));
PatientList.Add(new BMI("Instance 2 Created", 22)); 

インスタンス1の名前を設定する必要がある場合は、インデックスで項目を取得できます

PatientList[0].setName("John");

patientまたは、ループによってプロパティの 1 つを見つけることができますPatientList

patient「John」の詳細を表示する必要がある場合は、LINQ を使用して

displayInstanceName(PatientList.FirstOrDefault(p=>p.Name =="John")); 
于 2013-09-13T04:09:14.200 に答える
1

インスタンスのコレクションを管理する必要がある場合は、List<BMI>または同様のものを使用します。ジェネリックList<T>クラスは、(ほぼ) あらゆるタイプのオブジェクトを保持でき、操作も簡単です。これは、何度も何度も使用する .NET ツールキットの重要な部分でもあります。

また、BMI クラスを書き直して、プロパティをより効果的に使用することを検討してください。

class BMI
{
    public string NewName { get; set; }
    public int NewAge { get; protected set; }

    public BMI()
        : this("", 0)
    { }

    public BMI(string name, int age)
    {
        NewName = name;
        NewAge = age;
    }
}

他のシステムとの相互運用のためにアクセサ メソッドが必要でない限り、アクセサ メソッドは必要ありません。プロパティ自体に修飾子getsetアクセサーを使用すると、パブリック読み取り/プライベート書き込みプロパティなどを作成できます。

于 2013-09-13T04:11:22.080 に答える