在为Autocad(绘图软件)编写插件时,我创建了一个3d点构建,其中包含3个双精度值,表示3d中某个点的X,Y和Z值。
Point3d insertPoint = new Point3d((insPointX = StrToDouble(tbInsPointX.Text)),
insPointY = StrToDouble(tbInsPointY.Text),
insPointZ = StrToDouble(tbInsPointZ.Text));
并且StrToDouble看起来像这样:
public double StrToDouble(string str)
{
double x = 0;
try
{
x = double.Parse(str.Replace(",", "."));
}
catch (System.Exception ex) { MessageBox.Show(ex.Message); }
return x;
}
但是现在它实际上总是返回一个double,因为当解析失败时它将double返回为0。 我现在想知道什么是报告3dpoint创建的正确方法,即存在错误并且不应再继续。 我可以考虑使用bool或其他东西,但我认为这可能不是一个很好的干净方式。由于我只是一个业余爱好程序员,我不知道这是正确的方法。 当double = 0不是一个选项时让它停止,因为它实际上可以是一个实际值。
答案 0 :(得分:6)
你可能正在寻找double.TryParse
,它的另一个好处是它不会抛出异常。
double output;
if (double.TryParse(input, out output))
{
// Success
}
else
{
// Failure
}
.NET中的所有'struct'类型(数字,DateTime,TimeSpan等)都有一个TryParse
方法,如果你们每个人都在寻找类似的功能。
要回答您的跟进,您可以将Point3d
的解析包装成类似的TryParse
方法:
private static bool TryParsePoint3d(string x, string y, string z, out Point3d output)
{
double xValue, yValue, zValue;
if (double.TryParse(x, out xValue) &&
double.TryParse(y, out yValue) &&
double.TryParse(z, out zValue))
{
output = new Point3d(xValue, yValue, zValue);
return true;
}
// out params must be assigned, use null if it's a class
output = new Point3d();
return false;
}
您可以将其用作
Point3d insertPoint;
if (TryParsePoint3d(tbInsPointX.Text, tbInsPointY.Text, tbInsPointZ.Text,
out insertPoint))
{
insertPoint is safe to use
}