рд╣рдо рдЯрд╛рдЗрдк рдХрдВрдЯреНрд░реЛрд▓ рдХреЛ рдордЬрдмреВрдд рдХрд░рддреЗ рд╣реИрдВ: рдЬрд╣рд╛рдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реА # -рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрдордЬреЛрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдПрдХ рдЕрд╡рд╛рдВрдЫрд┐рдд рддрддреНрд╡ рд╣реЛрддрд╛ рд╣реИ?

рд╕рдорд╕реНрдпрд╛


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

рдХреЛрдб рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

public interface IUserRepo { User Get(int id); User Find(int id); } 

рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд┐рдкреНрдкрдгреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: тАЬрд╣рдореЗрд╢рд╛ рд░рд┐рдЯрд░реНрди рд╢реВрдиреНрдп рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рд╡рд╕реНрддреБ рдирд╣реАрдВ рдорд┐рд▓реА рд╣реИ рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ; рдФрд░ рдвреВрдВрдвреЗрдВ, рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рдЕрд╢рдХреНрдд рд╣реИред рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╣рд┐рдд "рд╡рд╛рдВрдЫрд┐рдд" рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдЕрд▓рдЧ рд╣реИрдВ: "рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рдФрд░ "рд╢рд╛рдпрдж рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛"ред рдФрд░ "рдШреЛрд╖рд┐рдд" рдкреНрд░рдХрд╛рд░ рдПрдХ рдФрд░ рдПрдХ рд╣реА рд╣реИред рдпрджрд┐ рднрд╛рд╖рд╛ рд╣рдореЗрдВ рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреА рдкрд╣рд▓ рдкрд░ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдирд┐рд░реНрдгрдп


рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, F # рдореЗрдВ, рдПрдХ рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░ рд╣реИ FSharpOption <T>, рдЬреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпрд╛ рддреЛ рдЯреА рдХрд╛ рдПрдХ рдорд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдХреНрдпрд╛ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ, рдЬрд┐рд╕рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рдбрд┐рдЧреНрд░реА рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдЪрд┐рддреЛрдВ рдХреА рдбрд┐рдЧреНрд░реА рд╢рд╛рдорд┐рд▓ рд╣реЛред
рдЗрд╕ рдХрд╛рд▓реНрдкрдирд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ рдЕрдкрдиреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 public interface IUserRepo { User Get(int id); Maybe<User> Find(int id); } 

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

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдлрд╛рдЗрдВрдб рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рд╢рд╛рдпрдж рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдЧрд╛ <User> .Nothingред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЛрдИ рднреА рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреВрд▓ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдЖрдЧреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рднрдВрдбрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ:

 //      null var user = repo.Find(userId); //    User,  Maybe<User> var userName = user.Name; //  ,  Maybe  Name var maybeUser = repo.Find(userId); //    , string userName; if (maybeUser.HasValue) //           { var user = maybeUser.Value; userName = user.Name; } else userName = "unknown"; 

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

 string userName = repo.Find(userId).Select(u => u.Name).OrElse("unknown"); 

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдХрд░реАрдм рд╣реИрдВ рдФрд░ рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ "рдХрд╛рд░реНрдпрд╛рддреНрдордХ" рд╢реИрд▓реА рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 string userName = (from user in repo.Find(userId) select user.Name).OrElse("unknown"); 

рдпрд╛, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ:

 ( from roleAProfile in provider.FindProfile(userId, type: "A") from roleBProfile in provider.FindProfile(userId, type: "B") from roleCProfile in provider.FindProfile(userId, type: "C") where roleAProfile.IsActive() && roleCProfile.IsPremium() let user = repo.GetUser(userId) select user ).Do(HonorAsActiveUser); 

рдЗрд╕рдХреЗ рд╕рдорддреБрд▓реНрдп рд╕рдордХрдХреНрд╖ рдХреЗ рд╕рд╛рде:

 var maybeProfileA = provider.FindProfile(userId, type: "A"); if (maybeProfileA.HasValue) { var profileA = maybeProfileA.Value; var maybeProfileB = provider.FindProfile(userId, type: "B"); if (maybeProfileB.HasValue) { var profileB = maybeProfileB.Value; var maybeProfileC = provider.FindProfile(userId, type: "C"); if (maybeProfileC.HasValue) { var profileC = maybeProfileC.Value; if (profileA.IsActive() && profileC.IsPremium()) { var user = repo.GetUser(userId); HonorAsActiveUser(user); } } } } 

рдЗрд╕рдХреЗ рдЕрдкрдиреЗ рдирд┐рдХрдЯ рд╕рдВрдмрдВрдзреА рдХреЗ рд╕рд╛рде рд╢рд╛рдпрдж <T> рдХреЗ рдПрдХреАрдХрд░рдг рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - IEnumerable <T>, рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рд░реВрдк рдореЗрдВ:

 var admin = users.MaybeFirst(u => u.IsAdmin); //  FirstOrDefault(u => u.IsAdmin); Console.WriteLine("Admin is {0}", admin.Select(a => a.Name).OrElse("not found")); 

