рд░реЛрдЬрд▓рд┐рди рдХреЗ рд╕рд╛рде рд╕реА # рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ред рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЙрд▓

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

рд╢рд╛рдпрдж рд╕реА # рдЕрдкрдиреЗ рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдХреЛ рдРрд╕реЗ рдИрд░реНрд╖реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдХрд╛рд░рдг рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЬреАрд╡рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рдФрд░ рдлрд┐рд░ рднреА, рдкреВрд░реНрдгрддрд╛ рдХреА рдХреЛрдИ рд╕реАрдорд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдо рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП - рдЙрд╕рдХрд╛ рдЕрдкрдирд╛ред

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

рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЙрд▓ рдФрд░ рд╢рд╛рдпрдж рдореЛрдирд╛рдб


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

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

рд╕реА # рдореЗрдВ, рдЗрд╕ рдореЛрдирд╛рдб рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдмрдирд╛рдИ рдЧрдИ рд╣реИрдВ - рдЕрд╢рдХреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдирдерд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдирдХреЗ рдЕрд╢рдХреНрдд <рдЯреА> рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╡рд┐рдЪрд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рд╡рд╛ рдореЗрдВ рд╣реИ, рдФрд░ рдРрд╕реЗ рдХрдИ рд▓реЗрдЦ рдереЗ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ LINQ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C # рдореЗрдВ рдЗрд╕ рдореЛрдирдб рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рджрд┐рдорд┐рддреНрд░реА рдиреЗрд╕реНрдЯрд░реБрдХ рдореЗрдЬрд╝реЗрд╕реНрдЯреЗрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ , рдПрдХ рдФрд░ рд╣реИ ред

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

рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдореБрдЭреЗ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдореБрдЭреЗ JDK рдХреЗ рд▓рд┐рдП рдХреЛрдЯрд▓рд┐рди рднрд╛рд╖рд╛ рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдореЗрдВ рдорд┐рд▓рд╛ рдЬреЛ рдЕрднреА рддрдХ рдореЗрд░реЗ рдкреНрд░рд┐рдп JetBrains ( Null-safety ) рдХрдВрдкрдиреА рдХреЗ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдпрд╣ рдЧреНрд░реВрд╡реА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ, рд╢рд╛рдпрдж рдХрд╣реАрдВ рдФрд░ред

рддреЛ рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЙрд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреНрдпрд╛ рд╣реИ? рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ:
string text = SomeObject.ToString(); 

рдпрджрд┐ SomeObject рдЕрд╢рдХреНрдд рд╣реИ, рддреЛ рд╣рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ NullReferenceException рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЙрд▓ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ 'ред' рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЙрд▓ рдСрдкрд░реЗрдЯрд░ '?' рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
 string text = SomeObject?.ToString(); 

рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ:
 string text = SomeObject != null ? SomeObject.ToString() : null; 

рдЗрд╕ рдШрдЯрдирд╛ рдореЗрдВ рдХрд┐ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рд╡рд┐рдзрд┐ рдпрд╛ рд╕рдВрдкрддреНрддрд┐ рдПрдХ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддреА рд╣реИ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЪрд░ рдкреНрд░рдХрд╛рд░ рдЕрд╢рдХреНрдд рд╣реЛред
 int? count = SomeList?.Count; 

рдирд┐рдпрдорд┐рдд рдХреЙрд▓ рдХреА рддрд░рд╣, рдЗрди рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрдВрдЬреАрд░реЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 int? length = SomeObject?.ToString()?.Length; 

рдЬреЛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ:
 int? length = SomeObject != null ? SomeObject.ToString() != null ? SomeObject.ToString().Length : null : null; 

рдпрд╣ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдХреБрдЫ рдХрдорд┐рдпрд╛рдВ рдЫрд┐рдкрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕реЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝реЙрд░реНрдо рдореЗрдВ:
 var temp = SomeObject; string text = null; if (temp != null) text = temp.ToString(); 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд░реЛрдЬрд╝рд▓рд┐рди рдХреА рдХреБрдЫ рд╣рдж рддрдХ рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг, рддрд╛рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рдЕрдзрд┐рдХ рдлреВрд▓рд╛ рд╣реБрдЖ рдФрд░ рдЙрдмрд╛рдК рди рд╣реЛ, рдореИрдВрдиреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрд╛рдЧреЛрдВ рдореЗрдВ рд╣реИред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реЛрдЬрд▓рд┐рди


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

