рдмрд┐рдирд╛ рдХрдмреНрдЬ рдХреЗ рдХреИрд╕реЗ рд░рд╣реЗрдВ?

рдЕрдХреНрд╕рд░ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдХрд┐рд╕реА рд╡рд┐рдзрд┐ рд╕реЗ рдЧреБрдЬрд╛рд░рддреЗ рд╣реБрдП, рд╣рдо рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ: "рдпрд╣рд╛рдБ, рдЗрд╕ рд╡рд╕реНрддреБ рдХреЛ рдзрд╛рд░рдг рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ," рдФрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЗрд╕реЗ рдиреЛрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓рд╛рдн рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ: рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ рдХреЛрдб рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЕрдзрд┐рдХ рдкрдардиреАрдп рднреА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкрджреНрдзрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмреНрдпрд╛рдЬ рдХреА рд╡рд╕реНрддреБ рдХреИрд╕реЗ рдФрд░ рдХрд╣рд╛рдБ рдмрджрд▓рддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреА рдЧрддрд┐ рдХреЛ рд╡рд┐рдзрд┐ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдмрд╣реБрдд рд╣реА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рджреНрд╡рд╛рд░рд╛, рдПрдХ рдбрд┐рдЧреНрд░реА рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдФрд░ рдкреНрд▓рд╕ рд╣реИ рдереНрд░реЗрдб рд╕реЗрдлреНрдЯреА, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗрд╡рд▓ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
C / C ++ рдореЗрдВ, рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓ рдХреАрд╡рд░реНрдб рдореМрдЬреВрдж рд╣реИред рдХрдИ рдХрд╣реЗрдВрдЧреЗ рдХрд┐ рдРрд╕рд╛ рддрдВрддреНрд░ рдмрд╣реБрдд рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, C # рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИред рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ (рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЗрдирдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рдЕрдм рдХреНрдпрд╛ рд╣реЛрдЧрд╛?


1. рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд╕реНрддреБрдПрдБ

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

2. рдЗрдВрдЯрд░рдлрд╝реЗрд╕

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

interface IVectorConst<out T> { T this[int nIndex] { get; } } class Vector<T> : IVectorConst<T> { private readonly T[] _vector; public Vector(int nSize) { _vector = new T[nSize]; } public T this[int nIndex] { get { return _vector[nIndex]; } set { _vector[nIndex] = value; } } } void ReadVector(IVectorConst<int> vector) { ... } 


(рд╡реИрд╕реЗ, рд╡реЗрдХреНрдЯрд░ рдФрд░ IVectorConst (рдпрд╛ IVectorReader - рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ) рдХреЗ рдмреАрдЪ рдЖрдк рдПрдХ рдХрдВрдЯреНрд░рд╛рд╡рд┐рд░реЗрдВрдЯ IVectorWriter рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред)

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

3. "рдПрдбреЗрдкреНрдЯрд░" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд╕реНрддреБ рдХрд╛ рдкреГрдердХреНрдХрд░рдг

рд╣рдо рдЙрдкрд░реНрдпреБрдХреНрдд рдбрд╛рдЙрдирдХрд╛рд╕реНрдЯ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡реЗрдХреНрдЯрд░ IVectorConst рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдЗрд╕реЗ рдЕрд▓рдЧ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдПрдХ рд╡реЗрдХреНрдЯрд░рдХреЙрдиреНрд╕реНрдЯ "рдПрдбреЗрдкреНрдЯрд░" рдмрдирд╛рдирд╛ рд╣реИ (рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрд╕реНрдореАрд░реНрдиреЛрд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рд▓реЗрдЦ рдЕрдзреВрд░рд╛ рд╣реЛрдЧрд╛)ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 interface IVector<in T> { T this[int nIndex] { set; } } interface IVectorConst<out T> { T this[int nIndex] { get; } } class VectorConst<T> : IVectorConst<T> { private readonly Vector<T> _vector; public VectorConst(Vector<T> vector) { _vector = vector; } public T this[int nIndex] { get { return _vector[nIndex]; } } } class Vector<T> : IVector<T> { private readonly T[] _vector; public Vector(int nSize) { _vector = new T[nSize]; } public T this[int nIndex] { get { return _vector[nIndex]; } set { _vector[nIndex] = value; } } public IVectorConst<T> AsConst { get { return new VectorConst<T>(this); } } } 


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

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

