C# 在Windows窗体应用程序中,我应该将变量放在哪里,而不必使其成为全局变量?

C# 在Windows窗体应用程序中,我应该将变量放在哪里,而不必使其成为全局变量?,c#,winforms,C#,Winforms,我有一个困境!我不知道在C#Windows窗体应用程序中应该把变量放在哪里。例如,在我的WFA项目中,我有一个名为“Item”的数据类型对象列表,目前我不得不将其设置为全局,但是,我知道全局并不是最好的做法。因为我来自C++背景,所以我总是在int()中创建变量,并将它们传递给需要的函数。老实说,我到处都找不到答案。非常感谢任何能帮助我的人 using System; using System.Collections.Generic; using System.ComponentModel; u

我有一个困境!我不知道在C#Windows窗体应用程序中应该把变量放在哪里。例如,在我的WFA项目中,我有一个名为“Item”的数据类型对象列表,目前我不得不将其设置为全局,但是,我知道全局并不是最好的做法。因为我来自C++背景,所以我总是在int()中创建变量,并将它们传递给需要的函数。老实说,我到处都找不到答案。非常感谢任何能帮助我的人

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Sales_Calculator
{
 
    public partial class Form1 : Form
    {
        //Should my list<Item> go here or is there a better place for it?
        List<Item> objItems = new List<Item>();
        public Form1()
        {
            InitializeComponent();
        }
        public class Item
        {
            private string m_sItemName;
            private double m_dItemPrice;
            private int m_iQuantitySold;

            public Item(string sItemName, double dItemPrice, int iQuantitySold)
            {
                m_sItemName = sItemName;
                m_dItemPrice = dItemPrice;
                m_iQuantitySold = iQuantitySold;
            }
            public string Name
            {
                get { return m_sItemName; }
                set { m_sItemName = value; }
            }
            public int QuantitySold
            {
                get { return m_iQuantitySold; }
                set { m_iQuantitySold = value; }
            }
            public double Price
            {
                get { return m_dItemPrice; }
                set { m_dItemPrice = value; }
            }
        }
        bool DoesItemNameExist(string sName)
        {
            return (objItems.Find(delegate (Item objItem){return sName == objItem.Name;}) != null) ? true : false;
        }
        private Item HighestSellingItem()
        {
            int MaxQuantitySold = objItems.Max(objItem => objItem.QuantitySold);
            return objItems.Find(delegate (Item objItem) {
                return objItem.QuantitySold == MaxQuantitySold;
            });
        }
        private double Average()
        {
            int iTotal = 0;
            objItems.ForEach(delegate (Item objItem)
            {
                iTotal += objItem.QuantitySold;
            });
            double dAverage = iTotal / objItems.Count;
            return dAverage;
        }
        private void label1_Click(object sender, EventArgs e)
        {

        }
        private void AddToDataGridView(object sender)
        {
            dgvItems.Rows.Add(objItems.Count, objItems.Last().Name, objItems.Last().QuantitySold, objItems.Last().Price);
        }
        void ClearTextBoxes()
        {
            txtItemName.Clear();
            txtItemPrice.Clear();
            txtQuantitySold.Clear();
        }
        void AddItemToList()
        {
            
            string sItemName = "";
            if (DoesItemNameExist(sItemName = Convert.ToString(txtItemName.Text)))
            {
                MessageBox.Show("You can't have that name, it already exists!");
                txtItemName.Clear();
                return;
            }
            double dItemPrice = Convert.ToDouble(txtItemPrice.Text);
            int iQuantitySold = Convert.ToInt32(txtQuantitySold.Text);
            Item objItem = new Item(sItemName, dItemPrice, iQuantitySold);
            objItems.Add(objItem);
            MessageBox.Show("You have added an item!");
            ClearTextBoxes();
                
            
           
        }
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
            AddItemToList();
            AddToDataGridView(sender);
            lblAverageQuantitySold.Text = Average().ToString();
            lblExistingItems.Text = objItems.Count.ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show("You have inputted incorrectly!", "Invalid", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            dvgHighestSellingItem.Rows.Clear();
            dvgHighestSellingItem.Rows.Add(HighestSellingItem().Name);
        }

        private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
        {
           

        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
名称空间计算器
{
公共部分类Form1:Form
{
//我的名单应该放在这里还是有更好的地方?
List objItems=新列表();
公共表格1()
{
初始化组件();
}
公共类项目
{
私有字符串m_sItemName;
私人双硕士学位;
私人国际博物馆;
公共项(字符串sItemName、双数据项price、int-iQuantitySold)
{
m_sItemName=sItemName;
m_dItemPrice=dItemPrice;
m_iQuantitySold=iQuantitySold;
}
公共字符串名
{
获取{return m_sItemName;}
设置{m_sItemName=value;}
}
已售出的公共整数数量
{
获取{return m_iquiantysold;}
集合{m_iQuantitySold=value;}
}
公共双价
{
获取{return m_dItemPrice;}
集合{m_dItemPrice=value;}
}
}
bool doesitemname存在(字符串sName)
{
return(objItems.Find(委托(项objItem){return sName==objItem.Name;})!=null)?true:false;
}
private Item HighestSellingItem()
{
int maxquantitysell=objItems.Max(objItem=>objItem.quantitysell);
返回objItems.Find(委托(项objItem){
return objItem.quantitysell==MaxQuantitysell;
});
}
私人双平均
{
int-iTotal=0;
ForEach(委托(项objItem)
{
iTotal+=objItem.QuantitySelled;
});
double dAverage=iTotal/objItems.Count;
返回平均值;
}
私有无效标签1_单击(对象发送方,事件参数e)
{
}
私有void AddToDataGridView(对象发送方)
{
dgvItems.Rows.Add(objItems.Count,objItems.Last().Name,objItems.Last().quantitysell,objItems.Last().Price);
}
作废ClearTextBox()
{
txtItemName.Clear();
txtItemPrice.Clear();
txtQuantitySelled.Clear();
}
void AddItemToList()
{
字符串sItemName=“”;
if(DoesItemNameExist(sItemName=Convert.ToString(txtItemName.Text)))
{
Show(“你不能有这个名字,它已经存在了!”);
txtItemName.Clear();
返回;
}
double-dItemPrice=Convert.ToDouble(txtItemPrice.Text);
int-iQuantitySold=Convert.ToInt32(txtQuantitySelled.Text);
项目objItem=新项目(站点名称、数据价格、iQuantitySold);
添加(objItem);
Show(“您已经添加了一项!”);
ClearTextBox();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
尝试
{
AddItemToList();
AddToDataGridView(发送方);
lblAverageQuantitySold.Text=Average().ToString();
lblExistingItems.Text=objItems.Count.ToString();
}
捕获(例外情况除外)
{
MessageBox.Show(“您输入错误!”,“无效”,MessageBoxButtons.OK,MessageBoxIcon.Error);
}
dvgHighestSellingItem.Rows.Clear();
dvgHighestSellingItem.Rows.Add(HighestSellingItem().Name);
}
private void contextMenuStrip1_打开(对象发送方,CancelEventArgs e)
{
}
}
}

如果列表仅在Form类中是必需的,那么您将其放在正确的位置。但是,我建议您删除内部Item类,并将其移动到同一命名空间中的不同文件中。最后,像Average、HighestSellingItem和DoesItemNameExist这样的所有方法都是不必要的,因为您在系统Linq名称空间中拥有与我建议您探索和学习的相同的功能,但这些功能是针对我自己的对象定制的。您告诉我有一个名为“DoesItemNameExist”的函数?此行var item=objItems.FirstOrDefault(x=>x.Name==sName);将对DoesItemNameExists执行相同的操作。如果item==null,那么就没有匹配项,否则就有itemvar item=objItems.OrderBy(x=>x.quantitysell.First();可以取代在C++中所学到的知识在管理的Env中具有巨大的价值。你只需要找到新世界的翻译。