рдПрд╡рд▓реЛрдирд┐рдпрд╛ рдпреВрдЖрдИ рдЪрд┐рдбрд╝рд┐рдпрд╛рдШрд░ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рд▓рдбрд╝рд╛рдИ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдпреЛрдЧрджрд╛рди

рдЪрд┐рддреНрд░ 2

рдпрд╣ рд▓реЗрдЦ PVS-Studio рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Avalonia UI рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред Avalonia UI рдПрдХ рдУрдкрди-рд╕реЛрд░реНрд╕, рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо XAML- рдЖрдзрд╛рд░рд┐рдд рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╣реИред рдпрд╣ .NET рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ WPF рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рд▓реЗрдЦрдХреЛрдВ рдХреЛ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛рдПрдЧрд╛ред

Avalonia UI рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


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

рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрд╡рд▓реЛрдирд┐рдпрд╛ рдпреВрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ, рдЙрдирдореЗрдВ рдПрд╡рд▓реЛрдирд╕реНрдЯрдбрд┐рдпреЛ (рд╕реА # рдФрд░ рд╕реА / рд╕реА ++ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдЖрдИрдбреАрдИ) рдФрд░ рдХреЛрд░ 2 рдбреА (2 рдбреА рдЖрд░реЗрдЦ рдФрд░ рдЖрд░реЗрдЦ рдХреЗ рд╕рдВрдкрд╛рджрдХ) рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдПрдХ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рд╡рд╕рд╛рдмреА рд╡реЙрд▓реЗрдЯ (рдмрд┐рдЯрдХреЙрдЗрди рд╡реЙрд▓реЗрдЯ) рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред

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

рдорд╛рдиреНрдпрддрд╛ рдкрд░рд┐рдгрд╛рдо


PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3001 рд╕рдорд╛рди рдЙрдк-рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВ 'рдирд┐рдпрдВрддреНрд░рд┐рдд Flags ' рдмрд╛рдИрдВ рдУрд░ рдФрд░ '^' рдСрдкрд░реЗрдЯрд░ рдХреЗ рджрд╛рдИрдВ рдУрд░ред WindowImpl.cs 975TwitterClientMessageHandler.cs 52

private void UpdateWMStyles(Action change) { .... var style = (WindowStyles)GetWindowLong(....); .... style = style | controlledFlags ^ controlledFlags; .... } 

рдореИрдВ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ C # рдирд┐рджрд╛рди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ред рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдиреЗ рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рдпрд╛ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдПрдХ рдЕрдЬреАрдм рдЙрдкрдпреЛрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ред рдореБрдЭреЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐

 1100 0011 | 1111 0000 ^ 1111 0000 

рдЗрд╕рдХреЗ рд╕рдорд╛рди:

 1100 0011 | 0000 0000 

рдПрдХ рдЕрдирдиреНрдп OR ("^") рдореЗрдВ рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ OR ("|") рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдСрдкрд░реЗрд╢рди рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдХреНрд░рдо рдпрд╣рд╛рдВ рдирд┐рд╣рд┐рдд рдерд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдХреЛрд╖реНрдардХ рдореЗрдВ рдкрд╣рд▓реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд▓реЗрдиреА рдЪрд╛рд╣рд┐рдП:

 private void UpdateWMStyles(Action change) { .... style = (style | controlledFlags) ^ controlledFlags; .... } 

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

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3080 рд╡рд┐рдзрд┐ рд╡рд╛рдкрд╕реА рдорд╛рди рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╢рд╛рдВрддрд┐ ред рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: TranslatePoint (...)ред VisualExtensions.cs 23

 public static Point PointToClient(this IVisual visual, PixelPoint point) { var rootPoint = visual.VisualRoot.PointToClient(point); return visual.VisualRoot.TranslatePoint(rootPoint, visual).Value; } 

рдПрдХ рдЫреЛрдЯреА рд╡рд┐рдзрд┐ред рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо dereferencing рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

 public static Point? TranslatePoint(this IVisual visual, Point point, IVisual relativeTo) { var transform = visual.TransformToVisual(relativeTo); if (transform.HasValue) { return point.Transform(transform.Value); } return null; } 

рджрд░рдЕрд╕рд▓, рдПрдХ рд╡рд╛рдкрд╕реА рд╢реВрдиреНрдп рд╣реИ ред

рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ 6 рдХреЙрд▓ рд╣реИрдВред рддреАрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореВрд▓реНрдп рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдмрд╛рдХреА рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдбреЗрд░реЗрдлреЗрд░рд┐рдВрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдФрд░ рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрдкрд░реЛрдХреНрдд рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджрд┐рдпрд╛, рдФрд░ рдЕрдиреНрдп рджреЛ рдЪреЗрддрд╛рд╡рдиреА рдпрд╣рд╛рдБ рд╣реИрдВ:

  • V3080 рд╕рдВрднрд╡ рдЕрд╢рдХреНрддрддрд╛ ред 'рдкреА' рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред VisualExtensions.cs 35
  • V3080 рд╕рдВрднрд╡ рдЕрд╢рдХреНрддрддрд╛ ред 'рдХрдВрдЯреНрд░реЛрд▓рдкреЙрдЗрдВрдЯ' рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╕реАрди .cs 176

рдореИрдВ Nullable <рд╕рдВрд░рдЪрдирд╛> рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ ред рдмрд┐рдВрджреБрд╡рд┐рд╖рдп рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ .Value рдЬрд╛рдБрдЪ рдХрд░реЗрдВ :

 public static Point PointToClient(this IVisual visual, PixelPoint point) { var rootPoint = visual.VisualRoot.PointToClient(point); if (rootPoint.HasValue) return visual.VisualRoot.TranslatePoint(rootPoint, visual).Value; else throw ....; } 

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3080 рд╡рд┐рдзрд┐ рд╡рд╛рдкрд╕реА рдорд╛рди рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╢рд╛рдВрддрд┐ ред рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: TransformToVisual (...)ред ViewportManager.cs 381

рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рдПрдХ рдорд╛рдорд▓рд╛:

 private void OnEffectiveViewportChanged(TransformedBounds? bounds) { .... var transform = _owner.GetVisualRoot().TransformToVisual(_owner).Value; .... } 

TransformToVisual рд╡рд┐рдзрд┐ рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 public static Matrix? TransformToVisual(this IVisual from, IVisual to) { var common = from.FindCommonVisualAncestor(to); if (common != null) { .... } return null; } 

рд╡реИрд╕реЗ, FindCommonVisualAncestor рд╡рд┐рдзрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреА рд╣реИ:

 public static IVisual FindCommonVisualAncestor(this IVisual visual, IVisual target) { Contract.Requires<ArgumentNullException>(visual != null); return ....FirstOrDefault(); } 

TransformToVisual рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреМ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рдд рдореЗрдВ рдЬрд╛рдБрдЪ рд╣реЛрддреА рд╣реИред рдЬрд╛рдБрдЪ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдкрд╣рд▓реА рдЪреЗрддрд╛рд╡рдиреА рдЕрдзрд┐рдХ рд╣реИ, рдФрд░ рдЕрдВрддрд┐рдо рдпрд╣рд╛рдБ рд╣реИ:

V3080 рд╕рдВрднрд╡ рдЕрд╢рдХреНрддрддрд╛ ред рдирд┐рд░реАрдХреНрд╖рдг 'рдкрд░рд┐рд╡рд░реНрддрди' рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред MouseDevice.cs 80

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3022 рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣рдореЗрд╢рд╛ рд╕рдЪ рд╣реИред рд╕рдВрднрд╡рддрдГ '&&' рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдиреИрд╡рд┐рдЧреЗрд╢рдирдбрд╛рдпрд░реЗрдХреНрд╢рди .cs 89

 public static bool IsDirectional(this NavigationDirection direction) { return direction > NavigationDirection.Previous || direction <= NavigationDirection.PageDown; } 

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

рдЪреЗрддрд╛рд╡рдиреА PVS-Studio: V3066 рд╕рдВрднрд╛рд╡рд┐рдд рдЧрд▓рдд рдЖрджреЗрд╢ 'SelectionChangedEventArgs' рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рджрд┐рдП рдЧрдП: 'рд╣рдЯрд╛рдП рдЧрдП рд╣рдЯрд╛рдП рдЧрдП' рдФрд░ 'рдЬреЛрдбрд╝реЗ рдЧрдП рдИрдореЗрд▓'ред DataGridSelectedItemsCollection.cs 338

 internal SelectionChangedEventArgs GetSelectionChangedEventArgs() { .... return new SelectionChangedEventArgs (DataGrid.SelectionChangedEvent, removedSelectedItems, addedSelectedItems) { Source = OwningGrid }; } 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЗ рджреВрд╕рд░реЗ рдФрд░ рддреАрд╕рд░реЗ рддрд░реНрдХ рднреНрд░рдорд┐рдд рд╣реИрдВред рдЪрд▓реЛ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рджреЗрдЦреЗрдВ:

 public SelectionChangedEventArgs(RoutedEvent routedEvent, IList addedItems, IList removedItems) : base(routedEvent) { AddedItems = addedItems; RemovedItems = removedItems; } 

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

рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдиреЗ рддреАрди рдФрд░ рд╕рдорд╛рди рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкрд╛рдИрдВ:

рдЪреЗрддрд╛рд╡рдиреА PVS-Studio: V3066 рд╕рдВрднрд╛рд╡рд┐рдд рдЧрд▓рдд рдЖрджреЗрд╢ 'SelectionChangedEventArgs' рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░: 'рд╣рдЯрд╛рдпрд╛' рдФрд░ 'рдЬреЛрдбрд╝рд╛' рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред AutoCompleteBox.cs 707

 OnSelectionChanged(new SelectionChangedEventArgs(SelectionChangedEvent, removed, added)); 

рд╡рд╣реА рд░рдЪрдирд╛рдХрд╛рд░ рдЪрдпрдиред

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ V3066 рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБ :

  • 'ItemRepeaterElementIndexChangedEventArgs' рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░: 'oldIndex' рдФрд░ 'newIndex' рдХреЛ рджрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рдЧрд▓рдд рдХреНрд░рдоред рдЖрдЗрдЯрдореНрд╕рд░реАрдкреНрдЯрд░ .cs 532
  • 'рдЕрдкрдбреЗрдЯ' рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рдЧрд▓рдд рдХреНрд░рдо: 'рдУрд▓реНрдбрдЗрдВрдбреЗрдХреНрд╕' рдФрд░ 'рдиреНрдпреВрдЗрдВрдбреЗрдХреНрд╕'ред рдЖрдЗрдЯрдореНрд╕рд░рдкреНрдЯрд░ .cs 536

рдИрд╡реЗрдВрдЯ рдХреЙрд▓ рдХреА рдПрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рджреЛ рдСрдкрд░реЗрд╢рдиред

 internal void OnElementIndexChanged(IControl element, int oldIndex, int newIndex) { if (ElementIndexChanged != null) { if (_elementIndexChangedArgs == null) { _elementIndexChangedArgs = new ItemsRepeaterElementIndexChangedEventArgs(element, oldIndex, newIndex); } else { _elementIndexChangedArgs.Update(element, oldIndex, newIndex); } ..... } } 

рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░ рдиреЗ рджреЗрдЦрд╛ рдХрд┐ рджреЛрдиреЛрдВ ItemRepeaterElementIndexChangedEventArgs рдФрд░ рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ, рджрд▓реАрд▓реЗрдВ рдУрд▓реНрдбрдЗрдВрдбреЗрдХреНрд╕ рдФрд░ рдиреНрдпреВрдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдХреНрд░рдо рд╣реИ:

 internal ItemsRepeaterElementIndexChangedEventArgs( IControl element, int newIndex, int oldIndex) { Element = element; NewIndex = newIndex; OldIndex = oldIndex; } internal void Update(IControl element, int newIndex, int oldIndex) { Element = element; NewIndex = newIndex; OldIndex = oldIndex; } 

рд╢рд╛рдпрдж рдХреЛрдб рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдПрдХ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖ, рдФрд░ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП - рдХреНрдпрд╛ рд╣реЛрдЧрд╛ :)

