我仍然相对较新的C#并在论坛上发帖但我正在尝试制作一个功能,这将有助于我缩短我的代码,使其更易于管理/读取C#中新编码的人读这么多行代码时,我很害怕。
Ill显示我在代码视图中尝试做的事情并在之后解释,因为我不太善于解释。
https://gyazo.com/3a440ca6c4f0fc1764f7edd41081e434 - 截至目前为止整个代码的截图。
这是按钮中的代码。
private void button7_Click(object sender, EventArgs e)
{ //this works and outputs the total value.
/* int A, B, C, D, E, F, G, H, Answer;
A = int.Parse(textBox1.Text);
B = int.Parse(textBox2.Text);
C = int.Parse(textBox3.Text);
D = int.Parse(textBox4.Text);
E = int.Parse(textBox5.Text);
F = int.Parse(textBox6.Text);
G = int.Parse(textBox7.Text);
H = int.Parse(textBox8.Text);
Answer = A + B + C + D + E + F + G + H;
lblTotal1.Text = Answer.ToString();
* */
calc(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text, textBox6.Text, textBox7.Text, textBox8.Text, lblTotal1.Text);
}
这是函数中的代码。
private void calc(string TextBox1, string TextBox2, string TextBox3, string TextBox4, string TextBox5, string TextBox6, string TextBox7, string TextBox8, string TextAnswer)
{
int A, B, C, D, E, F, G, H, Total;
A = int.Parse(TextBox1);
B = int.Parse(TextBox2);
C = int.Parse(TextBox3);
D = int.Parse(TextBox4);
E = int.Parse(TextBox5);
F = int.Parse(TextBox6);
G = int.Parse(TextBox7);
H = int.Parse(TextBox8);
Total = A + B + C + D + E + F + G + H;
TextAnswer = Total.ToString();
}
起初我认为这是因为使用了一个字符串,但我不知道这是否是问题,如果是,如何解决它。
如果有人可以告诉我我做错了什么,那将是一个巨大的帮助。 非常感谢提前。答案 0 :(得分:4)
这个解决方案怎么样:
private string calc(params string[] input)
{
return input.Select(x => int.Parse(x)).Sum().ToString();
}
答案 1 :(得分:1)
您可以枚举控件(TextBox1..TextBox8
):
private void button7_Click(object sender, EventArgs e) {
int Total = 0;
for (int i = 1; i <= 8; ++i)
Total += int.Parse(Controls
.Find(String.Format("textBox{0}", i), true)
.First()
.Text);
lblTotal1.Text = Total.ToString();
}
所以你不需要功能。
答案 2 :(得分:1)
您的代码中可以改进的很多东西。
calc
的实施不正确。您正试图通过TextAnswer
参数返回答案。为什么?让方法返回值本身,不需要使用out
参数(在#3中有更多内容)。
只有在方法必须返回多个值时才应考虑使用out
通过引用传递参数:
private void calc(string TextBox1, string TextBox2, string TextBox3, string TextBox4, string TextBox5, string TextBox6, string TextBox7, string TextBox8, out string TextAnswer) //note the out keyword prior to TextAnswer
您也可以使用ref
而不是out
,但out
表示参数用作输出的含义加上它使某些编译器帮助确保变量在之前设置退出方法。要详细了解该主题,请阅读this和this。
C#中的默认值是参数按值传递。也就是说,参数的副本被传递给该方法。这意味着即使您修改它,您只是修改副本,原始保持不变。在您的情况下,您只需修改TextAnswer
的副本lblTotal1.Text
。
再次,让我说清楚,在你的情况下绝对没有必要使用引用参数。作为旁注,在您的情况下,您无法使用out
,因为您无法通过引用属性传递。
你的助手方法calc
名字很可怕。不要使用模糊代码的缩写。正确命名:例如calculateSum
。
你的助手方法有一个奇怪的合同。它的名字表示它只是计算一个值,但它没有返回任何东西,它显然产生副作用;在用户界面中显示计算结果。更好的合同如下:
private int calculateSum(string text1, string text2, string text3, string text4, string text5, string text6, string text7, string text8)
现在合约是 clear :calculateSum
是一个函数,它接受8个字符串参数,并以某种方式生成并返回结果。
该方法的实施将是:
private int calculateSum(string text1, string text2, string text3, string text4, string text5, string text6, string text7, string text8)
{
int A, B, C, D, E, F, G, H;
A = int.Parse(TextBox1);
B = int.Parse(TextBox2);
C = int.Parse(TextBox3);
D = int.Parse(TextBox4);
E = int.Parse(TextBox5);
F = int.Parse(TextBox6);
G = int.Parse(TextBox7);
H = int.Parse(TextBox8);
return A + B + C + D + E + F + G + H;
}
现在你按照以下方式调用它;
private void button7_Click(object sender, EventArgs e)
{
lblTotal1.Text = calculateSum(textBox1.Text, textBox2.Text, ...);
}
您的代码无法处理错误的输入。如果传递给calculateSum
的其中一个参数实际上不是数字的有效表示,会发生什么?说134w4
。 int.Parse("134w4")
将会失败,您的应用程序将崩溃,您的用户将无法理解错误。
您有很多选择,我建议您开始阅读here。
private int calculateSum(string text1, string text2, string text3, string text4, string text5, string text6, string text7, string text8)
{
int A, B, C, D, E, F, G, H;
try
{
A = int.Parse(TextBox1);
B = int.Parse(TextBox2);
C = int.Parse(TextBox3);
D = int.Parse(TextBox4);
E = int.Parse(TextBox5);
F = int.Parse(TextBox6);
G = int.Parse(TextBox7);
H = int.Parse(TextBox8);
}
catch (FromatException)
{
MessageBox.Show("Ooops! You entered an invalid number.");
}
catch (OverflowEcxeption)
{
MessageBox.Show("Ooops! You entered an number that it too big.");
}
return A + B + C + D + E + F + G + H;
}
我们可以做得更好吗?是的,calculateSum
似乎对所有这些论点都太笨拙了。让我们改进它。转到params关键字:
private int calculateSum(params string[] arguments)
{
int sum = 0;
try
{
foreach (var arg in arguments)
{
sum += int.Parse(arg);
}
}
catch (FromatException)
{
MessageBox.Show("Ooops! You entered an invalid number.");
}
catch (OverflowEcxeption)
{
MessageBox.Show("Ooops! You entered an number that it too big.");
}
return sum;
}
最佳做法会告诉您开始使用int.TryParse()
而不是int.Parse()
。此外,它将提供理解out
关键字的完美示例。看看它是如何工作的,understand它。我会把它留给你。
答案 3 :(得分:0)
我认为你可以更好地使用NumericUpDown控件代替字符串。它是用于输入数值的特定控件,与使用字符串输入控件相比具有以下优点:
有关详细信息,请参阅How do I make a textbox that only accepts numbers?。
答案 4 :(得分:0)
您可以编写calc
来使用params
数组
private string Calc(params string[] values)
{
int total = 0;
foreach(var value in values)
{
total += int.Parse(value);
}
return total.ToString();
}
params
表示该函数采用可变数量的参数,因此在上面该函数需要0个或更多个字符串。编译器会将传递的值存储在数组中,以便您可以使用常规数组访问代码来访问它们。
如果您想使用Linq,那么您可以使用Sum扩展方法:
private string Calc(params string[] values)
{
int total = values.Sum(value => int.Parse(value));
return total.ToString();
}
答案 5 :(得分:0)
我假设您想知道代码有什么问题而不是重写代码。您的calc
函数会计算正确的值,但button7_Click
函数永远不会收到它。将TextAnswer
设置为等于答案将不起作用,因为它是通过值而不是引用传递的。或者,您可以返回值并将其设置为lblTotal1.Text
。两者的例子如下。
以参考方式传递
private void button7_Click(object sender, EventArgs e)
{
calc(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text, textBox6.Text, textBox7.Text, textBox8.Text, out lblTotal1.Text);
}
private void calc(string TextBox1, string TextBox2, string TextBox3, string TextBox4, string TextBox5, string TextBox6, string TextBox7, string TextBox8, out string TextAnswer)
{
// Same code as original
}
用于返回值
private void button7_Click(object sender, EventArgs e)
{
lblTotal1.Text = calc(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text, textBox6.Text, textBox7.Text, textBox8.Text);
}
// Note the changed calc parameters
private void calc(string TextBox1, string TextBox2, string TextBox3, string TextBox4, string TextBox5, string TextBox6, string TextBox7, string TextBox8)
{
// Same code as original but change last line to
return Total.ToString();
}