替代C#中的属性

时间:2015-10-29 07:32:38

标签: c#

我有一个函数,它从TextBox中读取Text,然后尝试将其解析为数字。如果可能,它将存储解析的数据。如果不可能,则不会触摸数据,而是将TextBox.Text设置为变量的String-Representation。 因为我需要它用于各种TextBoxes和底层变量,我的函数看起来像这样:

public bool ValidateAndParseTextBox(TextBox textBox, ref double storage)
    {
        try
        {
            storage = double.Parse(textBox.Text);
            return true;
        }
        catch (FormatException)
        {
            textBox.Text = storage.ToString();
            return false;
        }
    }

int

也一样

现在我将基础数据移动到一个单独的对象,因此我想使用属性而不是仅将变量公开。但是,我不能使用ref语句。

如果我不需要布尔return值,我就可以这样做

public double ValidateAndParseTextBox(TextBox textBox, double Value)
    {
        double ret;
        if (!double.TryParse(textBox.Text, ret))
            return Value;
        return ret;
    }

但我在某种程度上未能看到具有bool值的解决方案。 有任何想法吗? 如果我能以某种方式将属性setter作为委托发送给函数,或类似的东西,那会是什么好事。

感谢, -m -

2 个答案:

答案 0 :(得分:1)

对我而言,这个功能似乎试图做得太多。有一个只接受文本框的纯函数,验证它并返回一个bool。

public bool IsTextboxValid(TextBox textBox)
{
    double dummy;
    return double.TryParse(textbox.Text, out dummy);
}

根据此功能的结果,调用者可以决定是否设置属性。

另一种方法是返回一个可以为空的double,它指示解析是否成功,以及double值是什么(如果有的话)。

public double? ParseTextbox(TextBox textBox)
{
    double ret;
    if(double.TryParse(textbox.Text, out ret))
        return ret;
    else
        return null;
}

从调用者的角度来看,它可以检查返回值.HasValue,在这种情况下它可以更新存储,否则它会用存储值更新文本框。

您问题的字面答案是,是的,您可以传递将属性设置为参数的委托:

public bool ValidateTextbox(TextBox textBox, Action<double> setValue)
{
    bool parseSucceeds;
    double d;
    if (parseSucceeds = double.TryParse(textBox.Text, out d))
        setValue(d);
    return parseSucceeds;
}

您可以使用d => whatever.Path.To.The.Property = d作为参数调用它。我不建议这样做。

答案 1 :(得分:0)

如果您希望方法具有多个返回值,则基本上有两个选项:

  1. 使用描述两个值的结构
  2. 使用refout参数
  3. 在你的情况下,你可以简单地返回一个可空的并且没事。使用结构通常是一个更简洁的设计,因为你不依赖于调用语言(如果它是不同于C#的东西)知道ref和out参数,而后一个选项是非常快一点。

    //编辑:哦,你可能想知道double值,无论解析成功与否。因此,定义自己的结构可能会更好。