рдЯрд╛рдЗрдк рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдкрд░рд┐рдкрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛

рдХреБрдЫ рдкрд╛рдардХреЛрдВ рдХреЛ рдЬрд┐рдиреНрд╣реЗрдВ рдХрднреА рд▓реЗрдЦ рдХреЗ рд╢реАрд░реНрд╖рдХ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИ, рд╢рд╛рдпрдж рджреЗрд░ рддрдХ рдХрд╛рдо рдкрд░ рд░рд╣реЗ рдФрд░ рдбрд┐рдмрдЧрд░ рдореЗрдВ рдХрдИ рдШрдВрдЯреЗ рдмрд┐рддрд╛рдПред рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рд╡рд╛рдХреНрдп рдФрд░ рдХрдардмреЛрд▓реА рд╢рдмреНрджреЛрдВ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рд╢рдмреНрджрдЬрд╛рд▓ рд╕реЗ рд╣рдЯрдХрд░ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░реЗрдВ:

рдЦреИрд░, рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рдХрд┐ рдХреНрдпрд╛ рджрд╛рдВрд╡ рдкрд░ рд╣реИ:
using System; class Test {         static void Main()    {        Console.WriteLine(First.Beta);    } } class First {     public static readonly int Alpha = 5;     public static readonly int Beta = Second.Gamma; } class Second {     public static readonly int Gamma = First.Alpha; } 


рдЗрд╕ рдХреЛрдб рдХрд╛ рдкрд░рд┐рдгрд╛рдо 0 рд╣реЛрдЧрд╛

рдмреЗрд╢рдХ, рдпрджрд┐ рдЖрдк рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдХреЛрдИ рдЕрдкреЗрдХреНрд╖рд╛рдПрдВ рдорд╛рдиреНрдпрддрд╛рдУрдВ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреАред рдЗрд╕рд▓рд┐рдП, рдЖрдЗрдП рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рджреЗрдЦреЗрдВ (C # 4 рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЦрдВрдб 10.5.5.1):

рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░ рдЪрд░ рдЖрд░рдВрднреАрдХрд░рдг рдЙрди рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдкрд╛рда рдХреНрд░рдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рдХрдХреНрд╖рд╛ рдШреЛрд╖рдгрд╛ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ рд╕реНрдерд┐рд░ рд░рдЪрдирд╛рдХрд╛рд░ (.1210.12) рд╡рд░реНрдЧ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рддреЛ рд╕реНрдереИрддрд┐рдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЖрд░рдВрднрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЙрд╕ рд╕реНрдереИрддрд┐рдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рддреБрд░рдВрдд рдкрд╣рд▓реЗ рд╣реЛрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рд╕реНрдереИрддрд┐рдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╢реБрд░реБрдЖрддреА рдХреЛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди-рдирд┐рд░реНрднрд░ рд╕рдордп рдкрд░ рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕реНрдереИрддрд┐рдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдиреБрд╡рд╛рдж:
рд╡рд░реНрдЧ рдХреЗ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреНрд░рдо рд╡рд░реНрдЧ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдЙрдирдХреЗ рд╕реНрдерд╛рди рдХреЗ рдХреНрд░рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╕реНрдЯреИрдЯрд┐рдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕реНрдЯреИрдЯрд┐рдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕реНрдЯреИрдЯрд┐рдХ рдлреАрд▓реНрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╣реЛрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдпрджрд┐ рд╕реНрдерд┐рд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕реНрдереИрддрд┐рдХ рдлрд╝реАрд▓реНрдбреНрд╕ рдХрд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рд╕реНрдЯреИрдЯрд┐рдХ рдлрд╝реАрд▓реНрдб рдХреЗ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрддрд╛ рд╣реИред


рднрд╛рд╖рд╛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк CLI рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдПрдХ рдЕрдВрд╢ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЯрд╛рдЗрдк рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдкреНрд░рдХрдЯ рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд░рд┐рдкрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдХреБрдЫ рдЕрдВрд╢реЛрдВ рдХреЛ рд▓рд┐рдЦреВрдВрдЧрд╛:

рддреЛ рдЖрдкрдХреА рд░рд╛рдп рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛:

  1. рдкреНрд░рд╛рд░рдВрднрд┐рдХ Test : рдЖрдЧреЗ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  2. рд╕реНрдЯрд╛рд░реНрдЯ Main
  3. First рдкреНрд░рд╛рд░рдВрдн рдХрд░рдирд╛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ First рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред First.Beta )
  4. First.Alpha рд╕реЗрдЯ рдХрд░реЗрдВ
  5. Second рдЖрд░рдВрдн рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ Second рдЪрд╛рд╣рд┐рдПред Second.Gamma )
  6. рджреВрд╕рд░рд╛ рд╕реЗрдЯ рдХрд░реЗрдВред Second.Gamma рдХреЛ First.Alpha Second.Gamma рдкрд░ First.Alpha (5)
  7. рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╛рд░рдВрдн Second
  8. рдкрд╣рд▓реЗ рд╕реЗрдЯ рдХрд░реЗрдВред First.Beta рд╕реЗ Second.Gamma (5)
  9. рдЖрд░рдВрднрд┐рдХ рд╕рдорд╛рдкреНрддрд┐ First
  10. "5" рдЯрд╛рдЗрдк рдХрд░реЗрдВ