рдЖрдЗрдП рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рднрд╛рд╖рд╛ рдХреЗ рдЗрд╕ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ? рдЬрд╛рд╣рд┐рд░ рд╣реИ: рд╣рдо рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдорд╛рд░реЗ рдкрд╕рдВрджреАрджрд╛ рдЖрдИрдбреАрдИ рдореЗрдВ, рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЙрд▓ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рдкреНрд░реЗрд╕ рдмрдирд╛рдПрдВ, рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди, рд╣рдордиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реЛрд╕рд▓рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрд╛ рдерд╛, рдпрд╣ рд╕рдм рд╡рд╛рдХреНрдпрдЧрдд рд░реВрдк рд╕реЗ рд╕рд╣реА C # рдХреЛрдб рдФрд░ рд╡реЙрдЗрд▓рд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВ рдЖрдкрдХреЛ рдирд┐рд░рд╛рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджрдмрд╛рдЬреА рдХрд░рддрд╛ рд╣реВрдВ - рд░реЛрдЬрд▓рд┐рди рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди csc.exe рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХрд╛рдлреА рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рд╣реИред рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЙрд╕реА vNext рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЙрд╕рдХреЗ рдкреНрд░рдмрдВрдзрд┐рдд рдкреНрд░рддрд┐рд░реВрдк рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ рдРрд╕рд╛ рдЕрд╡рд╕рд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЬрдм рд╡рд╣ рдЪрд▓рд╛ рдЧрдпрд╛ред

рдЗрд╕реА рд╕рдордп, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИрдВ:
  1. рдЖрдк рд╕рдорд╛рди рд░реЛрд╕рд▓рд┐рди рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрддрдорд╛рди csc.exe рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрдирд╛рд▓реЙрдЧ рдХреЗ рд╕рд╛рде csc.exe рдХреЛ рдмрджрд▓рдХрд░ рдЕрдкрдиреА рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрдХрд▓рди (рд╡реИрд╕реЗ рдмрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рджреНрд╡рд╛рд░рд╛, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛) рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдХреЛрдбред
  2. рдЖрдк рдЕрдкрдиреЗ рдХрдВрд╕реЛрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░реА-рдмрд┐рд▓реНрдб рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХрдирд╡рд░реНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдирдП рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдУрдмреНрдЬ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ WPF рдХреЛ рдмрд╣реБрдд рд╣реА рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬрдм рдкреВрд░реНрд╡-рдирд┐рд░реНрдорд┐рдд рдЪрд░рдг рдореЗрдВ xaml рдлрд╛рдЗрд▓реЗрдВ .g.cs рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИрдВред


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

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдмреЗрд╢рдХ, рдиреАрдЪреЗ рд▓рд┐рдЦреА рдЧрдИ рд╕рдм рдХреБрдЫ рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдХрдИ рджреЛрд╖реЛрдВ рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реБрдзрд╛рд░ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдРрд╕реА рдЪреАрдЬреЗрдВ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред
рдЖрдЗрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВред рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд░реЛрдЬрд▓рд┐рди рдПрд╕рдбреАрдХреЗ рдХреЛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рд▓рд┐рдВрдХ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рдореЗрдВ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2010 рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд┐рд╕ рдкреИрдХ 1 рдФрд░ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2010 рдПрд╕рдбреАрдХреЗ SP1 рдХреЛ рднреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЗрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рдж, рд░реЛрд╕рд▓рд┐рди рдЙрдк-рдЖрдЗрдЯрдо рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдиреВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдЖрдИрдбреАрдИ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВрдЧреЗред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд "рд╕реНрд░реЛрдд рдХреЛрдб" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
 public class Example { public const string CODE = @"using System; using System.Linq; using System.Windows; namespace HelloWorld { public class TestClass { public string TestField; public string TestProperty { get; set; } public string TestMethod() { return null; } public string TestMethod2(int k, string p) { return null; } public TestClass ChainTest; } public class OtherClass { public void Test() { TestClass test; string testStr1; testStr1 = test?.TestField; string testStr3 = test?.TestProperty; string testStr4 = test?.TestMethod(); string testStr5 = test?.TestMethod2(100, testStr3); var test3 = test?.ChainTest?.TestField; } } }"; } 

рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЙрд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдпрд╣ рд╕реНрд░реЛрдд рдХреЛрдб, рди рдХреЗрд╡рд▓ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд░реВрдк рд╕реЗ рд╕рд╣реА рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рдВрдХрд▓рд┐рдд рднреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдПрдХ рд╕рд╛рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 SyntaxTree tree = SyntaxTree.ParseCompilationUnit(Example.CODE); SyntaxNode root = tree.Root; 

рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдХреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕рдЯреНрд░реА рдХреНрд▓рд╛рд╕ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░, рд╡рд┐рдЪрд┐рддреНрд░ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЖрдзрд╛рд░ рд╕рд┐рдВрдЯреЗрдХреНрд╕рдиреЛрдб рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдиреЛрдбреНрд╕ рдХрд╛ рдПрдХ рдкреЗрдбрд╝ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ - рджреНрд╡рд┐рдЖрдзрд╛рд░реА рднрд╛рд╡, рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐, рд╡рд┐рдзрд┐ рдЖрд╣реНрд╡рд╛рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐, рд╕рдВрдкрддреНрддрд┐ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдФрд░ рдЪрд░ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдмрд┐рд▓реНрдХреБрд▓ рдХрд┐рд╕реА рднреА C # рдирд┐рд░реНрдорд╛рдг рдХреЛ SyntaxNode рд╡рдВрд╢рдЬ рд╡рд░реНрдЧ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, SyntaxTree рд╡рд░реНрдЧ рдореЗрдВ SyntaxToken рд╕реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдиреНрдпреВрдирддрдо рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рдХреАрд╡рд░реНрдб, рд╢рд╛рдмреНрджрд┐рдХ, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░ рд╡рд┐рд░рд╛рдо рдЪрд┐рд╣реНрди (рдШреБрдВрдШрд░рд╛рд▓реЗ рдФрд░ рдХреЛрд╖реНрдардХ, рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо, рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо)ред рдЕрдВрдд рдореЗрдВ, SyntaxTree рдореЗрдВ SyntaxTrivia рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ - рд╡реЗ рдЬреЛ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдмрдбрд╝реЗ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрддреЗ рд╣реИрдВ - рдХреЛрдб рдФрд░ рд╕реНрдкреЗрд╕, рдХрдореЗрдВрдЯ, рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢ рдЖрджрд┐ред

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

рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ: рд░реЛрд╕реЗрд▓рд┐рди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░реАрдХреНрд╖рдг?; TestField рд╢рд░реНрдд рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╣рд╛рдпрдХ рдСрдкрд░реЗрдЯрд░ рд╣реИ - "рдкрд░реАрдХреНрд╖рдг", рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ "рдЬрдм рд╕рддреНрдп" - ".TestField", рдФрд░ рдЦрд╛рд▓реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ "рдЧрд▓рдд рд╣реЛрдиреЗ рдкрд░"ред рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде, рд╣рдо рдЕрдкрдиреЗ рдкреЗрдбрд╝ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗред рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдФрд░ рд░реЛрд╕рд▓рд┐рди рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ - рдЬреЛ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдЯреНрд░реА рдмрдирд╛рддрд╛ рд╣реИ рд╡рд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ рдореМрдЬреВрджрд╛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕реАрдзреЗ рдХреБрдЫ рднреА рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред Roslyn рдРрд╕реЗ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП SyntaxRewriter рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ, рдЬреЛ SyntaxVisitor рдХреНрд▓рд╛рд╕ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдХреБрдЦреНрдпрд╛рдд рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдХрдИ рдЖрднрд╛рд╕реА рд╡рд┐рдзрд┐рдпрд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рдиреЛрдб (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, VisitFieldDeclaration, VisitEnumMemberDeclaration, ...) рдХреА рдпрд╛рддреНрд░рд╛ рдкрд░ рдЬрд╛рддреА рд╣реИрдВ ... рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдЙрдирдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ 180 рд╣реИрдВред

