рдлрд╛рдЗрдирд▓ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░реЗрдВ (c #)

рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдбреЛрдирдиреЗрдЯ рд╡рд░реНрдЧ рдХреЗ рдлрд╛рдЗрдирд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реИред
рдпрд╣ рдиреЛрдЯ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдПрдХ рддрд░реАрдХреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, MyTemporaryFile рдХреНрд▓рд╛рд╕ (рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓) рд╣реИ рдЬреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ Dipose () рдпрд╛ рдлрд╝рд╛рдЗрдирд▓реАрдЬрд╝рд░ рдореЗрдВ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ред

public class MyTemporaryFile : IDisposable { public string FileName { private set; get; } public MyTemporaryFile() { FileName = Path.GetTempFileName(); } public void Dispose() { Dispose(true); } ~MyTemporaryFile() { Dispose(false); } void Dispose(bool disposing) { if (disposing) { GC.SuppressFinalize(this); } DeleteFile(); } void DeleteFile() { if (FileName != null) { File.Delete(FileName); FileName = null; } } } 


рдбрд┐рд╕реНрдкреЛрдЬрд▓ рдкреИрдЯрд░реНрди рдХрд╛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдХрд╛рдлреА рдорд╛рдирдХ рд╣реИ рдФрд░ рдЗрд╕ рдкрд░ рд╣рдмреЗрд░рд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ ред рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рдВрднрд╡рддрдГ рдХреБрдЫ рд╕реВрдХреНрд╖реНрдо рдмрд┐рдВрджреБ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВред

рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдореБрдЭреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдорд┐рд▓реА, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ "рдмрд╣реБрдд рднреЛрд▓реА" рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

  [Test] public void TestMyTemporaryFile_without_Dispose() { var temporaryFile = new MyTemporaryFile(); string createdTemporaryFileName = temporaryFile.FileName; Assert.IsTrue(File.Exists(createdTemporaryFileName)); temporaryFile = null; Assert.IsFalse(File.Exists(createdTemporaryFileName)); } 

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЕрд╕реНрдерд╛рдпреА рдХреЛ рд╢реВрдиреНрдп рд╕реЗрдЯ рдХрд░рдирд╛ рдлрд╝рд╛рдЗрдирд▓реАрдЬрд╝рд░ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

GC.WaitForPendingFinalizers () рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рдереА ; рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдиреЗ рдореЗрд░реА рдорджрдж рдирд╣реАрдВ рдХреАред

offtopic: рдПрдХ рдмрд╛рд░ c # рдкрд░ рдХреБрдЫ рд▓реЗрдХреНрдЪрд░ рдХреЗ рджреМрд░рд╛рди рдЙрдиреНрд╣реЛрдВрдиреЗ AppDomain рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреАред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред рдареАрдХ рд╣реИ, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡реНрдпрд╛рдЦреНрдпрд╛рддрд╛ " рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╢реНрд░реЛрддрд╛ " рдХреЛ " рдХреБрдЫ рдФрд╕рдд рд╢реНрд░реЛрддрд╛ " рдХреИрд╕реЗ рдмрддрд╛рддреЗ рд╣реИрдВред рдореИрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛рддрд╛ рдХреЗ рд╢рдмреНрджреЛрдВ рд╕реЗ рдбрд┐рд╕реНрдкреЛрдЬрд╝ рдкреИрдЯрд░реНрди рдХреЛ рдХрднреА рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдпрд╛ред рдордЬреЗрджрд╛рд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдореИрдВрдиреЗ рдЙрд╕реЗ рдереЛрдбрд╝рд╛ рд╕рдордЭрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рдореБрдЭреЗ рд╢рд╛рдпрдж рд╣реА рдЕрдВрджрд╛рдЬрд╛ рд╣реБрдЖ рдХрд┐ рд▓реЗрдХреНрдЪрд░рд░ рдХреЗ рдорди рдореЗрдВ рдХреНрдпрд╛ рдерд╛ред

рддреЛ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ AppDomain рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдВрддрд┐рдо рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
  [Test] public void TestTemporaryFile_without_Dispose() { const string DOMAIN_NAME = "testDomain"; const string FILENAME_KEY = "fileName"; string testRoot = Directory.GetCurrentDirectory(); AppDomainSetup info = new AppDomainSetup { ApplicationBase = testRoot }; AppDomain testDomain = AppDomain.CreateDomain(DOMAIN_NAME, null, info); testDomain.DoCallBack(delegate { MyTemporaryFile temporaryFile = new MyTemporaryFile(); Assert.IsTrue(File.Exists(temporaryFile.FileName)); AppDomain.CurrentDomain.SetData(FILENAME_KEY, temporaryFile.FileName); }); string createdTemporaryFileName = (string)testDomain.GetData(FILENAME_KEY); Assert.IsTrue(File.Exists(createdTemporaryFileName)); AppDomain.Unload(testDomain); //       ( ),   Assert.IsFalse(File.Exists(createdTemporaryFileName)); } 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, AppDomain.Unload (testDomain) ; рдХреЛрдб рдХреЛ рдЕрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореЗрдореЛрд░реА рдХреЛ рд╕рд╛рдл рдХрд░рддрд╛ рд╣реИ (рдлрд╛рдЗрдирд▓рд░реНрд╕ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдпрд╣ рдлрд╛рдЗрдирд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ "рдордЬрдмреВрд░" рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдЗрд╕рдХреЗ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИред

рдиреЛрдЯ :
1. рд╡реНрдпрд╛рдЦреНрдпрд╛рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ " рдХреЙрд▓ рдбрд┐рд╕реНрдкреЛрдЬрд╝, рдмреЗрд╡рдХреВрдл " рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрдирд▓ рдореЗрдВ рд╕рд▓рд╛рд╣ рджреАред рдХрд╣реАрдВ рди рдХрд╣реАрдВ рд╡рд╣ рд╕рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдХреЛрдИ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрди рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рднреА рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
2. MyTemporaryFile рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рд╣реА рд╕реНрдХреЗрдЪ рд╣реИ рдФрд░ рдЙрддреНрдкрд╛рджрди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ рд╣реИред
3. рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реВрдХреНрд╖реНрдо рдмрд┐рдВрджреБ рднреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдИ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдЕрднреНрдпрд╛рд╕ рдиреЗ рдХрднреА рднреА рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рд╕рдХрд╛рд░рд╛рддреНрдордХ рд░рд┐рдХреЙрд░реНрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред
4. рдореБрдЭреЗ рдпрд╣ рдкрдврд╝рдХрд░ рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реБрдИ рд╣реИ рдХрд┐ рдЖрдк рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдиреБрдХрд╕рд╛рди рдХреНрдпрд╛ рд╣реИрдВред

рдЖрдкрдХрд╛ рдзрдиреНрдпрд╡рд╛рдж
рдЗрдЧреЛрд░ред

Source: https://habr.com/ru/post/In182702/


All Articles