如何对多个类使用相同的实例名称

本文关键字:实例 | 更新日期: 2023-09-27 18:31:12

我是 c# 的新手,我想我想这样做,但也许我没有也不知道!

我有一个名为SyncJob的类。我希望能够创建一个实例来从"我的文档"备份文件(只是一个示例)。然后我想创建另一个 SyncJob 实例来备份另一个文件夹中的文件。因此,换句话说,我可以在内存中拥有同一类的多个实例。

我首先在我的代码中声明对象 var,以便它下面的所有方法都可以访问它。

我的问题是:虽然使用相同的实例名称会在内存中为对象创建一个新实例,但我如何管理这些对象?这意味着,如果我想设置其中一个属性,如何告诉编译器要将更改应用于哪个实例?

正如我在开头所说,也许这是管理同一类的多个实例的错误方案......也许有更好的方法。

这是我的原型代码:

表格1.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;
        }
    }
}

如何对多个类使用相同的实例名称

你可以使用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,您可以通过循环通过PatientList

如果需要显示"John"的patient详细信息,请使用 LINQ

displayInstanceName(PatientList.FirstOrDefault(p=>p.Name =="John")); 

如果需要管理实例集合,请使用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;
    }
}

除非需要访问器方法与其他系统互操作,否则不需要它们。 在get上使用修饰符,在属性本身上使用set访问器,您可以创建公共读取/私有写入属性等。