рдФрд░ рдпрд╣рд╛рдБ рд╡рд╣реА рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ - .net рдлреНрд░реЗрдорд╡рд░реНрдХ 4.5 рдмреАрдЯрд╛ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдЖрд░рдВрднреАрдХрд░рдг .NET .NET рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ .Net 4.5 рдореЗрдВ рдХреЛрдИ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдХрд░рддрд╛ред рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ)

  1. рдкреНрд░рд╛рд░рдВрднрд┐рдХ Test : рдЖрдЧреЗ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  2. рд╕реНрдЯрд╛рд░реНрдЯ Main
  3. First рдкреНрд░рд╛рд░рдВрдн рдХрд░рдирд╛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ First рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред First.Beta )
  4. Second рдЖрд░рдВрдн рдХрд░рдирд╛ (рд╣рдореЗрдВ Second рдЪрд╛рд╣рд┐рдПред Second.Gamma )
  5. рджреВрд╕рд░рд╛ рд╕реЗрдЯ рдХрд░реЗрдВред Second.Gamma рдХреЛ First.Alpha (0)
  6. рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╛рд░рдВрдн Second
  7. First.Alpha рд╕реЗрдЯ рдХрд░реЗрдВ
  8. рдкрд╣рд▓реЗ рд╕реЗрдЯ рдХрд░реЗрдВред First.Beta рд╕реЗ Second.Gamma (0)
  9. рдЖрд░рдВрднрд┐рдХ рд╕рдорд╛рдкреНрддрд┐ First
  10. рдЯрд╛рдЗрдк реж


рдЪрд░рдг (5) рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ First First.Alpha рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ First рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ First.Alpha ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдереНрд░реЗрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЪрд░ рдЕрднреА рддрдХ рдЖрд░рдВрдн рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрдлрд╝ ...

(рдПрдХ рд╕реВрдХреНрд╖реНрдорддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрдгрд┐рдд рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрддреА рд╣реИ: рдХрд╛рд╕реНрдЯ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)

рд╡рд╛рдкрд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ


рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдиреЗ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЬрдм рдкрд░рд┐рдкрддреНрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкрд░рд┐рдкрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдЖрдкрдХреЗ рдЬреАрд╡рди рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░ рджреЗрдЧрд╛ред рдРрд╕реА рдЬрдЧрд╣реЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдФрд░ рдбрд┐рдмрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдЧреАрдЬрд╝реЗрдирдмреИрдЧ рд╣реИ ред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЕрдЧрд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо Second рдкрд╣рд▓реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░реЗ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП), рддреЛ рд╣рдореЗрдВ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓реЗрдЧрд╛ред рдФрд░, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЖрдк рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕рднреА рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓реЙрдиреНрдЪ рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЛ рдЬрдиреНрдо рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рд╡реЗ рд╕рднреА рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ (рдпрд╣ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИ, рдПрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░)ред

рдЗрд╕ рддрд░рд╣ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рдкреВрд░реА рддрд░рд╣ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдЖрдорддреМрд░ рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреНрдЮрд╛рдд рдЪреАрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕реЗ Encoding.Utf8 ред TimeZoneInfo.Utc , рдпрд╛ TimeZoneInfo.Utc ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпреЗ рд╕реНрдерд┐рд░ рдЧреБрдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╕реНрдереИрддрд┐рдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ public static readonly public static get-only рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ public static readonly public static get-only рдЧреБрдг рд╕рдорд╛рди рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ, рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЗрд╕рдХреЗ рдлрд╛рдпрджреЗ рдорд┐рд▓рддреЗ рд╣реИрдВред

