"
рдордЬрдмреВрдд рдкреНрд░рдХрд╛рд░ рдирд┐рдпрдВрддреНрд░рдг: " рд▓реЗрдЦ рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж
рдЬрд╣рд╛рдВ рдПрдХ рдареЗрда рд╕реА # -рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрдордЬреЛрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдПрдХ рдЕрд╡рд╛рдВрдЫрд┐рдд рддрддреНрд╡ рд╣реЛрддрд╛ рд╣реИ? "рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЧрд┐рд░рд╛рд╡рдЯ рд╕реЗ рдХрд╛рдлреА рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдерд╛, рдФрд░ рдЗрд╕ рддрдереНрдп рд╕реЗ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ред
рдкреЛрд╕реНрдЯ рдХрд╛ рд▓реЗрдЦрдХ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддреА рд╣реИ рдЬрд┐рд╕рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рднрдВрдбрд╛рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рдкрд╕ рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдЕрд╢рдХреНрдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╡рд╣ рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЙрдирдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдЦрдВрдбрди рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЧрд┐рд░рд╛рд╡рдЯ рдХреЛ рджреВрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ
GetItem
рд╡рд┐рдзрд┐ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рднрдВрдбрд╛рд░ рд╕реЗ рдПрдХ рд╡рд╕реНрддреБ рдорд┐рд▓рддреА рд╣реИ рдФрд░, рд▓реЗрдЦрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╕реНрддреБ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛрдЧреАред
public Item GetItem(int itemId) { return dataAccessor.getItemById(itemId); }
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╡рд╕реНрддреБ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдирд╣реАрдВ рдереА, рддреЛ
dataAccessor
рдирд▓ рдХреЛ рд▓реМрдЯрд╛ рджреЗрдЧрд╛, рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╡рд╣, рдирд▓ рдХреЗ рд▓рд┐рдП рдорд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд┐рдП рдмрд┐рдирд╛, NullReferenceException рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред рддреЛ рдХреЛрдИ рдХреИрд╕реЗ рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛?
рдЖрдк рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЕрд╢рдХреНрдд рдЬрд╛рдВрдЪ рдХреЛ рдирд┐рдЪреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╕реНрддреБ рдирд╣реАрдВ рдорд┐рд▓рдиреЗ рдкрд░ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде рд╣рдо рдХреЗрд╡рд▓ NullReferenceException рдХрд╛ рдирд╛рдо рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ItemNotFoundExceptionред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдм рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрд╢рд┐рд╢-рдкрдХрдбрд╝ рдмреНрд▓реЙрдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЧреНрд░рд╛рд╣рдХ рд▓реЗрдЦрдХ рдмрд╣реБрдд рдЦреБрд╢ рд╣реЛрдЧрд╛ред
рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рдкреЛрд╕реНрдЯ-рдХрдВрдбреАрд╢рди рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдЗрд╕ рддрд░рд╣:
public Item GetItem(int itemId) { Contract.Ensures(Contract.Result<Item>() != null); return dataAccessor.GetItemById(itemId); }
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдХрдо рдмрд┐рд▓реНрд▓реА рдХреЗ рдмрдЪреНрдЪреЗ рд╣реЛрддреЗ рд╣реИрдВред рдЕрдиреБрдмрдВрдз рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдХрд┐рд╕реА рдХреЛ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рд╣рдореЗрд╢рд╛ рдХрд┐рд╕реА рднреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде, рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧреАред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рд╡рд┐рдзрд┐ рдЗрд╕ рдмрд╛рдд рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗ рд╕рдХрддреА рдХрд┐ рдЗрд╕ рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╡рд╕реНрддреБ рднрдВрдбрд╛рд░ рдореЗрдВ рд╣реИред рддреЛ рдЖрдкрдХреЛ рдПрдХ рдкреВрд░реНрд╡ рд╢рд░реНрдд рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬреЛ рдЧрд░реАрдм рд╕рд╛рдереА рдХреА рдорджрдж рдХрд░реЗ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдзрдХреЗрд▓ рджреЗ:
public Item GetItem(int itemId) { Contract.Requires(dataAccessor.GetItemById(itemId) != null) Contract.Ensures(Contract.Result<Item>() != null); return dataAccessor.GetItemById(itemId); }
рдордЬрд╝рд╛ рд╣реИ, рд╣реИ рдирд╛? рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВ рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХрд┐рд╕ рд▓рд┐рдП ...
рд╕рдЪреНрдЪрд╛рдИ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ
рдЪрдореНрдордЪ рдирд╣реАрдВ рд╣реИ
, рдХреЛрдИ рднреА рднрдВрдбрд╛рд░ рдореЗрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЧрд╛рд░рдВрдЯреА
рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдЙрд╕реЗ рдмрдирд╛рдирд╛ рдФрд░ рдЙрд╕рдХреА рдХрдбрд╝реА рдХреЛ рдЪреБрдЯрдХреА рдореЗрдВ рд▓реЗрдирд╛ рд╣реИред рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдЦрд░рд╛рдм рдбрд┐рдЬрд╛рдЗрди рд╣реИред рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рд▓реЗрдпрд░ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╣ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рдпрд╣ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЦрд░рд╛рдм рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рд╕реНрддрд░ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
рджреГрд╢реНрдпрддрд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдмрд╛рд╣рд░ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рдКрдкрд░ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдкрд░ рд▓реЗрдЦ рдореЗрдВ рджрд┐рдП рдЧрдП рджреВрд╕рд░реЗ рд╡рд┐рдЪрд╛рд░ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИред рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╢рдХреНрдд рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред I rephrase: nullable referenceред рддреЗрд▓ рддреЗрд▓ рд╣реИред рдЗрд╕ рдкреИрдЯрд░реНрди рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрдирд╛ рдЕрдЬреАрдм рдерд╛ред
рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдЕрд╢рдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдХреНрдпреЛрдВ рдбрд╛рд▓реЗрдВ рдФрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ HasValue рдЧреБрдг рдЬреЛрдбрд╝реЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред HasValue рдкрд░ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП? рдЗрд╕ рдЪреЗрдХ рдХреЗ рдмрд┐рдирд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдХреНрдпрд╛ рд░реЛрдХрддрд╛ рд╣реИ? рдЖрдк рдЕрд╕рдорд╛рдирддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрд╢рдХреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдкреИрдЯрд░реНрди рди рдХреЗрд╡рд▓ рдмреЗрдХрд╛рд░ рд╣реИ, рдмрд▓реНрдХрд┐ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рднреА рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
public Maybe<Item> SomeMethod() { var mbItem = GetMbItem(); if(mbItem.HasValue) { var item = mbItem.Value; ModifyItem(ref item); } return mbItem; }
рдпрджрд┐ RevItem рд╡рд┐рдзрд┐ рдиреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рддреЛ SomeMethod рдкрджреНрдзрддрд┐ рдкреБрд░рд╛рдиреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрдЯреЗрдирд░ рд▓реМрдЯрд╛рдПрдЧреАред рдмрд╛рдж рдореЗрдВ рдЬрд╛рдПрдВ, рдЗрд╕ рдмрдЧ рдХреЛ рджреЗрдЦреЗрдВред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореБрдЭреЗ рдЙрд╕ рд▓реЗрдЦ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдЕрднреНрдпрд╛рд╕ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд▓рдЧрддрд╛ рд╣реИред C # рдореЗрдВ рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрднреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЙрдкрдХрд░рдг рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ NullReferenceException рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдЕрдЦрдВрдбрддрд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЖрдк рдЗрд╕рд╕реЗ рджреВрд░ рдирд╣реАрдВ рднрд╛рдЧрддреЗред рдпрджрд┐ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдХреЛрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╡рд╣рд╛рдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдпрд╣ рдмрд╣реБрдд, рдмрд╣реБрдд рдмреБрд░рд╛ рд╣реИред