рдЖрдЬ, рдореБрдЭреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкреВрд░реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреА рдЪреБрдиреМрддреА рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЕрд░реНрдерд╛рддреН рдбреАрдкрдХреНрд▓реЛрдиред рдХреБрдЫ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдФрд░ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕реНрд░реЛрдд рд╡рд░реНрдЧ:
class ClassForClone {
рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░рддреЗ рд╣реБрдП рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
MemberwiseClone () рдСрдмреНрдЬреЗрдХреНрдЯред рдпрд╣ рд╣рдореЗрдВ рдЦреЗрддреЛрдВ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рдиреАрд░рд╕ рдХрд╛рдо рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рд╡рд╛рд▓реЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЦреБрдж рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореБрдЭреЗ рдХрдо рд╕реЗ рдХрдо рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ:
- рд╕рдВрджрд░реНрднрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ a рдФрд░ lazy рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдирд┐рд░реНрдорд╛рддрд╛ рдпрд╛ рд╕реАрдзреЗ рдХрд┐рд╕реА рдХреНрд╖реЗрддреНрд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╕рдордп рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
- рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЙрд╕реА рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛрдб рдореЗрдВ рдФрд░ рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛрдб рджреЛрдиреЛрдВ рдореЗрдВ рдХреБрдЫ рднреНрд░рдо рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИред
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдорд╛рди рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рд░реАрдб-рдУрдирд▓реА рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдмрджрд▓рдХрд░ рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
public A a { get; private set; } public Lazy<string> lazy { get; private set; }
рдЕрдм рдПрдХ рдФрд░ рдЖрд▓рд╕реА рдХреЛ рди рдХреЗрд╡рд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдФрд░ рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рдордп рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЖрдо рддреМрд░ рдкрд░ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЗ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдХреЗ рднреАрддрд░ рднреА рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдо рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдЖрдЗрдП рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рдпрджрд┐ рд░реЗрдЦрд╛ рдЗрд╕ред рдП = рдП; рдкрд╣рд▓реА рдирдЬрд░ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рддреЛ рдПрдХ рд▓рдВрдмреЛрджрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред
Func1 рдХреЛ рд╡рд░реНрдЧ рдХреЗ рд╡рд░реНрддрдорд╛рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╛рдкрд╕реА рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреИрд╕реЗ рдХрд░реЗрдВред рдХреБрдЫ рдХрд╕реНрдЯрдо рд▓рд╛рдЗрди? рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд▓реЗрдЦрдХ рдиреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдирд┐рд╣рд┐рдд рдХрд┐рдпрд╛, рди рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдХреАрд╡рд░реНрдб рдХреЗ рдмрд┐рдирд╛ред рдФрд░, рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдереА, рдХреНрдпреЛрдВрдХрд┐ рдлрд╝реАрд▓реНрдб рдХреЛ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдлрд╝реАрд▓реНрдб рдЕрдм рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рд▓рдВрдмреЛрджрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ SomeText рдлрд╝реАрд▓реНрдб / рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рдПрдЧрд╛! рдФрд░ рдЬрдм рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рдЬрд╝реНрдЬрд╝реЗ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рдХреНрд╖реЗрддреНрд░ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдЪреВрдБрдХрд┐ рд╣рдордиреЗ рд╕рдорд╛рди рдЧреБрдгреЛрдВ рд╡рд╛рд▓реЗ рд░реАрдб-рдУрдирд▓реА рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд▓реИрдореНрдмрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
public ClassForClone(A a) { this.a = a; lazy = new Lazy<string>(() => {
рд▓реЗрдХрд┐рди рд╕реНрдерд┐рддрд┐ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рдлрд╝реАрд▓реНрдб / рдЧреБрдгреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
public ClassForClone(A aParam) { a = aParam; lazy = new Lazy<string>(() => {
рдЕрдм рдХреНрд▓реЛрдирд┐рдВрдЧ рдлрдВрдХреНрд╢рди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдмрд╕ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:
public object DeepClone() { var clone = (ClassForClone) MemberwiseClone(); clone.a = new A(); clone.lazy = new Lazy<string>(() => { Func1(); return a.SomeText; }); return clone; }
рдлрд┐рд░ рд╕реЗ, рд╣рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреМрди рд╕реА рд╡рд╕реНрддреБ рдмрдВрдж рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реЛрдЧреАред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдореВрд▓ рд╡рд╕реНрддреБ рдХреЗ Func1 рдФрд░ a.SomeText рдХреЛ рдХреНрд▓реЛрди рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:
public object DeepClone() { var clone = (ClassForClone) MemberwiseClone(); clone.a = new A(); clone.lazy = new Lazy<string>(() => { clone.Func1(); return clone.a.SomeText; }); return clone; }
рдЗрд╕рд╕реЗ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:
- рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдХреНрд╖реЗрддреНрд░реЛрдВ / рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдпрд╛ рдПрдХ рд╕рдордЭреМрддреЗ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдлрд╝реАрд▓реНрдб рддрдХ рдкрд╣реБрдВрдЪ рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддреА рд╣реИред
- рдмрдВрджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВред рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╡рд╕реНрддреБ рдореЗрдВ рдЪрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдпрд╛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреНрдпрд╛ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред
- рдХреНрд▓реЛрдЬрд░ рдХреЛ рд╡реИрд░рд┐рдПрдмрд▓ рд▓реВрдк рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд╣рд╛рдиреА рд╣реИ ред