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