4. рдПрдХ рд╕реНрдерд┐рд░ рд╡рд╕реНрддреБ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреГрдердХреНрдХрд░рдг

рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 interface IVectorConst<out T> { T this[int nIndex] { get; } } interface IVector<in T> { T this[int nIndex] { set; } } struct VectorConst<T> : IVectorConst<T> { private readonly T[] _vector; public VectorConst(T[] vector) { _vector = vector; } public T this[int nIndex] { get { return _vector[nIndex]; } } } struct Vector<T> : IVector<T> { private readonly T[] _vector; private readonly VectorConst<T> _reader; public Vector(int nSize) { _reader = new VectorConst<T>(_vector = new T[nSize]); } public T this[int nIndex] { set { _vector[nIndex] = value; } } public VectorConst<T> Reader { get { return _reader; } } public static implicit operator VectorConst<T>(Vector<T> vector) { return vector._reader; } } 


рдЕрдм рд╣рдорд╛рд░рд╛ рд╡реЗрдХреНрдЯрд░рдХреЙрдиреНрд╕реНрдЯ рди рдХреЗрд╡рд▓ рдЕрд▓рдЧ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд╣ рд╕рдм рдЬреЛ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдерд╛ t.z. рдкреНрд░рджрд░реНрд╢рди, рд╡реЗрдХреНрдЯрд░рд╡реЗрдпрд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЖрд░рдВрднреАрдХрд░рдг рд╣реИ рдЬреЛ _vector рдХреЗ рд▓рд┐рдВрдХ рдФрд░ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд┐рдВрдХ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдХрд░ рдХрд░рддрд╛ рд╣реИред рдЬрдм рд╡реЗрдХреНрдЯрд░рдХреЙрдиреНрд╕реНрдЯ рдХреЛ рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЙрд▓ рдФрд░ рдПрдХ рд╣реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдпрд╣ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд▓рдЧрднрдЧ T [] рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде (рдЬреЛ рд╣рдордиреЗ рд╣рд╛рд╕рд┐рд▓ рдХреА)ред рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╡реЗрдХреНрдЯрд░рдХреЙрдирд╕реНрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдХреНрдЯрд░ рдЙрджрд╛рд╣рд░рдг рдкрд╛рд╕ рдХрд░рддреЗ рд╕рдордп, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд░реАрдбрд░ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рди рдХрд░реЗрдВ, рдЖрдк рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдСрдкрд░реЗрдЯрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

 public static implicit operator VectorConst<T>(Vector<T> vector) { return vector._reader; } 


рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕реАрдзреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рд░реАрдбрд░ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдХреЙрд▓ рдХрд┐рдП рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ:

 var v = new Vector<int>(5); v[0] = 0; Console.WriteLine(v.Reader[0]); 


рдФрд░ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЕрдЧрд░ рд╣рдореЗрдВ рдЖрдИрд╡реЗрдХреНрдЯрд░рдХреЙрдиреНрд╕реНрдЯ рдХреЗ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ (рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд╡рдЬреВрдж) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 class A { } class B : A { } private static void ReadVector(IVectorConst<A> vector) { ... } var vector = new Vector<B>(); ReadVector(vector.Reader); 


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

рдХрдИ рд▓реЛрдЧ рд╢рд╛рдпрдж рдХрд╣реЗрдВрдЧреЗ рдХрд┐ рдпреЗ рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рд╕рддреНрдп рд╣реИрдВред рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдпрд╣ рд▓реЗрдЦ рдФрд░ рдпреЗ рд╕рд░рд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗред

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


All Articles