рдореЗрд░реА рдиреЛрджрд╛ рдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХреБрдЫ рдкрд▓ рд╣рдорд╛рд░реЗ рдЬреИрд╕реЗ рд╣реА рд╣реИрдВред рдФрд░ рд╕рднреА рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдХрдИ рдкреНрд░рдХрд╛рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВ , рдЕрд░реНрдерд╛рддреНред рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпред рдпрд╣ рддрдм рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдЕрдкрдирд╛ UTC рдЯрд╛рдЗрдо рдЬрд╝реЛрди рдпрд╛ ISO calendar system рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ ISO calendar system ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЕрдВрджрд░ (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХреИрд╢рд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП) рдХрдИ рд╕реНрдерд┐рд░ рдЪрд░ рд╣реИрдВред рдпрд╣ рд╕рдм рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЕрдзрд┐рдХ рдХрдард┐рди рдФрд░ рдХрдард┐рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдФрд░ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЬрдм рд╣рдо рдПрдХ рдирдпрд╛ рд╕реНрдереИрддрд┐рдХ рдХреНрд╖реЗрддреНрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреНрд░реЗрдХрдбрд╛рдЙрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рддрддреНрдХрд╛рд▓ рдХрд╛рд░рдг рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдХреЛрдб рдХреА рдЕрдЦрдВрдбрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХреА рднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЕрдЧрд░ рдореИрдВрдиреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рддрдп рдХреА, рддреЛ рдпрд╣ рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЕрдиреНрдп рдирд╣реАрдВ рд╣реИред

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдЯрд╛рдЗрдк рдХрд░реЗрдВ


рдореБрдЦреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬрдм рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЧрд╛рд░рдВрдЯреА рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдХреНрд░рдо рдХреА рд╕рдВрд╡реЗрджрдирд╢реАрд▓рддрд╛ рд╣реИ рдХрд┐ AppDomain рднреАрддрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдпрд╛ рдерд╛, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдПрдХ рдЖрд░рдВрднреАрдХрд░рдг рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛, рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдХреЗ рд╕рд╛рде, рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдЧреАред

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

рдпрд╣рд╛рдБ рд╣рдорд╛рд░реА рдореЛрдЯреА рдпреЛрдЬрдирд╛ рд╣реИ:

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХрднреА рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреА рдЬрд╣рд╛рдВ рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЛрдореЗрди рдХреЗ рдПрдХ рдбрд╛рдЙрдирд▓реЛрдб рдореЗрдВ рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдирд╛ рдФрд░ рдЪрдХреНрд░реЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдирд╛, рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдпрд╣ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╣ рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдбрд╛рд▓реВрдВрдЧрд╛ред

рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ:

рдФрд░, рдЗрди рд╕рднреА рдЖрд░рдХреНрд╖рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ ... рдХреНрдпрд╛ рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ? рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рд╛рдБред рдЗрд╕ рддрдХрдиреАрдХ рдиреЗ рдореБрдЭреЗ рдХрдИ рдХреАрдбрд╝реЗ рдвреВрдВрдврдиреЗ рдореЗрдВ рдорджрдж рдХреА рдЬреЛ рддрдп рд╣реЛ рдЧрдП рдереЗред

рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдареАрдХ рдХрд░реЗрдВ


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

рдЗрд╕рд▓рд┐рдП рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрд┐ рдХреМрди рд╕рд╛ static readonly field рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдкрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рдмрдирд╛рддрд╛ рд╣реИ, рдЖрдк static readonly property рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ static readonly property , рдЬреЛ internal static readonly field рдХреЛ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб, рдирд┐рдЬреА рд╕реНрдереИрддрд┐рдХ рд╡рд░реНрдЧ рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХрд▓ рдХреЙрд▓ рдХреА рдЧрд╛рд░рдВрдЯреА рдХреЗ рд╕рд╛рде рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐, nested рдкреНрд░рдХрд╛рд░ рдХреЛ рддрдм рддрдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред
рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрдЬрд╛рдп:
  // Requires Bar to be initialized - if Bar also requires Foo to be // initialized, we have a problem... public static readonly Foo SimpleFoo = new Foo(Bar.Zero); 


