Mi piacerebbe davvero essere in grado di decorare la mia classe con un attributo di qualche tipo che imporrebbe l'uso di un'istruzione using in modo che la classe sia sempre disposta in modo sicuro ed evitare perdite di memoria. Qualcuno sa di una tale tecnica?È possibile imporre l'uso di un'istruzione using in C#
risposta
Bene, c'è un modo in cui è possibile farlo: consentire l'accesso al proprio oggetto solo tramite un metodo statico che accetta un delegato. Come esempio molto semplificato (come ovviamente ci sono molti modi diversi di apertura di un file - lettura/scrittura, ecc):
public static void WorkWithFile(string filename, Action<FileStream> action)
{
using (FileStream stream = File.OpenRead(filename))
{
action(stream);
}
}
Se le uniche cose capaci di creare un'istanza del vostro oggetto usa e getta sono metodi all'interno del tuo classe, puoi assicurarti che si abituino in modo appropriato. Certo, non c'è nulla che impedisca al delegato di prendere una copia del riferimento e provare a usarlo più tardi, ma non è proprio lo stesso problema.
Questa tecnica limita fortemente ciò che si può fare con il proprio oggetto, ovviamente - ma in alcuni casi può essere utile.
Mi sono sentito un po 'sporco a fare qualcosa di simile a questo.* si sente meglio ora ha approvazione Skeet * –
Questo non è un modello "nuovo" con qualsiasi mezzo - non che io possa ricordare il nome adesso ... –
È possibile utilizzare FxCop per applicare questa regola. Vedi la Wikipedia per un quick overview.
Non aiuta quando le persone usano * le sue classi - non può dire ai suoi utenti di usare FxCop – ChrisF
Buon punto. Ma questo è il loro problema ...: D –
Fallo diventare parte della build e devi prestare attenzione ad esso. –
Se si desidera garantire che l'oggetto sia sempre disposto, utilizzare un finalizzatore in combinazione con IDisposable.
Ma prima di farlo, leggere su IDisposable e finalizzatori ed essere consapevoli del fatto che normalmente non sono necessari a meno che la classe non stia facendo qualcosa come gestire la durata di una risorsa non gestita.
Con un finalizzatore, il tuo oggetto verrà recuperato "alla fine", sia che venga incluso in un utilizzo o meno. L'istruzione using, che è una convenienza per IDisposable, consente la pulizia deterministica. L'unica avvertenza è che l'oggetto con i finalizzatori è più costoso da pulire e in generale rimane più a lungo in memoria mentre attendono la finalizzazione.
rif When do I need to implement a finalizer or IDisposable? o technorabble: Using Dispose, Finalizers and IDisposable
- 1. È possibile imporre il comportamento di sola lettura con SqlCommand?
- 2. Imporre fase di compilazione constexpr
- 3. C# trayicon using wpf
- 4. C# using statement
- 5. SOAP using C#
- 6. Qual è l'equivalente del blocco C# "using" in IronPython?
- 7. è possibile usare regex in C++?
- 8. Direttive globali "using" in VS2010/C#?
- 9. "using namespace" nelle intestazioni C++
- 10. Cos'è la direttiva C# "using"?
- 11. preprocessore C: using #if all'interno di #define?
- 12. Impossibile imporre UITextview all'interno di UIPageViewController
- 13. C# using istruzione, SQL e SqlConnection
- 14. direttiva using vs utilizzando dichiarazione di swap in C++
- 15. Posso annullare l'effetto di "using namespace" in C++?
- 16. Equivalente alla parola chiave "using" di C# in powershell?
- 17. È possibile "concatenare" EventHandlers in C#?
- 18. È possibile sovraccaricare gli operatori in C?
- 19. È possibile disattivare lo stderr in C++?
- 20. È possibile estendere gli array in C#?
- 21. È possibile? GUI in C#, app in C++
- 22. È possibile avvolgere C enums in Rust?
- 23. È possibile sovrascrivere un costruttore in C#?
- 24. Alternative alla parola chiave direttiva "using" in C#?
- 25. WPF con C++, è possibile?
- 26. C++ Posizione corretta per 'using namespace'
- 27. È possibile disambiguare il nome del tipo in conflitto nella dichiarazione using?
- 28. L'istruzione using C# esegue try/finally?
- 29. Non è possibile utilizzare riferimento DLL in C#
- 30. Python equivalente a C# s 'istruzione using
Che dire di incorporare l'oggetto in un oggetto usa e getta diverso? –
Decorare la classe con IDisposable è inteso come la bandiera per i consumatori della tua classe che dovrebbero essere inclusi in un Uso o chiamare Dispose. Se applichi la tecnica "Utilizzo", stai effettivamente dicendo ai tuoi buoni consumatori "Penso che tu sia troppo spesso per chiamare Dispose" e limitare l'uso. –
Volevo anche dire, sei sicuro che non ci sono scenari in cui qualcuno potrebbe voler creare il tuo oggetto in un metodo e smaltirlo in un altro? (Forse sono anche identificabili). Stai rendendo impossibile per qualcuno farlo. –