рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд░рд╛рд╕рдд рдФрд░ рдЕрдиреБрдмрдВрдз

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

рдпрд╣ рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: ContractClassAttribute , рдЬреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпрд╛ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдкрд░ рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ ContractClassForAttribute - рдЬрд┐рд╕реЗ рдЕрдиреБрдмрдВрдз рдкрд░ рд╣реА рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

/// <summary> /// Custom collection interface /// </summary> [ContractClass(typeof(CollectionContract))] public interface ICollection { void Add(string s); int Count { get; } bool Contains(string s); } /// <summary> /// Contract class for <see cref="ICollection"/>. /// </summary> [ContractClassFor(typeof(ICollection))] internal abstract class CollectionContract : ICollection { public void Add(string s) { Contract.Ensures(Count >= Contract.OldValue(Count)); Contract.Ensures(Contains(s)); } public int Count { get { Contract.Ensures(Contract.Result<int>() >= 0); return default(int); } } [Pure] public bool Contains(string s) { return default(bool); } } 


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

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

 internal class CustomCollection : ICollection { private readonly List<string> _backingList = new List<string>(); public void Add(string s) { // Ok, we're crazy enough to violate precondition // of ICollection interface if (Contains(s)) _backingList.Remove(s); else _backingList.Add(s); } public int Count { get { // We should add some hints to static checker to eliminate a warning Contract.Ensures(Contract.Result<int>() == _backingList.Count); return _backingList.Count; } } public bool Contains(string s) { return _backingList.Contains(s); } } 


рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рд╣реЛрддрд╛ рд╣реИ: рд╕реНрдЯреЗрдЯрд┐рдХ рдЪреЗрдХрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдРрдб рдореЗрдердб рдХрд╛ рдЙрддреНрддрд░ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ (рдЬрдм рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рддрддреНрд╡ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рд╣рдЯрд╛рддреЗ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЙрд╕ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдЕрдиреБрдмрдВрдз рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

 [Test] public void TestAddTwiceAddsTwoElements() { var collection = new CustomCollection(); int oldCount = collection.Count; collection.Add(""); collection.Add(""); Assert.That(collection.Count, Is.EqualTo(oldCount + 2)); } 


рдЬрдм Assert рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ ред рд╡рд╣ , рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдЬрдм рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдРрдб рдореЗрдердб рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛: System.Diagnostics.Contracts .__ ContractsRuntime + ContractException: рдкреЛрд╕реНрдЯрдХрдВрдбрд┐рд╢рди рд╡рд┐рдлрд▓: рдХрд╛рдЙрдВрдЯ> = Contract.OldValue (рдХрд╛рдЙрдВрдЯ)

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

рдкреВрд░реНрд╡рдЧрд╛рдореА рдХрдордЬреЛрд░ рдкрдбрд╝рдиреЗ рдФрд░ рдкреЛрд╕реНрдЯрдХрдВрдбрд┐рд╢рди рдХреЛ рдордЬрдмреВрдд рдХрд░рдирд╛


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

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

 class Base { public virtual object Foo(string s) { Contract.Requires(!string.IsNullOrEmpty(s)); Contract.Ensures(Contract.Result<object>() != null); return new object(); } } class Derived : Base { public override object Foo(string s) { // Now we're requiring empty string Contract.Requires(s != null); // And returning only strings Contract.Ensures(Contract.Result<object>() is string); return s; } } 


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

рдиреЛрдЯ
рдкреЛрд╕реНрдЯрдХреЙрдиреНрдбрд┐рд╢рди рд╕реБрджреГрдвреАрдХрд░рдг рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧреЛрдВ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╛рдкрд╕реА рдХрд░ рд╕рдХреЗрдВред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд░рд┐рдЯрд░реНрди рдЯрд╛рдЗрдк рдХреЛрд╡рд░рд┐рдпрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ C ++ рдпрд╛ Java рдЬреИрд╕реА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдпрджрд┐ C # рдиреЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рд╣реИ, рддреЛ Derived.Foo рд╡рд┐рдзрд┐ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдПрдХ рд╡рд╕реНрддреБ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреВрд░реНрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдХрдордЬреЛрд░ рдХрд░рдиреЗ рдФрд░ рдкреЛрд╕реНрдЯрдХрдВрдбрд┐рд╢рди рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг C # рднрд╛рд╖рд╛ рдХреЗ 4 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЙрдкрд▓рдмреНрдз рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╕рд╣-рдкреНрд░рдЪрд╛рд░ рдФрд░ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реИред рдЕрдиреБрдмрдВрдз рджреНрд╡рд╛рд░рд╛ рд▓реЗрдЦ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рд╢рд░реНрддреЛрдВ рдХреА "рдХрдареЛрд░рддрд╛" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрдврд╝реЗрдВ ред рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ , рдФрд░ рдЕрдиреБрдмрдВрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рдЕрдиреБрдмрдВрдз рджреНрд╡рд╛рд░рд╛ рд▓реЗрдЦ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВред рд╡рд┐рд░рд╛рд╕рдд ред

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

рдкреЛрд╕реНрдЯрдХрдВрдбрд┐рд╢рди рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕реЗрд╕


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

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

 [ContractClass(typeof(ListContract))] public interface IList : ICollection { } [ContractClassFor(typeof(IList))] internal abstract class ListContract : IList { public void Add(string s) { // Lets create stronger postcondition than ICollection.Add Contract.Ensures(Count == Contract.OldValue(Count) + 1); } //   Count   Contains   } 


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

 public class CustomList : IList { private readonly List<string> _backingList = new List<string>(); public void Add(string s) { // IList postcondition is Count = OldCount + 1, // we're violating it _backingList.Add(s); _backingList.Add(s); } public int Count { get { return _backingList.Count; } } public bool Contains(string s) { return _backingList.Contains(s); } } 


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

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

рдЯреА рдФрд░ рдЖрдИрд▓рд┐рд╕реНрдЯ рдСрдл рдЯреА рдХреЗ рд╕рдВрд╡рд┐рджрд╛ ICollection


рдпрджрд┐ рдЖрдк mscorlib рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдЦреБрджрд╛рдИ рдХрд░рддреЗ рд╣реИрдВ ред рд╕рдВрд╡рд┐рджрд╛ред dll , рдЬреЛ рдХреЛрдб рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдЖрдк рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдорд╛рдирдХ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ T рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ T рдФрд░ IList рдХреЗ рдореБрдЦреНрдп ICollection рдХреЗ рдЕрдиреБрдмрдВрдз рд╣реИрдВ:

 // From mscorlib.Contracts.dll [ContractClassFor(typeof(ICollection<>))] internal abstract class ICollectionContract<T> : ICollection<T>, IEnumerable<T>, IEnumerable { public void Add([MarshalAs(UnmanagedType.Error)] T item) { Contract.Ensures(this.Count >= Contract.OldValue<int>(this.Count), "this.Count >= Contract.OldValue(this.Count)"); } public void Clear() { Contract.Ensures(this.Count == 0, "this.Count == 0"); } public int Count { get { int num = 0; Contract.Ensures(Contract.Result<int>() >= 0, "Contract.Result<int>() >= 0"); return num; } } } // From mscorlib.Contracts.dll [ContractClassFor(typeof (IList<>))] internal abstract class IListContract<T> : IList<T>, ICollection<T>, IEnumerable<T>, IEnumerable { void ICollection<T>.Add([MarshalAs(UnmanagedType.Error)] T item) { Contract.Ensures(this.Count == (Contract.OldValue<int>(this.Count) + 1), "Count == Contract.OldValue(Count) + 1"); } public int Count { get { int num = 0; return num; } } } 


рдиреЛрдЯ
.NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдЕрдиреБрдмрдВрдз рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ 4 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрдиреБрдмрдВрдз, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрде рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ: "% PROGRAMS% \ Microsoft \ рдЕрдиреБрдмрдВрдз \ рдЕрдиреБрдмрдВрдз \ .NETFramework \ N.4.0 \"ред рдЕрдиреБрдмрдВрдзреЛрдВ рд╡рд╛рд▓реА рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдирд╛рдорд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: OriginalAssemblyName.Contracts.dll: mscorlib.Contracts.dll, System.Contracts.dll, System.Xml.Contracts.dllред

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

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


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

рд╕рдВрдмрдВрдзрд┐рдд рд▓рд┐рдВрдХ

  1. GitHub рдкрд░ рдЕрдиреБрдмрдВрдзAndInheritance рдкреНрд░реЛрдЬреЗрдХреНрдЯ ред рдкрд░реАрдХреНрд╖рдг рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
  2. рдмрд░реНрдЯреНрд░реЗрдВрдб рдореЗрдпрд░ред рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдУрд░рд┐рдПрдВрдЯреЗрдб рдбрд┐рдЬрд╝рд╛рдЗрди
  3. рдЕрдиреБрдмрдВрдз рджреНрд╡рд╛рд░рд╛ рдбрд┐рдЬрд╛рдЗрдиред рд╡рд┐рд░рд╛рд╕рдд

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


All Articles