рдЙрдкрд░реЛрдХреНрдд "рд╕рдкрдиреЛрдВ" рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ


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

Nuget рдкреИрдХреЗрдЬ рдирд╛рдо рдФрд░ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдХрд╛рд░HasValueрдореВрд▓реНрдпFluentAPILINQ рд╕рдорд░реНрдердиIEnumerable рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдгрдиреЛрдЯреНрд╕ рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб
рд╡рд┐рдХрд▓реНрдк, рд╡рд░реНрдЧрд╡рд╣рд╛рдБ рд╣реИрдирд╣реАрдВ, рдХреЗрд╡рд▓ рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рдирдиреНрдпреВрдирддрдордирд╣реАрдВрдирд╣реАрдВgithub.com/tejacques/Option
Strilanc.Value.May, рд╕рдВрд░рдЪрдирд╛рд╡рд╣рд╛рдБ рд╣реИрдирд╣реАрдВ, рдХреЗрд╡рд▓ рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рдирдзрдиреАрд╡рд╣рд╛рдБ рд╣реИрд╡рд╣рд╛рдБ рд╣реИрдордИ рдореЗрдВ рдПрдХ рд╡реИрдз рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╢реВрдиреНрдп рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ
github.com/Strilanc/May
рд╡рд┐рдХрд▓реНрдк, рд╕рдВрд░рдЪрдирд╛рд╡рд╣рд╛рдБ рд╣реИрд╡рд╣рд╛рдБ рд╣реИрдФрд╕рддрд╡рд╣рд╛рдБ рд╣реИрд╡рд╣рд╛рдБ рд╣реИрдпрд╛ рддреЛ рдкреНрд░рдХрд╛рд░ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИред
github.com/davidsidlinger/options
рдиреЗрд╡рд░рдирд▓ рдХреНрд▓рд╛рд╕рд╡рд╣рд╛рдБ рд╣реИрд╡рд╣рд╛рдБ рд╣реИрдФрд╕рддрдирд╣реАрдВрдирд╣реАрдВgithub.com/Bomret/NeverNull
рдХрд╛рд░реНрдпрд╛рддреНрдордХрд╡рд╣рд╛рдБ рд╣реИрд╡рд╣рд╛рдБ рд╣реИрдзрдиреАрд╡рд╣рд╛рдБ рд╣реИрд╡рд╣рд╛рдБ рд╣реИgithub.com/AndreyTsvetkov/Functional.Maybe
рд╢рд╛рдпрдж рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ--рдиреНрдпреВрдирддрдордирд╣реАрдВ-рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рддрд░реАрдХреЗ рд╕рд╛рджреЗ рдирд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ
github.com/hazzik/Maybe
рдЕрджреНрдпрддрди: рдпрд╣рд╛рдБ рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдФрд░ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде mezastel рд╕реЗ рдПрдХ рд╕реНрдХреНрд░реАрдирдХрд╛рд╕реНрдЯ рд╣реИ: www.techdays.ru/videos/44.html
WeeGems.Options, рд╕рдВрд░рдЪрдирд╛рд╡рд╣рд╛рдБ рд╣реИрд╡рд╣рд╛рдБ рд╣реИрдиреНрдпреВрдирддрдордирд╣реАрдВрдирд╣реАрдВрдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рднреА рд╣реИрдВ: рдЬреНрдЮрд╛рдкрди, рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЖрдВрд╢рд┐рдХ рдЙрдкрдпреЛрдЧ
bitbucket.org/MattDavey/weegems

рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдиреЗ рдЕрдкрдирд╛ рдкреИрдХреЗрдЬ рдмрдврд╝рд╛ рджрд┐рдпрд╛ рд╣реИ, рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

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

рд╕рдмрд╕реЗ рдЕрдореАрд░ рдкреИрдХреЗрдЬ Strilanc.Value.Maybe рд╣реИрдВ ( рдпрд╣рд╛рдВ рд▓реЗрдЦрдХ рдмрддрд╛рддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдХреНрдпреЛрдВ (рдирд▓) .ToMaybe () рд╢рд╛рдпрдж рдПрдХ рд╣реА рдирд╣реАрдВ рд╣реИред рдирдерд┐рдВрдЧ), Functional.Maybe, рд╡рд┐рдХрд▓реНрдкред

рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдЪреБрдиреЗрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, Microsoft рд╕реЗ рдПрдХ рдорд╛рдирдХ рд╕рдорд╛рдзрд╛рди , рд╕рд╛рде рд╣реА C #, рдЯреБрдкрд▓реНрд╕ рдЖрджрд┐ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ :) рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд░реБрдХреЛ рдФрд░ рджреЗрдЦреЛред

UPD: рдХреЙрдорд░реЗрдб aikixd рдиреЗ рдПрдХ рд╡рд┐рд░реЛрдзреА рд▓реЗрдЦ рд▓рд┐рдЦрд╛ред

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


All Articles