рд╣рдореЗрдВ рдЕрдкрдирд╛ рд╡рдВрд╢рдЬ SyntaxRewriter рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдФрд░ VisitConditionalExpression рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рддрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдЧрдВрддреБрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рд╣реИред рдЕрдЧрд▓рд╛, рдореИрдВ рд╕рдВрдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб рджреВрдВрдЧрд╛, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдпрд╣ рдЫреЛрдЯрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЬреЛрдбрд╝реВрдВрдЧрд╛:
 //              public class SafeCallRewriter : SyntaxRewriter { //          ?. public bool IsSafeCallRewrited { get; set; } protected override SyntaxNode VisitConditionalExpression(ConditionalExpressionSyntax node) { if (IsSafeCallExpression(node)) { // expression  ,   null string identTxt = node.Condition.GetText(); ExpressionSyntax ident = Syntax.ParseExpression(identTxt); // expression  ,      != null string exprTxt = node.WhenTrue.GetText(); exprTxt = exprTxt.Substring(1, exprTxt.Length - 1);//     exprTxt = identTxt + '.' + exprTxt; ExpressionSyntax expr = Syntax.ParseExpression(exprTxt); ExpressionSyntax synt = Syntax.ConditionalExpression(//  condition: Syntax.BinaryExpression(//  ident != null SyntaxKind.NotEqualsExpression, left: ident, //  -   right: Syntax.LiteralExpression(SyntaxKind.NullLiteralExpression)), // null whenTrue: expr, whenFalse: Syntax.LiteralExpression(SyntaxKind.NullLiteralExpression)); IsSafeCallRewrited = true; return synt; } return base.VisitConditionalExpression(node); } //          private bool IsSafeCallExpression(ConditionalExpressionSyntax node) { return node.WhenTrue.GetText()[0] == '.'; } } 

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

рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдиреЛрдб рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, ConditionalExpression) рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╛рдорд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рддрд░рд╣ рд╕реА # рдЪрд┐рдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕реБрдЦрджрддрд╛ред рдореИрдВ рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реВрдВ, рдЕрдЧрд░ рдпрд╣ рд╕рд┐рдВрдереИрдЯрд┐рдХ рдиреЛрдбреНрд╕ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреЛрдИ рднреА рдкрд╛рдЧрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
 static void Main(string[] args) { //   SyntaxTree tree = SyntaxTree.ParseCompilationUnit(Example.CODE); SyntaxNode root = tree.Root; SafeCallRewriter rewriter = new SafeCallRewriter(); do { rewriter.IsSafeCallRewrited = false; // ,           root = rewriter.Visit(root); } while (rewriter.IsSafeCallRewrited);//        1 maybe- root = root.Format();// Ctrl+K, Ctrl+D Console.WriteLine(root.ToString()); } 

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

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реИрдВ:
 using System; using System.Linq; using System.Windows; namespace HelloWorld { public class TestClass { public string TestField; public string TestProperty { get; set; } public string TestMethod() { return null; } public string TestMethod2(int k, string p) { return null; } public TestClass ChainTest; } public class OtherClass { public void Test() { TestClass test; string testStr1; testStr1 = test != null ? test.TestField : null; string testStr3 = test != null ? test.TestProperty : null; string testStr4 = test != null ? test.TestMethod() : null; string testStr5 = test != null ? test.TestMethod2(100, testStr3) : null; var test3 = test != null ? test.ChainTest != null ? test.ChainTest.TestField : null : null; } } } 

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

PS рд░реЛрдЬрд╝рд▓рд┐рди рдХреЗ рдРрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг, рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдмрд╣реБрдд рдорджрдж рдХреА, рдпрд╣рд╛рдБ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

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


All Articles