2016-04-14 28 views
3

私は古いVBプロジェクトで作業しており、C#に書き直しています。返品のない機能 - この機能はどのように機能しますか?

私は機能について知っているものに合わないいくつかの行があります。私はMSDNを読んでいる限り、私が理解している限り、関数はReturnまたはExitでなければなりません。そうでなければ、データをByRefに送ることができます。

この関数はこれらのいずれも持っていませんが、まだ何かをすることになっています。もしそうでなければ、プログラムはうまくいくとは思えません。

また、それ自体が呼び出しているようですが、オーバーロードがあります。しかし私は知らない、それは私にとってはあまりにも奇妙である。

機能自体:

Private Function f(ByVal numero As Double) As String 
    Dim intermedio As Double 
    intermedio = numero * Factor 
    If intermedio - Int(intermedio) = 0 Then 

     f = Format(intermedio, "0") 
    Else 
     f = Format(intermedio, "###0.0######") 
    End If 
    'f = Format(intermedio, "0.00000E+000") 
    f = Replace(f, ",", ".") 
    'f = Str(numero) 
End Function 

変動要因は、コードのどこかに定義され、それはですされています

double Factor = 1; 

その関数の呼び出し:

For Y = 0 To MaxY - 1 
    X0 = X 
    X1 = X + 1 
    Y0 = Y 
    Y1 = Y + 1 
    Z00 = a(X0, Y0) 
    Z01 = a(X0, Y1) 
    Z10 = a(X1, Y0) 
    Z11 = a(X1, Y1) 
    Normal(X1 - X0, Y1 - Y0, Z11 - Z00, X1 - X0, 0, Z10 - Z00) 

    objWriter.WriteLine(" facet normal " & f(i) & " " & f(j) & " " & f(k)) 
    objWriter.WriteLine(" outer loop") 
    objWriter.WriteLine("  vertex " & f(X) & " " & f(Y) & " " & f(a(X, Y))) 
    objWriter.WriteLine("  vertex " & f(X + 1) & " " & f(Y + 1) & " " & f(a(X + 1, Y + 1))) 
    objWriter.WriteLine("  vertex " & f(X + 1) & " " & f(Y) & " " & f(a(X + 1, Y))) 
    objWriter.WriteLine(" endloop") 
    objWriter.WriteLine(" endfacet") 

    Normal(0, Y1 - Y0, Z01 - Z00, X1 - X0, Y1 - Y0, Z11 - Z00) 

    objWriter.WriteLine(" facet normal " & f(i) & " " & f(j) & " " & f(k)) 
    objWriter.WriteLine(" outer loop") 
    objWriter.WriteLine("  vertex " & f(X) & " " & f(Y) & " " & f(a(X, Y))) 
    objWriter.WriteLine("  vertex " & f(X) & " " & f(Y + 1) & " " & f(a(X, Y + 1))) 
    objWriter.WriteLine("  vertex " & f(X + 1) & " " & f(Y + 1) & " " & f(a(X + 1, Y + 1))) 
    objWriter.WriteLine(" endloop") 
    objWriter.WriteLine(" endfacet") 

Next Y 
+3

関数(f)の名前を値で設定すると、関数はその値を返します。古いVB6残っていると思う – Steve

答えて

8

ビジュアルで基本的に、関数自体の名前は関数内で使用できる変数になります。関数の最後には、明示的なReturnステートメントが使用されていない限り、その中に残っているものが戻り値として使用されます。

あなたのケースでは、全体でfが使用されています。 MSDNを引用

終了関数戻る文は機能手順からの即時終了を引き起こします。 終了関数戻る文の任意の数の手順のどこにでも現れることができ、あなたは終了関数リターン文を混在させることができます。

あなたは名前に値を割り当てずに終了関数を使用する場合は、手順は戻り値ので指定のデータ型のデフォルト値を返します。 returntypeが指定されていない場合、プロシージャはNothingを返します。オブジェクトのデフォルト値です。

+0

ええ、ちょうど私が読んだが、私の小さな英語のlenguajeの知識は、最初の読んで、一度私はMSDNでそれをより明確に見ることができる答えを知っていた –

2
f = Replace(f, ",", ".") 

あなたの関数の名前はfで、(名前が同じであるため)このローカル変数はあなた返される値です。は自動的に動作します。スティーブおよびその他多くの

1
のC#で

private string f(double numero) 
{ 
    string functionReturnValue = null; 
    double intermedio = 0; 
    intermedio = numero * Factor; 

    if (intermedio - Conversion.Int(intermedio) == 0) { 
     functionReturnValue = Strings.Format(intermedio, "0"); 
    } else { 
     functionReturnValue = Strings.Format(intermedio, "###0.0######"); 
    } 
    //f = Format(intermedio, "0.00000E+000") 
    functionReturnValue = Strings.Replace(f(), ",", "."); 

    //f = Str(numero) 
    return functionReturnValue; 
} 

関数と変数の変数が返され、同じ名前が付けられている場合のC#で... VBで述べてきた中で、Fの代わりにfunctionReturnValueを追加関数を呼び出して返します。

+0

うわー、試して –

関連する問題