
рдмрд╣реБ рд╕реВрддреНрд░рдг
рдЕрдм рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдкрддрд▓реА рдмрд░реНрдл рдХреАред рдЖрдИрдбреАрд╕реЙрдкреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдЦрдВрдбреЛрдВ рдореЗрдВ рд╣рдордиреЗ рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдЫреБрдЖ рд╣реИ рдЬреЛ рди рдХреЗрд╡рд▓ рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рдмрд▓реНрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд╕реНрддреБ рдХреА рдЕрдЦрдВрдбрддрд╛ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдордп рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рдХреНрд░рд┐рдпрд╛ рдЙрд╕рдХреЗ рд░рд╛рдЬреНрдп рдХреЛ рдЙрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдмрджрд▓ рджреЗрддреА рд╣реИ рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рдкреВрд░реНрд╡-рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдереЗред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЗрд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╡реЗ рдзрд╛рдЧрд╛-рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдПрдХ рдореМрдХрд╛ рд╣реИ рдХрд┐ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддрд░реАрдХреЛрдВ рдХреЛ рддрдм рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рд╡рд┐рдирд╛рд╢ рдЬрд╛рд░реА рд╣реИред рдЖрдЗрдП рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдВ рдФрд░ рддрдп рдХрд░реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рдЕрдзреНрдпрд╛рдп рд░реВрд╕реА рд╕реЗ рд╕рдВрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рдФрд░ рдкреЗрд╢реЗрд╡рд░ рдЕрдиреБрд╡рд╛рджрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рдЖрдк рд░реВрд╕реА рдпрд╛ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореБрдЦреНрдпрддрдГ рдЪреАрдиреА рдпрд╛ рдЬрд░реНрдорди рдореЗрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рд╣рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдЧрд┐рддреБрдм рдкрд░ рдПрдХ рд╕реНрдЯрд╛рд░ рджреЗрдирд╛ рд╣реИ рдпрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдлреЛрд░реНрдХ рдХрд░рдирд╛ рд╣реИ
github / sidristij / dotnetbook ред
public class FileWrapper : IDisposable { IntPtr _handle; bool _disposed; object _disposingSync = new object(); public FileWrapper(string name) { _handle = CreateFile(name, 0, 0, 0, 0, 0, IntPtr.Zero); } public void Seek(int position) { lock(_disposingSync) { CheckDisposed(); // Seek API call } } public void Dispose() { lock(_disposingSync) { if(_disposed) return; _disposed = true; } InternalDispose(); GC.SuppressFinalize(this); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private void CheckDisposed() { lock(_disposingSync) { if(_disposed) { throw new ObjectDisposedException(); } } } private void InternalDispose() { CloseHandle(_handle); } ~FileWrapper() { InternalDispose(); } /// other methods }
_disposed
() рдореЗрдВ _disposed
рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдХреЛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкреВрд░реЗ рдХреЛрдб рдХреЛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕рдорд╡рд░реНрддреА рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдирд╛рд╢ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕рдорд╡рд░реНрддреА рдкрд╣реБрдВрдЪ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ рд▓рд╛рддрд╛ рд╣реИ рдЬреЛ рдЯрд╛рдЗрдордмреЙрдореНрдм рдмрди рдЬрд╛рддреА рд╣реИрдВ:
- рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡рд┐рдирд╛рд╢ рдХрд╛ рдЧрд╣рди рдЙрдкрдпреЛрдЧ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрдЧрд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рддрд╛рд▓рд╛ рд▓реЗрдиреЗ рдореЗрдВ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕ рд╕рдордп рдХреЛ рд╕рд┐рдВрдХрдмреНрд▓реЙрдХрдЗрдВрдбреЗрдХреНрд╕ рдЯреЗрдмрд▓ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛, рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдФрд░ рдХрдИ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рд╣рдо рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдЙрдирд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗ)ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЬреАрд╡рди рднрд░ "рдЕрдВрддрд┐рдо рдореАрд▓" рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рднрд░ рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рддреНрдпрд╛рдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
- рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдЯреНрд░реИрдлрд╝рд┐рдХред
- рдЕрддрд┐рд░рд┐рдХреНрдд рдХрджрдо рдЬреАрд╕реА рдХреЛ рдПрдХ рд╡рд╕реНрддреБ рдЧреНрд░рд╛рдл рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдм, рджреВрд╕рд░реА рдФрд░, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдХрд╛ рдирд╛рдо рджреЗрдВред рд╣рдо рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд╡рд┐рдирд╛рд╢ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реА рд╕рдордп рдЗрд╕рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣рдо рдХреНрдпрд╛ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ? рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛? рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ Dispose рдкрд╣рд▓реЗ рдЪрд▓рддрд╛ рд╣реИ, рддреЛ ObjectDisposedException
рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрдпреЛрдЧ рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ ObjectDisposedException
рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдбрд┐рд╕реНрдкреЛрдЬрд╝ () рдХреЙрд▓ рдФрд░ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреНрдп рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рд░реНрд╡рд┐рд╕ рд╕рд╛рдЗрдб, рдпрд╛рдиреА рдЙрд╕ рдХреЛрдб рдХреЗ рдмреАрдЪ FileWrapper
рдЬреЛ FileWrapper
рд╡рд░реНрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг FileWrapper
ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдмрдирд╛рдиреЗ рд╡рд╛рд▓рд╛ рдкрдХреНрд╖ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдХрдм рдирд╖реНрдЯ рдХрд░реЗрдЧрд╛ред рджреВрд╕рд░реА рдУрд░, рдПрдХ рдбрд┐рд╕реНрдкреЛрдЬрд╝ рдХреЙрд▓ рдореЗрдВ рдХреЗрд╡рд▓ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ OutOfMemoryException
, рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП IOException рдирд╣реАрдВред рдЗрд╕рдХреА рд╡рдЬрд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдИрдбреАрд╕реЛрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧреЛрдВ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрджрд┐ рдПрдХ рдмрд╛рд░ рдореЗрдВ if(_disposed) return;
рдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдереНрд░реЗрдб рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдПрдВрдЯрд┐рдЯреА рдХрд╛ рд╡рд┐рдирд╛рд╢ рдПрдХ рд╕рд╛рде рджреЛ рдереНрд░реЗрдбреНрд╕ рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рд╣рдо if(_disposed) return;
рдХреА рдЬрд╛рдВрдЪ рдЫреЛрдбрд╝ рджреЗрддреЗ if(_disposed) return;
)ред рдпрд╣ рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ: рдпрджрд┐ рдХреЛрдИ рд╕рдВрд╕рд╛рдзрди рдХрдИ рдмрд╛рд░ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рддреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдиреНрдпрдерд╛, рд╕реБрд░рдХреНрд╖рд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
// I don't show the whole pattern on purpose as the example will be too long // and will not show the essence class Disposable : IDisposable { private volatile int _disposed; public void Dispose() { if(Interlocked.CompareExchange(ref _disposed, 1, 0) == 0) { // dispose } } }
рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓ рдбрд┐рдЬрд╝рд╛рдЗрди рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рджреЛ рд╕реНрддрд░
IDisposable
рдХреЛ рд▓рд╛рдЧреВ IDisposable
рд▓рд┐рдП рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреИрдЯрд░реНрди рдХреНрдпрд╛ рд╣реИ рдЬреЛ рдЖрдк .NET рдкреБрд╕реНрддрдХреЛрдВ рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдореЗрдВ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ? рд╕рдВрднрд╛рд╡рд┐рдд рдирдИ рдиреМрдХрд░реА рдХреЗ рд▓рд┐рдП рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреЗ рджреМрд░рд╛рди рдЖрдкрд╕реЗ рдХреНрдпрд╛ рдкреИрдЯрд░реНрди рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ? рд╕рдмрд╕реЗ рд╢рд╛рдпрдж рдпрд╣ рдПрдХ:
public class Disposable : IDisposable { bool _disposed; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if(disposing) { // here we release managed resources } // here we release unmanaged resources } protected void CheckDisposed() { if(_disposed) { throw new ObjectDisposedException(); } } ~Disposable() { Dispose(false); } }
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ рдФрд░ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕рднреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреИрдЯрд░реНрди рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХрд╛ рд╕рд░реНрд╡рд╡реНрдпрд╛рдкреА рдЙрдкрдпреЛрдЧ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рд╢реИрд▓реА рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд▓рдЧрднрдЧ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ рдЬреЛ рдкреИрдЯрд░реНрди рдХрд╛ рдЖрдзрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рде рдкреНрд░рдмрдВрдзрд┐рдд рдФрд░ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рджреЛрдиреЛрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╡рд┐рднрд╛рдЬрди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЧрд▓рдд рд╣реИред рдЖрдЗрдП рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рджреЗрдЦреЗрдВред рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓ рдбрд┐рдЬрд╛рдЗрди рд╕рд┐рджреНрдзрд╛рдВрдд ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
рдирд┐рдкрдЯрд╛рди рдХреЛ рд╡рд░реНрдЧреЛрдВ рдХреЗ рджреЛ рд╕реНрддрд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- рд╕реНрддрд░ 0 рдкреНрд░рдХрд╛рд░ рд╕реАрдзреЗ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХреВрдЯрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ
- рд╡реЗ рдпрд╛ рддреЛ рд╕рд╛рд░ рд╣реИрдВ рдпрд╛ рдкреИрдХ рд╣реИрдВред
- рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
- PrePrepareMethod, рддрд╛рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╡рд┐рдзрд┐ рд╕рдВрдХрд▓рд┐рдд рдХреА рдЬрд╛ рд╕рдХреЗ
- SecuritySafeCritical рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП, рдХреЛрдб рд╕реЗ рдХреЙрд▓ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП
- рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛рдХрдВрдЯреНрд░реЗрдХреНрдЯ (рд╕рдВрдЧрддрд┐ редillNotCorruptState, Cer.Success / MayFail)] CER рдХреЛ рдПрдХ рд╡рд┐рдзрд┐ рдФрд░ рдЙрд╕рдХреЗ рд╕рднреА рдЪрд╛рдЗрд▓реНрдб рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд░рдЦрд╛ рдЬрд╛рдПред
- рд╡реЗ рд▓реЗрд╡рд▓ 0 рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди "рдЕрдВрддрд┐рдо рдореАрд▓" рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд╕рд╣реА рдХреНрд░рдо рдХреА рдЧрд╛рд░рдВрдЯреА рдХреЗ рд▓рд┐рдП рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдмрдврд╝рд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рд╕реНрддрд░ 1 рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рддрд╛ рд╣реИ
- рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рд▓реЗрд╡рд▓ 1 рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдпрд╛ рд╕реАрдзреЗ рдЖрдИрдбреАрдЖрдИрд╕реЛрдкрд╛рдпрд░реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
- рд╡реЗ рд▓реЗрд╡рд▓ 0 рдкреНрд░рдХрд╛рд░ рдпрд╛ CriticalFinalizerObject рдХрд╛ рд╡рд╛рд░рд┐рд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
- рд╡реЗ рд▓реЗрд╡рд▓ 1 рдФрд░ рд▓реЗрд╡рд▓ 0 рдкреНрд░рдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
- рд╡реЗ IDisposable рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕реНрддрд░ 0 рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдПрдиреНрдХреИрдкреНрд╕реБрд▓реЗрдЯреЗрдб рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░рдХреЗ рдФрд░ рд╕реНрддрд░ 1 рдкрд░ рдЬрд╛рдХрд░
- рд╡реЗ рдПрдХ рдлрд╛рдЗрдирд▓ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рдирд┐рдкрдЯрддреЗ рдирд╣реАрдВ рд╣реИрдВ
- рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╕рдВрдкрддреНрддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕реНрддрд░ 0 рдкреНрд░рдХрд╛рд░ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред
рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╢реБрд░реВ рд╕реЗ рд╣реА рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛: рдПрдХ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрди рдФрд░ рдПрдХ рдорд╛рдирд╡ рд░рд╣рд┐рдд рд╕рдВрд╕рд╛рдзрди рд╣реЛрддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдбрд┐рд╕реНрдкреЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЗ
рдЖрдЗрдбреАрдЖрдпреЛрдбреАрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдкреАрдЫреЗ рд╡рд┐рдЪрд╛рд░ рдорд╛рдирд╡ рд░рд╣рд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЬрд╛рд░реА рдХрд░рдирд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдХрдИ рдЕрдиреНрдп рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдпрд╣ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬреИрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдЬрд╛рд░реА рдХрд░рдирд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрди рдЬрд╛рд░реА рдХрд░рдирд╛ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рдирд╣реАрдВ рд▓рдЧрддрд╛ред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реА / рд╕реА ++ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрд╕реНрдХрд░рд╛рд╣рдЯ рдХреЗ рд╕рд╛рде рдЖрд░рд╛рдо рдХрд░реЗрдВрдЧреЗ, рд╣реИ рдирд╛? рд╣рд╛рд▓рд╛рдБрдХрд┐, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рд╣рдореЗрд╢рд╛ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рд╕рдВрджрд░реНрдн рдЦреЛ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдпрд╣ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ: рдЬреАрд╕реА рдХрдЪрд░рд╛ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕реНрдореГрддрд┐ рдмрдврд╝рддреА рд╣реИред рд╣рдо рд╕реНрдореГрддрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЖрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдФрд░ рдЗрд╕ рд╡рд╕реНрддреБ рдХреЛ рд░рдЦрддрд╛ рд╣реИред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ .NET рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдФрд░ рдмрд╛рд╣рд░реА рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рджреЛрдиреЛрдВ рдореЗрдВ рдЖрдкрдХреА рдЗрдХрд╛рдИ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдирд┐рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдХрдмреНрдЬрд╛ рдирд┐рд╣рд┐рдд рд╣реИ, рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЕрдкрдиреА рд░рд┐рд▓реАрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдпрд╛рдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдПрдХ рдореЗрдореЛрд░реА рд▓реАрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рддрд┐рдирд┐рдзрд┐, рдШрдЯрдирд╛рдПрдБ
рдЖрдЗрдП рдЗрд╕ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ:
class Secondary { Action _action; void SaveForUseInFuture(Action action) { _action = action; } public void CallAction() { _action(); } } class Primary { Secondary _foo = new Secondary(); public void PlanSayHello() { _foo.SaveForUseInFuture(Strategy); } public void SayHello() { _foo.CallAction(); } void Strategy() { Console.WriteLine("Hello!"); } }
рдпрд╣ рдХреЛрдб рдХрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ? рджреНрд╡рд┐рддреАрдпрдХ рд╡рд░реНрдЧ рд╕реНрдЯреЛрд░ Action
рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ _action
рдлрд╝реАрд▓реНрдб рдореЗрдВ _action
рдЬрд┐рд╕реЗ SaveForUseInFuture
рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ SaveForUseInFuture
рд╣реИред рдЕрдЧрд▓рд╛, Primary
рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрджрд░ PlanSayHello
рдкрджреНрдзрддрд┐, Secondary
рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП Strategy
рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ рдХреЛ рдкрд╛рд╕ рдХрд░рддреА рд╣реИред рдпрд╣ рдЙрддреНрд╕реБрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк рдХрд╣реАрдВ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдпрд╛ рдЖрд╡реГрддреНрддрд┐ рд╡рд┐рдзрд┐ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ SaveForUseInFuture
рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди Primary
рд╡рд░реНрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдмрд╛рд╣реНрдп рд░реВрдк рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдирд┐рд░реНрджреЗрд╢ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╡рд┐рдзрд┐ рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рди рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдзрд┐ рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдХреЙрд▓рд┐рдВрдЧ рдкрд╛рд░реНрдЯреА рдХреЛ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрд┐рд╕ рд╡рд░реНрдЧ рдХреЛ рдХрд┐рд╕ рддрд░реАрдХреЗ рд╕реЗ Strategy
рдореЗрдердб рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ! рдпрд╣ Secondary
рд╡рд░реНрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ Primary
рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдорддрд▓рдм рдХреЗрд╡рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо _foo
рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдХрд╣реАрдВ рдФрд░ рдкрд╛рд╕ _foo
рдФрд░ Primary
рдХрд╛ рд╕рдВрджрд░реНрдн рдЦреЛ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЬреАрд╕реА Primary
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдХрдЯреНрдард╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ , рдХреНрдпреЛрдВрдХрд┐ Secondary
рдЗрд╕реЗ рдзрд╛рд░рдг рдХрд░реЗрдЧрд╛ред рд╣рдо рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдХреИрд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ? рд╣рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрдн рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдРрд╕рд╛ рддрдВрддреНрд░ рдЬреЛ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ IDisposable
// This is a simplified implementation class Secondary : IDisposable { Action _action; public event Action<Secondary> OnDisposed; public void SaveForUseInFuture(Action action) { _action = action; } public void CallAction() { _action?.Invoke(); } void Dispose() { _action = null; OnDisposed?.Invoke(this); } }
рдЕрдм рдЙрджрд╛рд╣рд░рдг рд╕реНрд╡реАрдХрд╛рд░реНрдп рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдХрд┐рд╕реА рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди _action
рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрд╛ рд╕рдВрджрд░реНрдн рдЦреЛ рдЬрд╛рдПрдЧрд╛, рддреЛ рд╣рдо рдЗрд╕реЗ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ рдФрд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╡рд┐рдирд╛рд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╣рдЯрд╛ рджреЗрдВ ред
рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХрд╛ рджреВрд╕рд░рд╛ рдЦрддрд░рд╛ event
рдХреЗ рдХрд╛рдордХрд╛рдЬ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЙрдирдореЗрдВ рдХреНрдпрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:
// a private field of a handler private Action<Secondary> _event; // add/remove methods are marked as [MethodImpl(MethodImplOptions.Synchronized)] // that is similar to lock(this) public event Action<Secondary> OnDisposed { add { lock(this) { _event += value; } } remove { lock(this) { _event -= value; } } }
C # рдореИрд╕реЗрдЬрд┐рдВрдЧ рдИрд╡реЗрдВрдЯ рдХреЗ рдЗрдирд░рд▓реНрд╕ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрди рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╣реЛрд▓реНрдб рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ event
рдЬрд░рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрд┐рд╕реА рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╡рд╕реНрддреБ рдХрд╛ рд╕рдВрджрд░реНрдн OnDisposed
рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ рдФрд░ рд╡рд╣ рд╡рд╕реНрддреБ рдзрд╛рд░рдг рдХрд░реЗрдЧрд╛ред рдпрд╣ рдПрдХ рдЕрдЬреАрдм рд╕реНрдерд┐рддрд┐ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣рдореЗрдВ "рдЗрд╡реЗрдВрдЯреНрд╕ рд╕реЛрд░реНрд╕" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рд╕реЗ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реА рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЗрд╕ рд╕рд░рдгреА рдХреЗ рдЕрдВрджрд░ рдХреБрдЫ рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрдХрд╛рдИ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣ рд╣реИ рдЗрд╕ рд╕реВрдЪреА рдХреЛ рдПрдХ рдЗрд╡реЗрдВрдЯ рд╕реЛрд░реНрд╕ рдореЗрдВ рдЕрд╢рдХреНрдд рдмрддрд╛рдХрд░ рд╣рдЯрд╛рдирд╛ред
рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ add
/ remove
рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрдерд┐рддрд┐ рдпрд╣рд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИред рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдИрд╡реЗрдВрдЯ рд╕реНрд░реЛрдд рдХреЛ рдЕрд╢рдХреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдИрд╡реЗрдВрдЯ рдХреА рдирд┐рдореНрди рд╕рджрд╕реНрдпрддрд╛ NullReferenceException
рдХрд╛рд░рдг рд╣реЛрдЧреАред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рддрд╛рд░реНрдХрд┐рдХ рд╣реЛрдЧрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдИрд╡реЗрдВрдЯ рдХреЛрдб рд╕рд╛рдлрд╝ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдмрд╛рд╣рд░реА рдХреЛрдб рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИ, рддреЛ рдПрдлрд╕реАрдПрд▓ рдПрдХреНрд╢рди рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕реЗ OnDisposed
рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд OnDisposed
ред рд╕реА # рдореЗрдВ рдпрд╣ рдЧрд╡рд╛рд╣ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЧреБрдорд░рд╛рд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рдЕрд╢рдХреНрдд рдХреНрд╖реЗрддреНрд░реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдВрддрд┐ рдХреЗ рдмрдЬрд╛рдп рд╕рддрд░реНрдХрддрд╛ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рд▓рд╛рдкрд░рд╡рд╛рд╣реА рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддреА рд╣реИред
рд▓рдореНрдмреЛрджрд░ рдмрдВрдж
рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рдирд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЦрддрд░рдирд╛рдХ рд╣реИред
рдореИрдВ рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЪреАрдиреА рдкрд░ рд╕реНрдкрд░реНрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреЗрд╡рд▓ рддрднреА рдЬрдм рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкрддрд╛ рд╣реЛред рд▓реИрдореНрдмреНрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреНрд▓реЛрдЬрд░, рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ рдореЗрдВ рдХреНрд▓реЛрдЬрд░ рдФрд░ рдХрдИ рдЕрдиреНрдп рджреБрдЦ рд╣реИрдВ рдЬреЛ рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдкрд░ рдереЛрдк рд╕рдХрддреЗ рд╣реИрдВред
рдмреЗрд╢рдХ, рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдПрдХ рдХреНрд▓реЛрдЬрд░ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рдВрд╕рд╛рдзрди рд░рд┐рд╕рд╛рд╡ рдХрд╛ рдЦрддрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЗрддрдирд╛ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╣реИ, рдЗрддрдирд╛ рд╕реБрдЦрдж рд╣реИ рдХрд┐ рдкреВрд░реА рд╡рд┐рдзрд┐ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдмрдЪрдирд╛ рдХрдард┐рди рд╣реИ, рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдЙрд╕ рдЬрдЧрд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд╣рд╛рдВ рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдкрдХреЛ рдЗрд╕ рдЙрдХрд╕рд╛рд╡реЗ рдореЗрдВ рдирд╣реАрдВ рдЦрд░реАрджрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рд░ рдХреЛрдИ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:
button.Clicked += () => service.SendMessageAsync(MessageType.Deploy);
рд╕рд╣рдордд рд╣реВрдВ, рдпрд╣ рд░реЗрдЦрд╛ рдмрд╣реБрдд рд╕реБрд░рдХреНрд╖рд┐рдд рджрд┐рдЦрддреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ: рдЕрдм button
рдЪрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрджрд░реНрдн service
рдФрд░ рдЗрд╕реЗ рдзрд╛рд░рдг рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╣рдо рдпрд╣ рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдЕрдм service
рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ button
рдЕрднреА рднреА рд╕рдВрджрд░реНрдн рдХреЛ рдзрд╛рд░рдг рдХрд░реЗрдЧрд╛ рдЬрдмрдХрд┐ рдпрд╣ рдЪрд░ рдЬреАрд╡рд┐рдд рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА Action
( System.Reactive.Disposables
) рд╕реЗ IDisposable
рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП:
// Here we create a delegate from a lambda Action action = () => service.SendMessageAsync(MessageType.Deploy); // Here we subscribe button.Clicked += action; // We unsubscribe var subscription = Disposable.Create(() => button.Clicked -= action); // where it is necessary subscription.Dispose();
рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдереЛрдбрд╝рд╛ рд▓рдВрдмрд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рд╣рдо рд▓рдВрдмреЛрджрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкреВрд░реЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдЦреЛ рджреЗрддреЗ рд╣реИрдВред рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЪрд░ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдЬреА рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рд╕рд░рд▓ рд╣реИред
рдереНрд░реЗрдбрдмреЛрд░реНрдЯ рд╕реБрд░рдХреНрд╖рд╛
рдЬрдм рдЖрдк рдХрд┐рд╕реА рддреГрддреАрдп-рдкрдХреНрд╖ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рд▓рд╛рдпрдмреНрд░реЗрд░реА рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рддреГрддреАрдп-рдкрдХреНрд╖ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдЙрд╕рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдХрднреА-рдХрднреА рдЖрдк рдХреЗрд╡рд▓ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдиреЗ рдЖрдкрдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдерд╛ рдЬреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдмрд╣реБрдЖрдпрд╛рдореА рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрдм рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджрд╛ рдмрди рд╕рдХрддреА рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬрдм рд╣рдо Dispose()
рд╡рд┐рдзрд┐ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ Dispose()
рд╡рд┐рдзрд┐ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рднреА ThreadAbortException
рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдереНрд░реЗрдб рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬрдм ThreadAbortException
рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рднреА рдХреИрдЪ / рдЕрдВрдд рдореЗрдВ рдмреНрд▓реЙрдХ рдХреЛ рд╡реИрд╕реЗ рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреИрдЪ рдХреЗ рдЕрдВрдд рдореЗрдВ / рдереНрд░реЗрдбрдЕрдмреЙрд░реНрдЯ рдЖрдЧреЗ рдмреНрд▓реЙрдХ рд╣реЛрддрд╛ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рдереНрд░реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЖрдкрдХреЛ try { ... } finally { ... }
рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ try { ... } finally { ... }
, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:
void Dispose() { if(_disposed) return; _someInstance.Unsubscribe(this); _disposed = true; }
Thread.Abort
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдИ рднреА рдЗрд╕реЗ рдирд┐рд░рд╕реНрдд рдХрд░ Thread.Abort
ред рдпрд╣ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рдЕрднреА рднреА рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб:
void Dispose() { if(_disposed) return; // ThreadAbortException protection try {} finally { _someInstance.Unsubscribe(this); _disposed = true; } }
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЧрд░реНрднрдкрд╛рдд рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдФрд░ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЪрд▓реЗрдЧрд╛, рднрд▓реЗ рд╣реА Thread.Abort
Unsubscribe
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рджрд┐рдЦрд╛рдИ рджреЗред
рдкрд░рд┐рдгрд╛рдо
рд▓рд╛рдн
рдЦреИрд░, рд╣рдордиреЗ рдЗрд╕ рд╕рд░рд▓ рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд╕реАрдЦрд╛ред рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдЗрд╕рдХреЗ рдлрд╛рдпрджреЗ:
- рдкреИрдЯрд░реНрди рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдЬрдм рдЖрдкрдХреЛ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
- рджреВрд╕рд░рд╛ рд▓рд╛рдн рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЙрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИред
- рдпрджрд┐ рдЖрдк рдкреИрдЯрд░реНрди рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░ рддреГрддреАрдп-рдкрдХреНрд╖ рдШрдЯрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреНрд░реИрд╢ рд╣реЛрдиреЗ рдкрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЕрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг)ред рдпрд╣ рдЕрдВрддрд┐рдо рд▓рд╛рдн рд╣реИред
рдиреБрдХрд╕рд╛рди
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рдлрд╛рдпрджреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдиреБрдХрд╕рд╛рди рд╣реИрдВред
- рдПрдХ рдУрд░, рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЕрдиреНрдп рднрд╛рдЧреЛрдВ рдХреЛ рдирд┐рд░реНрджреЗрд╢ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рд╡реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╡реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд▓реЗрддреЗ рд╣реИрдВред рдпрд╣ рдЗрддрдирд╛ рдирд┐рд╣рд┐рдд рд╣реИ рдХрд┐ рдЬрдирддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣рдореЗрд╢рд╛ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЖрдкрдХреЛ рдЖрдИрдбреАрдИ рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдПрдХ рдЕрд╡рдзрд┐ рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдбрд┐рд╕реНрдХ ... рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдП рдЧрдП рд╕рджрд╕реНрдп рд╕реВрдЪреА рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ)ред рдпрджрд┐ рдЖрдк рдПрдХ рдбрд┐рд╕реНрдкреЛрдЬрд╝ рдкреИрдЯрд░реНрди рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрднреА-рдХрднреА рдпрд╣ рд╕реАрдзреЗ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдпрд╣ рд╣реИ рдХрд┐
IEnumerator<T>
IDisposable
ред - рдЖрдорддреМрд░ рдкрд░ рдЬрдм рдЖрдк рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЖрдИрдбреАрд╕рд┐рд╕реЛрдкреНрд▓рд┐рдЯ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрдм рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЖрдИрдбреАрдЖрдИрд╕реЛрдкрд╛рдпрд░реА рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛рддрд╛ рд╣реИред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдкрд╣рд▓реЗ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рдЙрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ рдЬреЛ рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкреА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Dispose()
рдПрдХ рд╡рд░реНрдЧ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд╣реИред рдпрд╣ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рд░ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реИ ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдШреБрд╕рдкреИрда рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИрдВред - рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдирд┐рдкрдЯрд╛рди () рдХрд╛ рдЕрд░реНрде рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд┐рдирд╛рд╢ рдирд╣реАрдВ рд╣реИред рд╡рд╕реНрддреБ рдЕрднреА рднреА рдЕрдкрдиреЗ рд╡рд┐рдирд╛рд╢ рдХреЗ рдмрд╛рдж рдореМрдЬреВрдж рд╣реЛрдЧреА рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдЕрдиреНрдп рд░рд╛рдЬреНрдп рдореЗрдВред рдЗрд╕реЗ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CheckDisposed () рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐ рдХреА рдкрд╣рд▓реА рдХрдорд╛рдВрдб рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдиреЗ рд╣рдореЗрдВ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рджрд┐рдпрд╛: "рдЖрдЧреЗ рдмрдврд╝реЛ рдФрд░ рдЧреБрдгрд╛ рдХрд░реЛ";
- рдПрдХ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдореМрдХрд╛ рднреА рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
IDisposable
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╛ рдЖрдк рдПрдХ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рди рдХреЗ рдЕрд╡рд╕рд░ рдХреЗ рдмрд┐рдирд╛ рдЖрдИрдбреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдирд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: рдЖрдк рдпрд╛ рд╡рд╣ рдкрд╛рд░реНрдЯреА рдЬрд┐рд╕рдиреЗ рдЖрдкрдХреЛ рдЗрд╕реЗ рджрд┐рдпрд╛ рдерд╛ред рдЗрд╕рд╕реЗ рдбрд┐рд╕реНрдкреЛрдЬрд╝ () рдХреА рдХрдИ рдХреЙрд▓реЛрдВ рдХрд╛ рдПрдХ рдПрдВрдЯреАрдкрд╛рд░реНрдЯрд░реНрди рд╣реБрдЖ рдЬреЛ рдирд╖реНрдЯ рд╣реБрдИ рд╡рд╕реНрддреБ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ; - рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдФрд░ рдпрд╣ рдкреНрд░рдмрдВрдзрд┐рдд рдФрд░ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╣реИред рдпрд╣рд╛рдВ рдЬреАрд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдХрд╛рдо рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдЕрдЬреАрдм рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдЖрдк
virtual void Dispose()
рдбрд┐рд╕реНрдкреЛрдЬрд╝ virtual void Dispose()
рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреВрд░реЗ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреИрдЯрд░реНрди рд╕реЗ рдЬреБрдбрд╝реА рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; - рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рд╕реНрдкреЛрдЬрд╝ () рдкрджреНрдзрддрд┐ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдмрдХрд┐ '.ctor' рдХреЛ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рд╡рд░реНрдЧ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдирдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдирд┐рдкрдЯрд╛рди рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИред
- рдЕрдВрдд рдореЗрдВ, рдмрд╣реБрд╕реНрддрд░реАрдп рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╡рд┐рдирд╛рд╢ рдХреЗ рдХреНрд░рдо рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдЬрдм рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрд╛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЙрд╕ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░рд╛ рдорддрд▓рдм рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рд╣реИ рдЬрдм рдбрд┐рд╕реНрдкреЛрдЬрд╝ () рдПрдХ рдЧреНрд░рд╛рдл рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рд┐рд░реЛрдВ рдкрд░ рд╢реБрд░реВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣рд╛рдВ рдЕрдиреНрдп рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо рдкреИрдЯрд░реНрдиред
- рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдбреЗрд╡реЗрд▓рдкрд░реНрд╕ рдХреА рдЗрдЪреНрдЫрд╛ рдореЗрдореЛрд░реА рдХрдВрдЯреНрд░реЛрд▓ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рдХрд░рдиреЗ рдХреА рд╣реИ: рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд╣реБрдд рдмрд╛рд░ рдЕрдирд╡рд╛рдВрдЯреЗрдб рдХреЛрдб рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ + рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рдЧрд╛рд░рдмреЗрдЬ рдХрд▓реЗрдХреНрдЯрд░ рдЙрдиреНрд╣реЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХреЗред рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд╡рд╛рд▓реЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдмрд╣реБрдд рднреНрд░рдо рдЬреЛрдбрд╝рддрд╛ рд╣реИ: "рд╣рдореЗрдВ рдПрдХ рдкреИрдЯрд░реНрди рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП"? "рдХреНрдпрд╛ рдХреЛрдИ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкреИрдЯрд░реНрди рд╣реИ"? рд╢рд╛рдпрдж рдХреЙрд▓рд┐рдВрдЧ
delete obj; delete[] arr;
delete obj; delete[] arr;
рд╕рд░рд▓ рд╣реИ
рдбреЛрдореЗрди рдЕрдирд▓реЛрдбрд┐рдВрдЧ рдФрд░ рдПрдХ рдЖрд╡реЗрджрди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ
рдпрджрд┐ рдЖрдк рдЗрд╕ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЧрдП, рддреЛ рдЖрдк рднрд╡рд┐рд╖реНрдп рдХреЗ рдиреМрдХрд░реА рдХреЗ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреА рд╕рдлрд▓рддрд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛ рдЧрдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдордиреЗ рдЗрд╕ рд╕рд░рд▓ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рднреА рдкреНрд░рд╢реНрдиреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдкреИрдЯрд░реНрдиред рдЖрдЦрд┐рд░реА рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрд╡реЗрджрди рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд░рд▓ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЬрдм рдХрдЪрд░рд╛ рдбреЛрдореЗрди рдЕрдирд▓реЛрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрд╡реЗрджрди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╕рдордпред рдпрд╣ рдкреНрд░рд╢реНрди рдХреЗрд╡рд▓ Dispose()
рдкрд░ рд╕реНрдкрд░реНрд╢ рдХрд░рддрд╛ рд╣реИ ... рд╣рд╛рд▓рд╛рдБрдХрд┐ Dispose()
рдФрд░ рдлрд╝рд╛рдЗрдирд▓реАрдЬрд╝реЗрд╢рди рд╣рд╛рде рд╕реЗ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдо рд╢рд╛рдпрдж рд╣реА рдХрднреА рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЕрдВрддрд┐рдо рд░реВрдк рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди Dispose()
рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рддреЛ, рдЪрд▓реЛ рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рд╣рдо рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЛрдореЗрди рдХреЛ рдЙрддрд╛рд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЖрдк рджреЛрдиреЛрдВ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЛрдореЗрди рдореЗрдВ рд▓реЛрдб рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рдбреЛрдореЗрди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЧрдП рдереЗред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдлрд╛рдИ (рдЬреАрд╕реА рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣) рд╣реИ рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдлрд╛рдЗрдирд▓ рдХреЙрд▓рд┐рдВрдЧ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдлрд╝рд╛рдЗрдирд▓реАрдЬрд╝рд░ рдХрд╛ рддрд░реНрдХ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рдирд╖реНрдЯ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк Environment.HasShutdownStarted
рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рд╢рдЯрдбрд╛рдЙрдирдбрд╕реНрдЯрд░реНрдб рдиреЗ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рдХреЛрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдореЛрд░реА рд╕реЗ рдФрд░ AppDomain.CurrentDomain.IsFinalizingForUnload()
рд╡рд┐рдзрд┐ рд╕реЗ рд╕рдВрдХреЗрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдбреЛрдореЗрди рдЕрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХрд╛ рдХрд╛рд░рдг рд╣реИред рдпрджрд┐ рдпреЗ рдШрдЯрдирд╛рдПрдБ рдШрдЯрддреА рд╣реИрдВ рддреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХрд╛ рдХреНрд░рдо рдЖрдо рддреМрд░ рдкрд░ рдорд╣рддреНрд╡рд╣реАрди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдпрд╛ рддреЛ рдбреЛрдореЗрди рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рджреЗрд░реА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд╣рд░ рдЪреАрдЬ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдЬрд▓реНрджреА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдПрдХ рдХреНрд▓рд╛рд╕ рд▓реЛрдбрд░ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
// Assemblies and LoaderAllocators will be cleaned up during AppDomain shutdown in // an unmanaged code // So it is ok to skip reregistration and cleanup for finalization during appdomain shutdown. // We also avoid early finalization of LoaderAllocatorScout due to AD unload when the object was inside DelayedFinalizationList. if (!Environment.HasShutdownStarted && !AppDomain.CurrentDomain.IsFinalizingForUnload()) { // Destroy returns false if the managed LoaderAllocator is still alive. if (!Destroy(m_nativeLoaderAllocator)) { // Somebody might have been holding a reference on us via weak handle. // We will keep trying. It will be hopefully released eventually. GC.ReRegisterForFinalize(this); } }
рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЛрд╖
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдЖрдИрдбреАрд╕рд┐рд╕реЛрдкреНрд▓реАрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреИрдЯрд░реНрди рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЗрдореЛрд░реА рдХрдВрдЯреНрд░реЛрд▓ рдкрд░ рдХреБрдЫ рдирд┐рд░реНрднрд░рддрд╛ рд▓реЛрдЧреЛрдВ рдХреЛ рдЧреБрдорд░рд╛рд╣ рдХрд░рддреА рд╣реИ рдФрд░ рд╡реЗ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВред рдкреВрд░реЗ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рднрд░рд╛ рдЧрдпрд╛ рд╣реИред рдЕрдкрдиреА рдмрд╛рдд рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВред рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ: рдЖрдИрдбреАрд╕реЛрдкрд╛рдпрд░реАрдЬрд╝ рдпреВрд╕реЗрдЬ
FileEntry рдХреНрд▓рд╛рд╕ cmsinterop.cs
рдпрд╣ рдХреЛрдб рд╕рдорд╕реНрдпрд╛ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджреА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд▓реЗрдЦрдХ рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдЕрдкрдирд╛ рдорди рдмрджрд▓ рджрд┐рдпрд╛ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рд░рдЦрд╛
internal class FileEntry : IDisposable { // Other fields // ... [MarshalAs(UnmanagedType.SysInt)] public IntPtr HashValue; // ... ~FileEntry() { Dispose(false); } // The implementation is hidden and complicates calling the *right* version of a method. void IDisposable.Dispose() { this.Dispose(true); } // Choosing a public method is a serious mistake that allows for incorrect destruction of // an instance of a class. Moreover, you CANNOT call this method from the outside public void Dispose(bool fDisposing) { if (HashValue != IntPtr.Zero) { Marshal.FreeCoTaskMem(HashValue); HashValue = IntPtr.Zero; } if (fDisposing) { if( MuiMapping != null) { MuiMapping.Dispose(true); MuiMapping = null; } System.GC.SuppressFinalize(this); } } }
SemaphoreSlim рдХреНрд▓рд╛рд╕ рд╕рд┐рд╕реНрдЯрдо / рдереНрд░реЗрдбрд┐рдВрдЧ / SemaphoreSlim.cs
рдпрд╣ рддреНрд░реБрдЯрд┐ред рдЖрдИрдбреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдКрдкрд░ рд╣реИ: рдЙрди рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рджрдмрд╛рдПрдВ рдЬрд╣рд╛рдВ рдХреЛрдИ рдлрд╛рдЗрдирд▓ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЖрдо рд╣реИред
public void Dispose() { Dispose(true); // As the class doesn't have a finalizer, there is no need in GC.SuppressFinalize GC.SuppressFinalize(this); } // The implementation of this pattern assumes the finalizer exists. But it doesn't. // It was possible to do with just public virtual void Dispose() protected virtual void Dispose(bool disposing) { if (disposing) { if (m_waitHandle != null) { m_waitHandle.Close(); m_waitHandle = null; } m_lockObj = null; m_asyncHead = null; m_asyncTail = null; } }
рдХреЙрд▓рд┐рдВрдЧ рдмрдВрдж + рдХреБрдЫ рдореВрд▓ рдирд┐рд╡рд╛рд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб рдХреЛ рдбрд┐рд╕реНрдкреЛрдЬрд╝ рдХрд░реЗрдВ
рдХрднреА-рдХрднреА рд▓реЛрдЧ рдХреНрд▓реЛрдЬ рдФрд░ рдбрд┐рд╕реНрдкреЛрдЬрд▓ рджреЛрдиреЛрдВ рдХрд╣рддреЗ рд╣реИрдВред рдпрд╣ рдЧрд▓рдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рджреВрд╕рд░рд╛ рдбрд┐рд╕реНрдкреЛрдЬ рдПрдХ рдЕрдкрд╡рд╛рдж рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрд▓реЛрдЬ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЪреАрдЬреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдкреИрдЯрд░реНрди рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдиреЗ рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ред
public void Dispose() { if (MainForm != null) { MainForm.Close(); MainForm.Dispose(); } MainForm = null; }
рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рдгрд╛рдо
- ID рдкреНрд░рдпреЛрдЬреНрдп рдордВрдЪ рдХрд╛ рдПрдХ рдорд╛рдирдХ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдкреВрд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреБрдЫ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдорд╛рдирд╡ рд░рд╣рд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдорд▓рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рдЖрдИрдбреАрд╕реЛрдкрд╛рдпрд░реА рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдзрд┐рдХрддрдо рд░реВрдк рд╕реЗ рдЙрддреНрдкрд╛рджрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХреЗ рдЕрдиреБрднрд╛рдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реИ, рдЬреЛ рд╢реЗрд╖ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИред
- рдЖрдИрдбреАрд╕реЛрдкрд╛рдпрд░реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдбрд┐рд╕реНрдкреЛрдЬ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рдирд╛рд╢ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЖрдИрдбреАрд╕реЙрд░реНрдкреЛрд░реЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
- рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╕рд╛рде рджреЛ рдереНрд░реЗрдбреНрд╕ рд╕реЗ 'рдбрд┐рд╕реНрдкреЛрдЬрд╝ ()' рдХрд╣рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реБрд░рдХреНрд╖рд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЙрд╕ рдХрдерди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ рдЬреЛ рдбрд┐рд╕реНрдкреЛрдЬрд╝ () рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдЬрд┐рди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрди рд╣реЛрддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдПрдХ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрди рдХреЛ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЕрдВрддрд┐рдо рд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ
SafeHandle / CriticalHandle / CriticalFinalizerObject
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рдЗрд╕ рдкреГрдердХреНрдХрд░рдг рд╕реЗ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдмреЗрд╣рддрд░ рд╕рдорд░реНрдерди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ рдФрд░ рдирд┐рдкрдЯрд╛рди () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛: рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред - рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдкреИрдЯрд░реНрди рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдХреЛрдб рд░рдЦрд░рдЦрд╛рд╡ рдореЗрдВ рднреА рд╕рд╣рдЬ рдирд╣реАрдВ рд╣реИред рдЬрдм рд╣рдо
Lifetime
рдкреИрдЯрд░реНрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рд╣рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╡реНрдпреБрддреНрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рдпрд╣ рдЕрдзреНрдпрд╛рдп рд░реВрд╕реА рд╕реЗ рд╕рдВрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рдФрд░ рдкреЗрд╢реЗрд╡рд░ рдЕрдиреБрд╡рд╛рджрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рдЖрдк рд░реВрд╕реА рдпрд╛ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореБрдЦреНрдпрддрдГ рдЪреАрдиреА рдпрд╛ рдЬрд░реНрдорди рдореЗрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рд╣рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдЧрд┐рддреБрдм рдкрд░ рдПрдХ рд╕реНрдЯрд╛рд░ рджреЗрдирд╛ рд╣реИ рдпрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдлреЛрд░реНрдХ рдХрд░рдирд╛ рд╣реИ
github / sidristij / dotnetbook ред