рдПрдХ рдХреИрдЪ рдХреЗ рд╕рд╛рде c # рдореЗрдВ 10 рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж
, рдореИрдВ рдкрд░реЗрд╢рд╛рди рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдХреЛрдИ рднреА рддрд░рдХреАрдм рдирд╣реАрдВ рд╣реИ (рдЖрдк рдиреАрдЪреЗ рд╕реНрд▓рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ "i ++ + ++ i рдХреЗ рдмрд░рд╛рдмрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛") ... рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдХреБрдЫ рдЪрд╛рд▓реЗрдВ рдпрд╛рдж рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЕрдкрдиреЗ рдЬреАрд╡рди рдореЗрдВ 8-8 рддрдХ рджреЗрдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╢рд╛рдпрдж рдмреАрдЪ рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд╛ рд╕реНрддрд░ред
рддреНрдпрд╛рдЧ
рдмрд╣реБрдд рдХреБрдЫ рдПрдХ рднрдпрд╛рдирдХ рдмрдЯрди рд╕рдордЭреМрддреЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдЙрджрд╛рд╣рд░рдг рдореЗрд░реЗ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЙрдирдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рд╣реИ (рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХрдо рд╣реИ) (рдпрджрд┐ рд▓реЗрдЦрдХ (рд╡реЗ рдЕрдХреНрд╕рд░ рдореЗрд░реЗ рд▓рд┐рдП рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИрдВ) рдЦреЛрдЬрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрддреНрд░ рдореЗрдВ рд▓рд┐рдЦреЗрдВ - рдореИрдВ рдкреЛрд╕реНрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реВрдВрдЧрд╛)ред
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдиреЗ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рд╣реИ - рдореИрдВрдиреЗ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЛ рдХреБрдЫ рд╕рд╛рд░ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рднрд╛рд╖рд╛ рд╕реВрдЦреА рдФрд░ рдЙрдмрд╛рдК рд╣реИред рдФрд░ рд╣рд╛рдВ, рдпрд╣ рд╕рд┐рд░реНрдл 20 рдорд┐рдирдЯ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрдпрд╛ред
рдФрд░ рд╣рд╛рдВ, рдпрд╣ рдПрдХ рд╕рдордЧреНрд░ рд╡рд┐рд╖рдп рд╣реИ, рдмрд▓реНрдХрд┐, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдиреЛрдЯ рднреА рддрд╛рдХрд┐ "рджрд┐рдорд╛рдЧ рдлреВрд▓реЗ рдирд╣реАрдВред" рдмрд┐рд▓реНрд▓реА рдХреЗ рдмрдЪреНрдЪреЗ рдХреА рддрд╕реНрд╡реАрд░реЗрдВ рднреА рдирд╣реАрдВ рд╣реИрдВред
рдХреНрдпрд╛ рдЖрдк рддреИрдпрд╛рд░ рд╣реИрдВ? рддреЛ рдлрд┐рд░ рдЪрд▓рд┐рдП ...рдЯрд╛рд╕реНрдХ 1
рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?
using System; using System.Xml; public class Program { public static void Main() { Bar(XmlWriter => XmlWriter.Flush()); Bar(XmlReader => XmlReader.Flush()); } private static void Bar(Action<XmlWriter> x) { Console.WriteLine("W"); } private static void Bar(Action<XmlReader> x) { Console.WriteLine("R"); } }
рд╡рд┐рд╡рд░рдг рдФрд░ рдЙрддреНрддрд░WW рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛
рдЬрд╛рдПрдЧрд╛ ред
рдЖрдк
рдЪрд▓рд╛рдиреЗ рдФрд░ рдЬрд╛рдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдШрдЯрдирд╛ рдХрд╛ рд╕рд╛рд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ "7.6.4.1 рдкрд╣рдЪрд╛рди рд╕рд░рд▓ рдирд╛рдо рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо" рдЦрдВрдб рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рдкреВрд░реЗ рдЦрдВрдб рдХреЛ рджреЗ рджреВрдВрдЧрд╛:
рдИрдЖрдИ рдХреЗ рд╕рджрд╕реНрдп рдЕрднрд┐рдЧрдо рдореЗрдВ, рдпрджрд┐ рдИ рдПрдХ рдПрдХрд▓ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдИ рдХрд╛ рдЕрд░реНрде рдПрдХ рд╕рд╛рдзрд╛рд░рдг-рдирд╛рдо (name7.6.2) рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░, рдХреНрд╖реЗрддреНрд░, рд╕рдВрдкрддреНрддрд┐, рд╕реНрдерд╛рдиреАрдп рдЪрд░, рдпрд╛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ E рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░-рдирд╛рдо ()3.8) рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд░реНрде рд╣реИ, рддреЛ E рдХреЗ рджреЛрдиреЛрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд░реНрдереЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рдИрдЖрдИ рдХреЗ рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд░реНрде рдХрднреА рдЕрд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЯрд╛рдЗрдк рдИ рдХрд╛ рд╕рджрд╕реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдирд┐рдпрдо рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдИ рдХреЗ рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рдЬрд╣рд╛рдВ рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рдЕрдиреНрдпрдерд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
struct Color { public static readonly Color White = new Color(...); public static readonly Color Black = new Color(...); public Color Complement() {...} } class A { public Color Color; // Field Color of type Color void F() { Color = Color.Black; // References Color.Black static member Color = Color.Complement(); // Invokes Complement() on Color field } static void G() { Color c = Color.White; // References Color.White static member } }
рдП рд╡рд░реНрдЧ рдХреЗ рднреАрддрд░, рд░рдВрдЧ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреА рдЙрди рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд░рдВрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЬреЛ рд░рдВрдЧ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЬреЛ рдХреБрдЫ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЙрд╕рдХрд╛ рд╕рд╛рд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд╕рдВрдХрд▓рдХ, рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рдЪрд░ рдирд╛рдо рдЯрд╛рдЗрдк рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдпреЛрдВ рдпрд╛ рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХреЛ рдЙрд╕ рдирд╛рдо рдХреЗ рд╕рд╛рде рд╕рджрд╕реНрдп рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдбреЙрдЯ рдХреЗ рдмрд╛рдж рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдо (рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ) рдХреЗ рд╕рд╛рде рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдкреИрджрд╛ рдХрд░реЗрдЧрд╛, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗред
рдпрд╣ рдпрд╣ рдирд┐рдпрдо рд╣реИ рдЬреЛ рдпрд╣ рдкреНрд░рднрд╛рд╡ рджреЗрддрд╛ рд╣реИ:
XmlReader рдореЗрдВ
рдлреНрд▓рд╢ () рд╡рд┐рдзрд┐
( XmlWriter рдХреЗ рд╡рд┐рдкрд░реАрдд) рдирд╣реАрдВ рд╣реИ, рдХрдВрдкрд╛рдЗрд▓рд░ рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкреНрд░рдХрд╛рд░ рдХреЛ
рдПрдХреНрд╢рди <XmlWriter> рдХреЗ рд░реВрдк рдореЗрдВ
рдШрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдзрд┐ рдХрд╣рддрд╛ рд╣реИ, рдЬреЛ
W рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ
ред рдЯрд╛рд╕реНрдХ реи
рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдХрд┐рд╕реА
рдЯрд╛рд╕реНрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП
рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ
рдХрд░рддрд╛ рд╣реИ ?
рд╡рд┐рд╡рд░рдг рдФрд░ рдЙрддреНрддрд░рд╣рд╛рдБ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред
рдпрджрд┐ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм
рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╢рдмреНрдж рдХрд╛ рд╕рд╛рдордирд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рдВрдХрд▓рдХ рд░рд╛рдЬреНрдп рдХреА рдорд╢реАрди рдореЗрдВ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП
рдмрддрдЦ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХрд╛рд░реНрдп рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЖрд╡рд╢реНрдпрдХ рд╢рд░реНрддреЛрдВ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЪрдпрди рд╣реЛрдЧрд╛ред
рддреБрд░рдВрдд рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
using System.Runtime.CompilerServices; class Program { private static void Main() { MainAsync(); } private async static void MainAsync() { await Foo(); } static Target Foo() { return new Target(); } } class Target { public TaskAwaiter GetAwaiter() { return new TaskAwaiter(); } }
рдФрд░ рдЖрдк рдпрд╣ рдпрд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рдпрдо рд╕рдорд╛рди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд▓рд┐рдЦреЗрдВ:
using System.Runtime.CompilerServices; class Program { private static void Main() { MainAsync(); } private async static void MainAsync() { await Foo(); } static Target Foo() { return new Target(); } } class Target { } static class TargetEx { public static TaskAwaiter GetAwaiter(this Target t) { return new TaskAwaiter(); } }
рдЯрд╛рд╕реНрдХ 3
рдмрд▓реНрдХрд┐, рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдп рдЬреЛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рдЕрдзрд┐рдХ рдЪрдХрд┐рдд рдХрд░рддрд╛ рд╣реИредрдХреНрдпрд╛ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛
IAsyncResult * рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреБрд░рд╛рдиреА (.net2) рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП "рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ" рд╕рд┐рдЦрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ?
*)
IAsyncResult рдкреИрдЯрд░реНрди рдХрд╛ рдЕрд░реНрде рд╣реИ рдлрд╛рд░реНрдо рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА:
IAsyncResult BeginXXX(AsyncCallback callback); void EndXXX(IAsyncResult);
рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИред MSDN рдкрд░
рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВ**) рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЙрд▓рд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдРрд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╣реИ рдЬрд╣рд╛рдВ async \ рдкреНрд░рддреАрдХреНрд╖рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд░реНрдерд┐рдд рд╣реИред
рд╡рд┐рд╡рд░рдг рдФрд░ рдЙрддреНрддрд░рд╣рд╛рдВ, рдЖрдк рдПрдХ рдХреНрд▓рд╛рд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди (рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ) рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП
рдЯрд╛рд╕реНрдХ рдХреЙрдордкреНрд▓реЗрдХреНрд╢рди рд╕реНрд░реЛрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░
рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛
рдЯрд╛рд╕реНрдХред рдлреИрдХреНрдЯреНрд░реА.рдлреНрд░реЗрдордПрд╕реНрдХрдкрдирд╛рдЯрд░реНрди , рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ)ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
using System; using System.Threading; using System.Threading.Tasks; class Program { private static void Main() { MainAsync(); Console.ReadLine(); } private async static void MainAsync() { var ogc = new OldGoodClass(); await ogc.OperationAsync().ConfigureAwait(false); } } static class OldGoodClassEx { public static Task OperationAsync(this OldGoodClass ogc) { var tsc = new TaskCompletionSource<object>(ogc); AsyncCallback onDone = (ar) => { ogc.EndOperation(ar); tsc.SetResult(null); }; ogc.BeginOperation(onDone); return tsc.Task; } } class OldGoodClass { class AsyncResult : IAsyncResult { #region Implementation of IAsyncResult public bool IsCompleted { get; set; } public WaitHandle AsyncWaitHandle { get; set; } public object AsyncState { get; set; } public bool CompletedSynchronously { get { return false; } } #endregion } public IAsyncResult BeginOperation(AsyncCallback onDone) { var rv = new AsyncResult(); ThreadPool.QueueUserWorkItem(s => { Thread.Sleep(2000); var ar = (AsyncResult) s; ar.IsCompleted = true; if (onDone != null) onDone(ar); }, rv); return rv; } public void EndOperation(IAsyncResult r) { while (!r.IsCompleted) { } } }
рдЯрд╛рд╕реНрдХ 4
рд░рд┐рд▓реАрдЬ рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдиреЗ рдкрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
рд░рд┐рд▓реАрдЬ рдкрд░ рдЕрд╕реЗрдВрдмрд▓рд┐рдВрдЧ рдФрд░ рдбрд┐рдмрдЧ рдХреЗ рддрд╣рдд рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
using System; internal class Program { private class MyClass { public MyClass() { Console.WriteLine("ctor"); GC.Collect(); GC.WaitForPendingFinalizers(); } ~MyClass() { Console.WriteLine("dtor"); } } private static void Main(string[] args) { var myClass = new MyClass(); if (myClass != null) { Console.WriteLine("not null"); } else { Console.WriteLine("null"); } } }
рд╡рд┐рд╡рд░рдг рдФрд░ рдЙрддреНрддрд░рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рд╣реИ рдХрд┐ рдЬреЗрдЖрдИрдЯреА рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рднреАрддрд░ рдПрдХ рдЪрд░ рдХреЗ рджрд╛рдпрд░реЗ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЬреАрд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХрд╛ рд╡рд┐рдирд╛рд╢ред
рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЬрд╡рд╛рдм рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, .net4 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ (рдХреНрд▓рд╛рдЗрдВрдЯ JIT) рдХреЗ рд▓рд┐рдП рдорд┐рд╕рд┐рд╕рд┐рдкреА JIT рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
- рдбрд┐рдмрдЧ рдХреЗ рдмрд┐рдирд╛ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рд░рд┐рд▓реАрдЬрд╝ рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ, рдЗрди "рдХреНрд╖реЗрддреНрд░реЛрдВ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ,
- рдбрд┐рдмрдЧ рдХреЗ рддрд╣рдд рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рд░рд┐рд▓реАрдЬрд╝ рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ, рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрдд рддрдХ рджрд╛рдпрд░рд╛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд┐рдирд╛ рдбрд┐рдмрдЧ рдХреЗ .net4.5 (рдЬрдм рд░рд┐рд▓реАрдЬрд╝ рдореЛрдб рдореЗрдВ рдХреЛрдбрд╛рдВрддрд░рдг), [ctor, dtor, not null] рдХреЛ рдЙрд╕реА рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рдбреАрдмрдЧ рдХреЗ рд╡рд┐рдкрд░реАрдд рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: [ctor, not null] (рдХреИрдЪ рди рджреЗрдЦреЗрдВ)? рдЙрд╕ рдХреЗ рдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдХреНрдпрд╛ рд╣реБрдЖ)ред
JIT рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреЛрдб рднреА рдЕрд▓рдЧ рд╣реИ:
X86 рдХреЛрдбрд╛рдВрддрд░рдХ рд╡рд┐рд╡рд░рдг >>> 002800D8 55 push ebp 002800D9 8BEC mov ebp,esp 002800DB 83EC0C sub esp,0Ch 002800DE 33C0 xor eax,eax 002800E0 8945F4 mov dword ptr [ebp-0Ch],eax 002800E3 894DFC mov dword ptr [ebp-4],ecx 002800E6 833D6031150000 cmp dword ptr ds:[00153160h],0 002800ED 7405 je 002800F4 002800EF E83A796362 call 628B7A2E (JitHelp: CORINFO_HELP_DBG_IS_JUST_MY_CODE) 002800F4 33D2 xor edx,edx 002800F6 8955F8 mov dword ptr [ebp-8],edx 002800F9 B918381500 mov ecx,153818h (MT: ConsoleApplication11.Program+MyClass) 002800FE E8C9833A62 call 626284CC (JitHelp: CORINFO_HELP_NEWFAST) 00280103 8945F4 mov dword ptr [ebp-0Ch],eax 00280106 8B4DF4 mov ecx,dword ptr [ebp-0Ch] 00280109 FF1538381500 call dword ptr ds:[00153838h] (ConsoleApplication11.Program+MyClass..ctor(), mdToken: 06000004) 0028010F 8B45F4 mov eax,dword ptr [ebp-0Ch] 00280112 8945F8 mov dword ptr [ebp-8],eax 00280115 837DF800 cmp dword ptr [ebp-8],0 00280119 7410 je 0028012B 0028011B 8B0D38213803 mov ecx,dword ptr ds:[03382138h] ("not null") 00280121 E8FACD6561 call 618DCF20 (System.Console.WriteLine(System.String), mdToken: 06000993) 00280126 90 nop 00280127 8BE5 mov esp,ebp 00280127 8BE5 - ?) 00280129 5D pop ebp 0028012A C3 ret 0028012B 8B0D3C213803 mov ecx,dword ptr ds:[0338213Ch] ("null") 00280131 E8EACD6561 call 618DCF20 (System.Console.WriteLine(System.String), mdToken: 06000993) 00280136 90 nop 00280137 8BE5 mov esp,ebp 00280139 5D pop ebp 0028013A C3 ret
рдХреЗ рдЦрд┐рд▓рд╛рдл
002F0098 55 push ebp 002F0099 8BEC mov ebp,esp 002F009B B924381900 mov ecx,193824h (MT: ConsoleApplication11.Program+MyClass) 002F00A0 E827843362 call 626284CC (JitHelp: CORINFO_HELP_NEWFAST) 002F00A5 8BC8 mov ecx,eax 002F00A7 FF1544381900 call dword ptr ds:[00193844h] (ConsoleApplication11.Program+MyClass..ctor(), mdToken: 06000004) 002F00AD E892CE5E61 call 618DCF44 (System.Console.get_Out(), mdToken: 06000946) 002F00B2 8BC8 mov ecx,eax 002F00B4 8B1538217803 mov edx,dword ptr ds:[03782138h] ("not null") 002F00BA 8B01 mov eax,dword ptr [ecx] 002F00BC 8B403C mov eax,dword ptr [eax+3Ch] 002F00BF FF5010 call dword ptr [eax+10h] 002F00C2 5D pop ebp 002F00C3 C3 ret
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЧрд▓рдд рд╣реЛ рд╕рдХрддреА рд╣реИ - рд╕рдВрд╕реНрдХрд░рдг рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдгрд╛рд▓реА рдкрд░ рдЬреЗрдЖрдИрдЯреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (рдХреЛрдИ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдирд╣реАрдВ рд╣реИрдВ)ред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдорд╕реНрдпрд╛ (рдФрд░ рдЗрд╕рдХреА рдЬрдбрд╝реЗрдВ)
рд╕рд░реНрдЧреЗрдИ рдЯреЗрдкреНрд▓рд╛рдХреЛрд╡ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ) рдмреНрд▓реЙрдЧ рдкрд░ред
рдЯрд╛рд╕реНрдХ 5
рдЬреЗ рдХреНрдпрд╛ рд╣реИ?
Int32 i = Int32.MinValue; Int32 j = -i;
рд╡рд┐рд╡рд░рдг рдФрд░ рдЙрддреНрддрд░рдПрдХ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рд╣реЛрдЧрд╛ред рдЕрд╕рдВрдмрджреНрдз рдореЗрдВ, рд╣рдореЗрдВ Int32.MinValue рдХрд╛ рдорд╛рди рдорд┐рд▓рддрд╛ рд╣реИ ред рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдореБрдЭреЗ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдБ рдЕрдЧреНрд░рдгреА рдмрд┐рдЯ рдХрд╛ рдорддрд▓рдм рд╣реИ рдПрдХ рд╕рдВрдХреЗрддред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╛рдЗрдЯ 127 + 1 = 128, 128 = 0x80 рдХреЗ рд▓рд┐рдП, рдФрд░ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдпрд╣ -128 рд╣реИред
рдпрд╛ рдмрд┐рдЯреНрд╕ рдореЗрдВ:
-128 = 1000 0000
127 = 0111 1111
-1 = 1111 1111
рдЧреБрдгрд╛ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИред
рдЯрд╛рд╕реНрдХ 6
рдХреНрдпрд╛ рд╕реА # рдореЗрдВ "рдореЗрдореЛрд░реА" рдЪреБрдирдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ *?
*) рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╕рд░рдгреА рдХреЗ рдЖрдХрд╛рд░ (рд▓реЗрдХрд┐рди рдЖрд╡рдВрдЯрд┐рдд рд╕реНрдореГрддрд┐ рдирд╣реАрдВ) рдХреЛ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ?
рд╡рд┐рд╡рд░рдг рдФрд░ рдЙрддреНрддрд░рдЦреИрд░, рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
using System.Runtime.InteropServices; class ArrayLength { public int Length; } [StructLayout(LayoutKind.Explicit)] class MyArray { [FieldOffset(0)] public ArrayLength ArrayLength; [FieldOffset(0)] public byte[] Array = new byte[4]; } internal class Program { private static void Main(string[] args) { var arr = new MyArray(); arr.ArrayLength.Length = 1024; } }
рдЗрд╕реА рддрд░рд╣, рдЖрдк рдЕрдиреНрдп рдЯреНрд░рд┐рдХреА рдЯреНрд░рд┐рдХ рдХреЛ рдХреНрд░реИрдВрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде - рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рдВрдбрдмрдЧ рдЖрд╕рд╛рдиреА рд╕реЗ рдЖрдкрдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред