2012-01-11 15 views
0

私はボタンでこれを持っている:C#このコードを最適化できますか?

クラス「MyMath」は
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); 
    */ 


} 

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

:誰かがこの-1をわずか数分で投票する理由を理解していません... – Dante1986

+0

メソッドオーバーロードを見ていますか? – MethodMan

+0

私はC#を勉強していて、私が今作ったこのコードがそれを作る正しい方法であったかどうか、ちょうどそれがうまく働いているのかどうか疑問に思っていました。 (なぜ私も人々がstackoverflowでそれを投票したい理由はない...) – Dante1986

答えて

5

パラメータは、彼らはおそらくあなたがすべてであなたのクラスのインスタンスを作成する必要はありませんstaticあるべき渡さ以外にも、あなたの方法は、実際に他の状態情報を使用していないので:

double[] retD = MyMath.DoubleArrayXY(s); 
double result = MyMath.CalcResultFromDoubleArray(retD[0], retD[1]); 

のすべての場合MyMathのメソッドは静的で、System.Mathクラスのようにクラス自体を静的宣言しているため、インスタンスを作成することはできません。

+0

ahaaaはい私は今理解しています。 (静的について私の本の読者を読んだ後)。どうもありがとう! – Dante1986

1

あなたのcalcResultFromDoubleArray方法staticを行い、その後、MyMathクラスのインスタンスを作成するためのポイントは、実際に存在していないあなたのコードではMyMath.calcResultFromDoubleArray(val1, val2)

0

を経由して、それを呼び出すことができます。あなたは

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]); 
0

のようにそれらを呼び出すことができます。

double result = MyMath.calcResultFromDoubleArray(MyMath.doubleArrayXY(s)); 

と変更calcResultFromDoubleArrayは、2つの値ではなく配列を取ることができます(タイトルに示されているように)。

string[] res = inputValue.ToLower().Split(new string[] { "y" }, StringSplitOptions.None); 

必要はdouble xdouble y作成するには:彼らのようなStringsを返すため

はFYIあなたもString操作をチェーンすることができます。メソッドの最後の部分を次のように変更します

return new double[] {double.Parse(resx), double.Parse(res[1]}; 

一方でこのような変化(多くの場合がありますされている)、パフォーマンスの最小限の増加となり、彼らはそれを少し(から最も増加します静的部分 - newは比較的高価です)。

しかし、最も重要なのは、コードをより読みやすくエレガントにすることです。

0

MyMathの2つのメソッドは、メソッドの外側にまったく依存しないので、どちらも静的である可能性があります。かなり頻繁にこれは数学ライブラリのようなものの場合です。しかし、他の人もこれを言っているようです。

さらに、X/Yを表すクラスまたは構造体を作成する方がよい場合があります。それは適切ではないかもしれませんが、それが物事を表しているならば、あなたはそのクラスを表現することを望むかもしれません。たとえば、PointクラスとPointFクラスを参照してください。私はこれらの1つをお勧めしますが、使用しているのと同じ精度を持っていません(X/Yが適切でないかもしれないので、適切ではないかもしれません)。

また、 :

double result = dRet01.calcResultFromDoubleArray(retD[0], retD[1]); 

これは、次のコードで動作するはずです。あなたはそれにどんなエラーを抱えていましたか? dRet01が存在するので、新しいインスタンスを作成するだけでなく、うまく機能するはずです。静的でなければならないコメントが最も適切ですが、C#を初めてお使いの方は、これを指摘する価値があると思っています。 :)

関連する問題