2016-11-19 1 views
1

golang support 'Différer appel' et quand C++, j'utilise cette astuce (?).C#, y a-t-il 'Defer Call' comme golang?

struct DeferCall 
{ 
    DeferCall() {} 
    ~DeferCall() { doSomeThing(); } 
} 

void SomeMethod() 
{ 
    DeferCall deferCall; 
    ... 
} 

Comment puis-je faire cela en C#?

J'ai besoin comme ça golang defer tutorial

+2

Quel est le but de l'appel defer, ici, il continuera plus tard poster un autre action? –

+0

Bien que l'astuce puisse éventuellement être utilisée à plusieurs fins, le nettoyage pour lequel elle est souvent utilisée en C# est implémenté avec une interface explicite 'IDisposable'. –

+0

S'il vous plaît noter @WiktorZychla point est très important, dans C# nettoyage peut avoir besoin d'un finaliseur qui nettoie automatiquement, si l'utilisateur ne parvient pas à appeler explicitement la méthode Dispose, donc vous ne pouvez rien faire à cet égard en C#, il nettoiera –

Répondre

-2

Je repris la définition suivante du Defer Call dans GoLang de here

Une déclaration defer pousse un appel de fonction sur une liste. La liste des appels enregistrés est exécutée après le retour de la fonction environnante. Différer est couramment utilisé pour simplifier les fonctions qui effectuent diverses actions de nettoyage.

version C#:

Option 1:

  • utiliser une API Task
  • Enveloppez votre méthode DeferCall dans le Task
  • Exécuter au bon moment soit manuellement Méthode Start() ou pour le poste de fonction que vous voulez continute, envelopper que dans un autre objet de la tâche et d'exécuter en utilisant l'API ContinueWith, qui tâches de la chaîne pour exécuter un après l'autre

Option 2:

  • peut faire toute la chaîne d'appel Async-Await , où tout post await mot-clé est exécuté l'appel principal fin, c'est la norme d'implémentation asynchrone
+0

Les tâches ne sont pas une option ici. "La liste des appels enregistrés est exécutée après le retour de la fonction environnante". Les tâches ne se comportent pas comme ça. – Dennis

+0

Pourquoi Task ne fonctionnerait pas comme ceci, vous pouvez certainement les exécuter une fois un appel renvoyé, juste qu'il doit être explicitement exécuté, en utilisant 'Start' ou' ContinueWith', pas une continuation implicite comme 'Async-Await' –

+0

Qui donc jamais downvote, s'il vous plaît fournir une raison claire, de sorte que je peux comprendre et faire la correction –

6

La langue la plus proche equiva prêtées sera try-finally:

try 
{ 
    DoSomething(); 
} 
finally 
{ 
    DoCleanup(); 
} 

L'équivalent-cadre le plus proche sera IDisposable + using:

using (var stream = File.OpenRead("foo.txt")) 
{ 
    // do something 
} 

Personnellement, defer terme me confond, puisque ce n'est pas "exécution différée" (calendrier maintenant - exécuter plus tard, ce qui pourrait être mis en œuvre via des tâches), mais une sorte d'implémentation RAII.

P.S. En supposant que vous continuerez à apprendre golang:

  • panic équivalent est throw
  • recover équivalent est catch
+0

'utiliser 'était la première chose qui me vint à l'esprit. Il a été fait pour à peu près les mêmes scénarios que les destructeurs C++ et (je suppose) Go appels de report ont été créés pour. –