get和Set不起作用

本文关键字:不起作用 Set get | 更新日期: 2023-09-27 17:51:24

我正在编写以下get和set,用于验证来自文本框的输入。基本上,它应该检查用户是否输入了所有值。当我将TextBoxes留空时,它什么也不做,并在使用该变量的输出中显示一个"0"。然而,它确实显示了系统生成的异常并停止了执行,但我想知道为什么它不通过属性验证输入?

这是我的代码:

public double RecoDoseSize
{
    get
    {
        return recoDoseSize;
    }
    set
    {
        if (!(value>0))
        {
            MessageBox.Show("Please Enter the recommended dose size for this product");
            textBox8.Focus();
        }
        recoDoseSize = value;
    }
}

private void Submit2_Click(object sender, RoutedEventArgs e)
{
    TotalContentProduct = double.Parse(textBox7.Text);
    recoDoseSize = double.Parse(textBox8.Text);
    NoOfDosespUnit = TotalContentProduct/recoDoseSize;
}

get和Set不起作用

您设置的是支持字段recoDoseSize,而不是包含代码的属性RecoDoseSize。因此,您的代码不会执行。您需要将方法体的第二行更改为

RecoDoseSize = double.Parse(textBox8.Text);

(注意大写R(。

其他人对所述问题给出了正确答案。也就是说,如果您想使用getter/setter,那么您应该调用大写的RecoDoseSize

然而,在setter中显示消息框是非常糟糕的做法,因为这违反了最小惊喜原则。

当有人查看行RecoDoseSize = double.Parse(textBox8.Text);时,根本不清楚此操作是否会导致出现消息框。

偶尔也会有一些例外,让setter触发UI更改是有意义的(例如控件上的Visible属性(,但默认情况应该始终是不这样做,除非你确信不这样做会更令人困惑(例如,如果你设置Visible = false,但它仍然可见,那将是令人惊讶的(。

关于您对应该如何实现它的评论,检查应该在点击处理程序中进行,并且该属性可以是一个自动属性,如下所示:

public double RecoDoseSize { get; set; }
private void Submit2_Click(object sender, RoutedEventArgs e)
{
    TotalContentProduct = double.Parse(textBox7.Text);
    double enteredSize;
    if (!double.TryParse(textBox8.Text, out enteredSize) || enteredSize <= 0)
    {
        MessageBox.Show("Please Enter the recommended dose size for this product");
        textBox8.Focus();
        return;
    }
    RecoDoseSize = enteredSize;
    NoOfDosespUnit = TotalContentProduct / recoDoseSize;
}

您需要使用TryParse,因为使用Parse时,如果文本不是有效的double,则会出现错误。TryParse所做的是返回truefalse,这取决于它是否成功,如果成功,它会用结果填充out参数。

因此,如果它未能解析结果,或者结果为<= 0,它将显示消息框。在这种情况下,它还从方法中return,因此它的其余部分不会执行。或者,该方法的其余部分可以在else块中,在这种情况下不需要return。选择哪种方式是风格的问题。

您从未实际使用过getter/setter。您直接使用实际的字段名称:recoDoseSize。将其更改为RecoDoseSize

private void Submit2_Click(object sender, RoutedEventArgs e)
{
    TotalContentProduct = double.Parse(textBox7.Text);
    RecoDoseSize= double.Parse(textBox8.Text);
    NoOfDosespUnit = TotalContentProduct/recoDoseSize;
}

您不应该在set语句中处理焦点。

此外,您需要确保该值不为null,否则您无法将其与任何值(大于等(进行比较。