我有一个函数,它从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 -
答案 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)
如果您希望方法具有多个返回值,则基本上有两个选项:
ref
或out
参数在你的情况下,你可以简单地返回一个可空的并且没事。使用结构通常是一个更简洁的设计,因为你不依赖于调用语言(如果它是不同于C#的东西)知道ref和out参数,而后一个选项是非常快一点。
//编辑:哦,你可能想知道double值,无论解析成功与否。因此,定义自己的结构可能会更好。