我正在使用C#.Net和SQL服务器编写桌面应用程序。我有几个calss构造函数有几个参数,每次我应该传递给他们。下面是一个例子:
Classes.Prices prices = new Classes.Prices
(comboBox1.SelectedValue.ToString(),
Convert.ToInt32(txtPrice.Text),
Convert.ToInt32(txtCarbohydrate.Text),
Convert.ToInt32(txtProtein.Text),
Convert.ToInt32(txtFat.Text),
Convert.ToInt32(txtHumidity.Text),
Convert.ToInt32(txtminerals.Text));
是否有任何方法可以克服这个问题并阻止对转换和传递多个参数进行大量编码 建设者?
答案 0 :(得分:2)
您不应在方法中使用更多2到3个参数。
定义一个名为PriceHolder
public class PriceHolder
{
public string FirstValue { get; set; }
public string Price { get; set; }
public string Carbohydrate { get; set; }
public string Protein { get; set; }
public string Fat { get; set; }
public string Humidity { get; set; }
public string Minerals { get; set; }
}
然后,您的构造函数必须接受PriceHolder
public Prices(PriceHolder hold)
{
// access the values by hold.Fat, hold.Minerals etc
}
此方法可以更轻松地重构代码,或者如果您打算添加更多属性。
此外,您的同事程序员将能够轻松理解它。可读性很重要!
答案 1 :(得分:2)
是的。使用数据绑定将表单绑定到对象。数据绑定会自动转换为两个方向,即从字符串转换为数字和日期,然后返回。
除了具有自动转换的优势之外,您还可以将业务逻辑与表单分开。例如,如果逻辑位于Prices.Price
类中,则可以将任何逻辑应用于名为Price
的属性(或仅Prices
),而不是将其应用于{{1这使得理解和维护代码变得容易得多。
为了使用数据绑定,将一个公共默认构造函数(没有参数的构造函数)添加到类中,并为每个值添加一个公共属性。
Convert.ToInt32(txtPrice.Text)
请参阅:
Data Binding for Windows Forms(关于developerfusion)
Data binding concepts in .NET windows forms(在CodeProject上)
解决问题的一种完全不同的方法是规范化数据。引入public class Prices
{
public Prices ()
{ }
public Prices (decimal price, int carbohydrate, ...)
{ ... }
public decimal Price { get; set; }
public int Carbohydrate { get; set; }
...
}
类并将参数存储在字典或Parameter
类的列表中。这使您可以在循环中处理参数,而不必单独编程每个参数。它还具有可扩展且编码最少的优点。
Prices
答案 2 :(得分:2)
也许这会有所帮助。让Price
construstor如下:
public Prices(string s, int[] values)
{
...
}
让我们以下列形式声明这个静态方法:
private static int[] ParseInts(params TextBox[] textBoxes)
{
return Array.ConvertAll(textBoxes, tb => int.Parse(tb.Text));
}
然后构造函数调用变为:
Prices prices = new Prices(comboBox1.SelectedValue.ToString(),
ParseInts(txtPrice, txtCarbohydrate, txtProtein, txtFat, txtHumidity, txtminerals));
编辑。您还可以将一组texbox存储为数组,而不是每次动态创建它:
private readonly TextBox[] textBoxes = new[] { txtPrice, txtCarbohydrate, txtProtein, txtFat, txtHumidity, txtminerals };
Prices prices = new Prices(comboBox1.SelectedValue.ToString(), ParseInts(textBoxes));