我有一个按钮:
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = "x12y04";
//make new instance for MyMath class
MyMath dRet01 = new MyMath();
//use the doubleArrayXY (in MyMath class) to get doubble array back
double[] retD = dRet01.doubleArrayXY(s);
//use the calcResultFromDoubleArray (in MyMath class) to get result
MyMath dRet02 = new MyMath();
double result = dRet02.calcResultFromDoubleArray(retD[0], retD[1]);
//DEBUG!
/*
string TEST1 = Convert.ToString(returnedDouble[0]);
MessageBox.Show(TEST1);
string TEST2 = Convert.ToString(returnedDouble[1]);
MessageBox.Show(TEST2);
string TEST3 = Convert.ToString(result);
MessageBox.Show(TEST3);
*/
}
“MyMath”类是:
public double[] doubleArrayXY(string inputValue)
{
//in case there are upper case letters, set all to lower
string inpLow = inputValue.ToLower();
//split the string on the Y (so this tech should also work for x89232y329)
//so this will create res[0] that is x89232 and an res[1] that is 329
string[] res = inpLow.Split(new string[] { "y" }, StringSplitOptions.None);
//in the first string that looks like x89232, remove the x
string resx = res[0].Replace("x", null);
//now get the x value to a double
double x = double.Parse(resx);
//now get the y valye to a double
double y = double.Parse(res[1]);
//return in a double array the x and then the y (x=double[0] and y=double[1])
return new double[] {x,y};
}
public double calcResultFromDoubleArray(double one, double two)
{
return (one * two);
}
现在我知道类中“calcResultFromDoubleArray”的部分在这一点上是没用的,但是我想稍后做一些额外的事情。
我最想知道的是在我制作这个新dRet10的主代码中,以及后来制作dRet02。
我起初在想我可以做这样的事情:
double result = dRet01.calcResultFromDoubleArray(retD[0], retD[1]);
因此,在这种情况下,我不需要创建MyMath的新实例,但这不起作用。
所以我需要为类调用一个新实例(就像我一样),或者我能以更优雅的方式执行此操作吗? 我仍然是C#的新手,所以我试图学习如何以一种漂亮而优雅的方式编程,除了让它工作。
答案 0 :(得分:5)
由于您的方法除了传递的参数之外没有真正使用任何其他状态信息,因此它们可能应该是static
,因此您根本不必创建任何类的实例:
double[] retD = MyMath.DoubleArrayXY(s);
double result = MyMath.CalcResultFromDoubleArray(retD[0], retD[1]);
如果MyMath
中的所有方法都是静态的,请将类本身声明为静态 - 就像System.Math
类一样,因此根本无法创建实例。
答案 1 :(得分:1)
您可以制作calcResultFromDoubleArray
方法static
,然后通过MyMath.calcResultFromDoubleArray(val1, val2)
答案 2 :(得分:0)
在您的代码中,没有创建MyMath类实例的重点。您可以将方法设为静态
public static double[] doubleArrayXY(string inputValue) { ... }
public static double calcResultFromDoubleArray(double one, double two) { ... }
并像这样打电话给他们
double[] retD = MyMath.doubleArrayXY(s);
double result = MyMath.calcResultFromDoubleArray(retD[0], retD[1]);
答案 3 :(得分:0)
如果您将方法设为静态,则可以在主类中执行以下操作:
double result = MyMath.calcResultFromDoubleArray(MyMath.doubleArrayXY(s));
更改calcResultFromDoubleArray
以获取数组而不是两个值(如标题所示)。
仅供参考,您还可以链接String
操作,因为他们会返回Strings
:
string[] res = inputValue.ToLower().Split(new string[] { "y" }, StringSplitOptions.None);
无需创建double x
和double y
。将方法的最后一部分更改为:
return new double[] {double.Parse(resx), double.Parse(res[1]};
虽然这些变化(有更多,通常有)将是性能的最小增加,但它们会增加一点(静态部分中的最多 - new
相对昂贵)。
最重要的是,它们使代码更具可读性和优雅性。
答案 4 :(得分:0)
在我看来,MyMath上的两个方法可能(或可能应该)都是静态的,因为它们在方法之外根本不依赖任何东西。数学图书馆就是这种情况。似乎其他人也说了这个。
此外,您最好创建一个类或结构来表示您的X / Y.它可能是不合适的,但如果它代表一个东西,那么你可能想要一个类来代表那个东西。例如,参见Point和PointF类。我建议其中一个,但它们没有你使用的相同精度(你的X / Y可能不是点,所以它可能不合适)
你说的那条线也行不通:
double result = dRet01.calcResultFromDoubleArray(retD[0], retD[1]);
这应该与所示的代码一起使用。你得到了什么错误? dRet01存在,因此它应该与创建新实例一样有效。它应该是静态的评论是最适用的,但如果你是C#的新手,我认为值得指出这一点,所以你不会对什么是不可能的东西建立任何错误的想法。 :)