2009-11-20 4 views
2

Est-il possible de traduire le code C# suivant en VB.NET, en utilisant VB 9.0?Quel est l'équivalent VB de cette syntaxe C#, traitant des délégués?

delegate Stream StreamOpenerDelegate(String name); 

void Exec1() 
{ 
    WorkMethod(x => File.OpenRead(x)); 
} 

void Exec2() 
{ 
    StreamOpenerDelegate opener = x => return File.OpenRead(x) ; 
    WorkMethod(opener); 
} 

Puis-je faire quelque chose comme ça ?:

Private Delegate Function StreamOpenerDelegate(ByVal name As String) As Stream 

Private Sub WorkMethod(ByVal d As StreamOpenerDelegate) 
    '' 
End Sub 

Private Sub Exec1() 
    Me.WorkMethod(Function (ByVal x As String) 
     Return File.OpenRead(x) 
    End Function) 
End Sub 

Private Sub Exec2() 
    Dim opener As StreamOpenerDelegate = Function (ByVal x As String) 
     Return File.OpenRead(x) 
    End Function 
    Me.WorkMethod(opener) 
End Sub 

Je suis en train d'écrire de la documentation, mais je ne sais pas la syntaxe VB. Souvent, j'utilise Reflector pour le traduire, mais je ne suis pas sûr que cela fonctionne dans ce cas. Je ne suis pas clair sur où j'aurais besoin de caractères de continuation de ligne.


RÉPONSE
Dans VB9, il est impossible d'avoir lambdas plusieurs lignes (ou sous lambdas, que je ne l'ai pas poser des questions sur). Dans VB9, tous les lambdas renvoient une valeur et doivent être une seule expression. Cela change dans VB10. VB10 autorisera la syntaxe ci-dessus, mais pas VB9. En VB9, si la logique implique plusieurs lignes de code, elle ne doit pas être un lambda; vous devez le mettre dans une fonction nommée et le référencer explicitement. Comme ceci:

Private Delegate Function StreamOpenerDelegate(ByVal name As String) As Stream 

Private Sub WorkMethod(ByVal d As StreamOpenerDelegate) 
    '' 
End Sub 

Function MyStreamOpener(ByVal entryName As String) As Stream 
    '' possibly multiple lines here 
    Return File.OpenRead(entryName) 
End Function 

Private Sub Exec1() 
    Me.WorkMethod(AddressOf MyStreamOpener) 
End Sub 

site: Mike McIntyre's blog

+0

Eh bien, je ne pouvais pas faire plus que de demander à Reflector ici aussi. Et c'est assez bon pour traduire des syntaxes :-) – Joey

Répondre

2

Cela devrait fonctionner:

Private Sub Exec1() 
    Me.WorkMethod(Function (x) File.OpenRead(x)) 
End Sub 

Private Sub Exec2() 
    Dim opener As StreamOpenerDelegate = Function (x) File.OpenRead(x) 

    Me.WorkMethod(opener) 
End Sub 

Vous avez besoin du caractère de continuation de ligne pour diviser une déclaration unique en plusieurs lignes, comme ceci:

Private Sub Exec1() 
    Me.WorkMethod(Function (x) _ 
        File.OpenRead(x)) 
End Sub 

Private Sub Exec2() 
    Dim opener As StreamOpenerDelegate = Function (x) _ 
              File.OpenRead(x) 

    Me.WorkMethod(opener) 
End Sub 

Dans tous les cas, dans VS2010 il y a continuation de ligne implicite après certains caractères. Donc je ne m'en inquiéterais pas trop.