рдкрд┐рдЫрд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдЗрд╕реЗ рддреБрд░рдВрдд рд╕рдВрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИред

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3004 'рддрддреНрдХрд╛рд▓реАрди' рдХрдерди 'рдФрд░' рдХрдерди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред DataGridSortDescription.cs 235

 public override IOrderedEnumerable<object> ThenBy(IOrderedEnumerable<object> seq) { if (_descending) { return seq.ThenByDescending(o => GetValue(o), InternalComparer); } else { return seq.ThenByDescending(o => GetValue(o), InternalComparer); } } 

рдереЗрдмреА рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рдЕрддреНрдпрдВрдд рд░реЛрдЪрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред IEnumerable рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ seq рддрд░реНрдХ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ , рдПрдХ ThenBy рд╡рд┐рдзрд┐ рд╣реИ; рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рд╣рд┐рдд рдерд╛ред рдЗрд╕ рддрд░рд╣:

 public override IOrderedEnumerable<object> ThenBy(IOrderedEnumerable<object> seq) { if (_descending) { return seq.ThenByDescending(o => GetValue(o), InternalComparer); } else { return seq.ThenBy(o => GetValue(o), InternalComparer); } } 

рдЪреЗрддрд╛рд╡рдиреА PVS-Studio: V3106 рд╕рдВрднрд╛рд╡рд┐рдд рдирдХрд╛рд░рд╛рддреНрдордХ рд╕реВрдЪрдХрд╛рдВрдХ рдореВрд▓реНрдпред 'рдЗрдВрдбреЗрдХреНрд╕' рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдорд╛рди -1 рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИред рдПрдирд┐рдореЗрдЯрд░ .cs 68

 protected T InterpolationHandler(double animationTime, T neutralValue) { .... if (kvCount > 2) { if (animationTime <= 0.0) { .... } else if (animationTime >= 1.0) { .... } else { int index = FindClosestBeforeKeyFrame(animationTime); firstKeyframe = _convertedKeyframes[index]; } .... } .... } 

рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ -1 рдХрд╛ рдорд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЪрд░ FindClosestBeforeKeyFrame рд╡рд┐рдзрд┐ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рджреЗрдЦреЗрдВ:

 private int FindClosestBeforeKeyFrame(double time) { for (int i = 0; i < _convertedKeyframes.Count; i++) if (_convertedKeyframes[i].Cue.CueValue > time) return i - 1; throw new Exception("Index time is out of keyframe time range."); } 

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

 private int FindClosestBeforeKeyFrame(double time) { for (int i = 1; i < _convertedKeyframes.Count; i++) if (_convertedKeyframes[i].Cue.CueValue > time) return i - 1; throw new Exception("Index time is out of keyframe time range."); } 

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3117 рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░ 'рдлреЛрди' рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреЗрд╢ .cs 25

 public Country(string name, string region, int population, int area, double density, double coast, double? migration, double? infantMorality, int gdp, double? literacy, double? phones, double? birth, double? death) { Name = name; Region = region; Population = population; Area = area; PopulationDensity = density; CoastLine = coast; NetMigration = migration; InfantMortality = infantMorality; GDP = gdp; LiteracyPercent = literacy; BirthRate = birth; DeathRate = death; } 

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

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдЪреЗрддрд╛рд╡рдиреА: V3080 рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╢рд╛рдВрддрд┐ ред 'TabItem' рдХреЗ рдирд┐рд░реАрдХреНрд╖рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред TabItemContainerGenerator.cs 22

 protected override IControl CreateContainer(object item) { var tabItem = (TabItem)base.CreateContainer(item); tabItem.ParentTabControl = Owner; .... } 

рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдиреЗ CreateContainer рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд░реЛрдХрдирд╛ рдЦрддрд░рдирд╛рдХ рдорд╛рдирд╛ред

рдЗрд╕ рд╡рд┐рдзрд┐ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

 protected override IControl CreateContainer(object item) { var container = item as T; if (item == null) { return null; } else if (container != null) { return container; } else { .... return result; } } 

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

 protected override IControl CreateContainer(object item) { var tabItem = (TabItem)base.CreateContainer(item); if(tabItem == null) return null; tabItem.ParentTabControl = Owner; .... } 

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3142 рдЕрдиреБрдкрд▓рдмреНрдз рдХреЛрдб рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдореМрдЬреВрдж рд╣реЛред DevTools.xaml.cs 91

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

 public static void Load(object obj) { throw new XamlLoadException($"No precompiled XAML found for {obj.GetType()}, make sure to specify x:Class and include your XAML file as AvaloniaResource"); } 

рдЗрд╕ рдкрджреНрдзрддрд┐ рдкрд░ рдХреЙрд▓ рдХреЗ рдмрд╛рдж рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреИрдВрддреАрд╕ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ (!) рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдирд╛ рдЕрд╕рдВрднрд╡ рдерд╛ред рдореИрдВрдиреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рдкреВрдЫрд╛: рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ Mono.Cecil рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреВрд╕рд░реЛрдВ рдХреЗ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдХреЙрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛ред рдпрд╣ рдЖрдкрдХреЛ IL рдХреЛрдб рдореЗрдВ рд╕реАрдзреЗ рдХреЙрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

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

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

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3009 рдпрд╣ рд╡рд┐рдЪрд┐рддреНрд░ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рд╣рдореЗрд╢рд╛ рдПрдХ рдФрд░ 'рд╕рдорд╛рди' рдХрд╛ рд╕рд╣реА рдорд╛рди рджреЗрддреА рд╣реИред DataGridRows.cs 412

 internal bool ScrollSlotIntoView(int slot, bool scrolledHorizontally) { if (.....) { .... if (DisplayData.FirstScrollingSlot < slot && DisplayData.LastScrollingSlot > slot) { return true; } else if (DisplayData.FirstScrollingSlot == slot && slot != -1) { .... return true; } .... } .... return true; } 

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

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


рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЦреБрдж рдПрд╡рд▓реЛрдирд┐рдпрд╛ рдпреВрдЖрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди WPF рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рд╕реЗ рдХреЙрдкреА рдХрд┐рдП рдЧрдП рдХреЛрдб рджреНрд╡рд╛рд░рд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕реНрд░реЛрдд рдЖрдорддреМрд░ рдкрд░ рдПрдХ рднреВрдорд┐рдХрд╛ рдирд╣реАрдВ рдирд┐рднрд╛рддрд╛ рд╣реИред рдПрдХ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рдпрд╛ рдЦрд░рд╛рдмреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд░рд╛рдп рдХреЛ рдЦрд░рд╛рдм рдХрд░рддрд╛ рд╣реИред

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

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



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

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


All Articles