рд╣рдо рд▓рд┐рдЦреЗрдВрдЧреЗ:

 public static readonly Foo SimpleFoo { get { return Constants.SimpleFoo; } } private static class Constants {    private static readonly int TypeInitializationChecking = NodaTime.Utility.TypeInitializationChecker.RecordInitializationStart();     // This requires both Foo and Bar to be initialized, but that's okay    // so long as neither of them require Foo.Constants to be initialized.    // (The unit test would spot that.)    internal static readonly Foo SimpleFoo = new Foo(Bar.Zero); } 


рдлрд┐рд▓рд╣рд╛рд▓, рдореИрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдЖрд▓рд╕реА рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реНрдерд┐рд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдкреНрд░рдХрд╛рд░ Foo рдХрд╛ рдПрдХ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ Foo.Constants рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХрд╣рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдкрд░ рд▓реМрдЯ рдЖрдПрдВрдЧреЗред рд▓реЗрдХрд┐рди рдиреЗрд╕реНрдЯреЗрдб рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рд╕реНрдерд┐рд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рднрдпрд╛рдирдХ рд▓рдЧрддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ рдореЗрд░рд╛ рдХреБрдЫ рд╣рд┐рд╕реНрд╕рд╛ рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдпрд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд░рдирд╛ рдФрд░ рдмреИрд╕рд╛рдЦреА рдмрдирд╛рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рднрдВрдбрд╛рд░рдг рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП (рдпрд╛ рдЗрд╕рдХреЗ рдХреБрдЫ рднрд╛рдЧ) рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХрдХрд░рдг рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЗрди рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдпрд╛ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддрд╛рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЬрдм рдореЗрд░реЗ рдкрд╛рд╕ рдореМрдХрд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ NDepend рдореЗрд░реА рдорджрдж NDepend рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдмрдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╣реИрдХрд┐рдВрдЧ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдпрд╣ рдЕрднреА рднреА рд╡рд┐рдХрд▓реНрдк рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ - рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рднрд░рд╛ рдХреЛрдбред рдФрд░ ... рдореБрдЭреЗ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рд╢рд░реНрдо рдЖ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ Noda Time рдореБрдЭреЗ рд╕рднреА рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдорд┐рд▓реАрдВред рдпрд╣ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреЛрдб рдкрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ - рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдХрд╣рд╛рдВ рдЫрд┐рдкреА рд╣реБрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ

рдЖрд╡реЗрджрди: рдкрд░реАрдХреНрд╖рдг рдХреЛрдб



TypeInitializationChecker


 internal sealed class TypeInitializationChecker : MarshalByRefObject { private static List<Dependency> dependencies = null; private static readonly MethodInfo EntryMethod = typeof(TypeInitializationChecker).GetMethod("FindDependencies"); internal static int RecordInitializationStart() { if (dependencies == null) { return 0; } Type previousType = null; foreach (var frame in new StackTrace().GetFrames()) { var method = frame.GetMethod(); if (method == EntryMethod) { break; } var declaringType = method.DeclaringType; if (method == declaringType.TypeInitializer) { if (previousType != null) { dependencies.Add(new Dependency(declaringType, previousType)); } previousType = declaringType; } } return 0; } /// <summary> /// Invoked from the unit tests, this finds the dependency chain for a single type /// by invoking its type initializer. /// </summary> public Dependency[] FindDependencies(string name) { dependencies = new List<Dependency>(); Type type = typeof(TypeInitializationChecker).Assembly.GetType(name, true); RuntimeHelpers.RunClassConstructor(type.TypeHandle); return dependencies.ToArray(); } /// <summary> /// A simple from/to tuple, which can be marshaled across AppDomains. /// </summary> internal sealed class Dependency : MarshalByRefObject { public string From { get; private set; } public string To { get; private set; } internal Dependency(Type from, Type to) { From = from.FullName; To = to.FullName; } } } 


TypeInitializationTest

 [TestFixture] public class TypeInitializationTest { [Test] public void BuildInitializerLoops() { Assembly assembly = typeof(TypeInitializationChecker).Assembly; var dependencies = new List<TypeInitializationChecker.Dependency>(); // Test each type in a new AppDomain - we want to see what happens where each type is initialized first. // Note: Namespace prefix check is present to get this to survive in test runners which // inject extra types. (Seen with JetBrains.Profiler.Core.Instrumentation.DataOnStack.) foreach (var type in assembly.GetTypes().Where(t => t.FullName.StartsWith("NodaTime"))) { // Note: this won't be enough to load the assembly in all test runners. In particular, it fails in // NCrunch at the moment. AppDomainSetup setup = new AppDomainSetup { ApplicationBase = AppDomain.CurrentDomain.BaseDirectory }; AppDomain domain = AppDomain.CreateDomain("InitializationTest" + type.Name, AppDomain.CurrentDomain.Evidence, setup); var helper = (TypeInitializationChecker)domain.CreateInstanceAndUnwrap(assembly.FullName, typeof(TypeInitializationChecker).FullName); dependencies.AddRange(helper.FindDependencies(type.FullName)); } var lookup = dependencies.ToLookup(d => d.From, d => d.To); // This is less efficient than it might be, but I'm aiming for simplicity: starting at each type // which has a dependency, can we make a cycle? // See Tarjan's Algorithm in Wikipedia for ways this could be made more efficient. // http://en.wikipedia.org/wiki/Tarjan's_strongly_connected_components_algorithm foreach (var group in lookup) { Stack<string> path = new Stack<string>(); CheckForCycles(group.Key, path, lookup); } } private static void CheckForCycles(string next, Stack<string> path, ILookup<string, string> dependencyLookup) { if (path.Contains(next)) { Assert.Fail("Type initializer cycle: {0}-{1}", string.Join("-", path.Reverse().ToArray()), next); } path.Push(next); foreach (var candidate in dependencyLookup[next].Distinct()) { CheckForCycles(candidate, path, dependencyLookup); } path.Pop(); } } 

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


All Articles