[ELMA3] Стандарты написания программного кода на языке C# Стр. 2 из 33 https://www.elma-bpm.ru/KB/article-6651.html IDisposable 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 3 из 33 https://www.elma-bpm.ru/KB/article-6651.html And 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 4 из 33 https://www.elma-bpm.ru/KB/article-6651.html new 1 public class Book 2 { 3 public virtual void Print() 4 { 5 Console.WriteLine("Printing Book"); 6 7 } } 8 9 10 public class PocketBook : Book { 11 public new void Print() 12 { "Printing PocketBook" 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 5 из 33 1 https://www.elma-bpm.ru/KB/article-6651.html PocketBook pocketBook = new PocketBook(); 2 3 pocketBook.Print(); // Выведет "Printing PocketBook" 4 // Выведет "Printing Book" Print() NotImplementedException 1 someObject SomeProperty GetChild().Foo() 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# 1 public void SetAge(int years) 2 { https://www.elma-bpm.ru/KB/article-6651.html 3 AssertValueIsInRange(years, 0, 200, nameof(years)); 4 this age Проверяйте внутренние состояния с помощью инвариантов: Стр. 6 из 33 1 public void Render() 2 { 3 AssertNotDisposed(); 4 5 // ... DataSource DataMember Object.ToString NewGuid 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# https://www.elma-bpm.ru/KB/article-6651.html HttpContext.Current IEnumerable<T> ICollection<T> IEnumerable<T> ICollection<T> Стр. 7 из 33 IReadOnlyCollection<T> IReadOnlyList<T> IReadOnlyDictionary<TKey, TValue> null 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# https://www.elma-bpm.ru/KB/article-6651.html null null null string.IsNullOrEmpty() IConfiguration if null ArgumentNullException Стр. 8 из 33 ArgumentException 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# https://www.elma-bpm.ru/KB/article-6651.html Exception SystemException async await Task, async await Task async await Task null null null 1 event EventHandler Notify; 2 3 protected virtual void OnNotify(NotifyEventArgs args) 4 { 5 if (Notify != null) 6 { 7 Notify Invoke(this args); On TimeChanged OnTimeChanged PropertyChanged Стр. 9 из 33 Property 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 10 из 33 https://www.elma-bpm.ru/KB/article-6651.html INotifyPropertyChanged null this null EventArgs.Empty null null where 1 class SomeClass 2 {} as 3 4 // Неправильно 5 class MyClass 6 { 7 void SomeMethod(T t) 8 { 9 object temp = t; 10 SomeClass obj = (SomeClass) temp; 11 12 } } 13 14 // Правильно 15 class MyClass where T : SomeClass 16 { 17 void SomeMethod 18 19 20 21 1 public IEnumerable GetGoldMemberCustomers() 2 { 3 const decimal GoldMemberThresholdInEuro = 1_000_000; 4 5 var query = from customer in db.Customers 6 where customer.Balance > GoldMemberThresholdInEuro 7 select new GoldMember(customer.Name, customer.Balance); 8 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# https://www.elma-bpm.ru/KB/article-6651.html 8 9 10 Поскольку LINQ-запросы используют отложенное выполнение, возвращение q, как это ни странно, вернет древо выражения, представляющее вышеуказанный запрос. Всякий раз, когда пользователь вычисляет результат, используя foreach или что-то похожее, весь запрос выполняется заново, создавая каждый раз новые экземпляры GoldMember. Как следствие, вы не сможете использовать оператор ==, чтобы сравнить различные экземпляры GoldMember. Вместо этого всегда явно вычисляйте результат LINQ-запроса, используя ToList(), ToArray() или схожие методы. this base private internal sealed public customer.HasNoOrders 1 bool hasOrders 1 EleWise ELMA CRM HasNoOrders EleWise.ELMA.CRM Стр. 11 из 33 EleWise.ELMA.CRM.dll 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# https://www.elma-bpm.ru/KB/article-6651.html EleWise.ELMA.CRM.dll Core EleWise.ELMA.CRM.Core.dll Locko_Application.cs BUD_BudgetTeam.md Стр. 12 из 33 1 namespace EleWise.ELMA.Model.Entities 2 { 3 // Базовый интерфейс сущности 4 public interface IEntity: 5 { 6 7 : IIdentified ... } 8 9 // Интерфейс сущности с идентификатором 10 public interface IEntity<IdT>: 11 { IEntity 12 13 14 1 // В файле MyClass.cs 2 public partial class MyClass 3 {...} 4 5 // В файле MyClass.Designer.cs 6 7 using 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# 1 list System https://www.elma-bpm.ru/KB/article-6651.html Generic () Лучше сделать так: 1 using System.Collections.Generic; 2 3 Если вам необходимо избежать конфликтов именования, используйте директиву using для создания псевдонима пространства имен или типа: 1 using Label System 1 public class Whatever 2 { WebControls 3 public static readonly Color PapayaWhip = new Color(0xFFEFD5); 4 public const int MaxNumberOfWheels = 18; 5 public const ReadCreateOverwriteMask 0b0010_1100 6 Строки, предназначенные для логирования или трассировки, являются исключением из этого правила. Литеральные значения допускается использовать только тогда, когда их смысл ясен из контекста и их не планируется изменять. Например: 1 mean = (a + b) / 2; // среднее арифметическое 2 Если значение одной константы зависит от значения другой, укажите это в своем коде. 1 public class SomeSpecialContainer 2 { 3 public const int MaxItems = 32; 4 public const int HighWaterMark = 3 * MaxItems / 4; // 75% 5 Заметка: Перечисления часто могут использоваться в качестве хранилища символьных констант. Стр. 13 из 33 var var 1 var item = 3; // Что за тип? int? uint? float? 2 var myfoo = MyFactoryMethod.Create("arg"); // Не понятно, какой тип имеет 3 // класс или интерфейс. Кроме того, 4 // тяжело изменять код, который работает 5 // c этой переменной, если исходный класс 6 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# https://www.elma-bpm.ru/KB/article-6651.html Вместо этого используйте var, как в примерах ниже: 1 var query = from order in orders where order.Items > 10 and order.TotalValue > 2 var repository = new RepositoryFactory.Get(); 3 Во всех трех примерах тип присваиваемых переменным значений очевиден. Для получения более подробной информации об использовании var читайте статью Ерика Липперта Использование и злоупотребления неявной типизацией. 1 result someField Исключение: Несколько выражений присваивания в одной строке разрешены при использовании out-переменных, is-паттерна или преобразования в tuple. Например: 1 bool success = int.TryParse(text, out int result); 2 3 if ((items[0] is string text) || (items[1] is Action action)) 4 { 5 } 6 7 1 var startInfo = new ProcessStartInfo("myapp.exe"); 2 startInfo.StandardOutput = Console.Output; 3 startInfo.UseShellExecute = true; 4 5 var countries = new List(); 6 countries.Add("Netherlands"); 7 countries.Add("United States"); 8 9 countryLookupTable string () 10 11 Используйте инициализатор объекта: Стр. 14 из 33 1 var startInfo = new ProcessStartInfo("myapp.exe") 2 { 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 15 из 33 https://www.elma-bpm.ru/KB/article-6651.html 3 StandardOutput = Console.Output, 4 UseShellExecute = true 5 }; 6 7 var countries = new List { "Netherlands", "United States" }; 8 9 10 var countryLookupTable = new Dictionary<string, string> { 11 12 13 true true false false 1 while (condition == false)// неправильно, плохой стиль 2 while (condition != true)// тоже неправильно 3 while (((condition == true) == true) == true)// где ты остановишься? 4 true false for 1 for (int index = 0; index < 10; ++index) 2 { 3 if (someCondition) 4 { 5 foreach index = 11; // Неправильно! Вместо этого используйте ‘break’ или ‘continue’. 6 7 from if else do while for foreach 1 case if (isActive) if (isVisible) Foo(); else Bar(); // к какому ‘if’ относится ‘else’? 2 3 // Лучше сделать так: 4 if (isActive) 5 { 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 16 из 33 5 https://www.elma-bpm.ru/KB/article-6651.html { 6 if (isVisible) 7 { 8 Foo(); 9 } 10 else 11 { 12 13 14 default switch/case InvalidOperationException 1 void Foo(string answer) 2 { 3 switch (answer) 4 { 5 case "no": 6 { 7 Console.WriteLine("You answered with No"); 8 break; 9 } 10 11 case "yes": 12 { 13 Console.WriteLine("You answered with Yes"); 14 break; 15 } 16 17 default: 18 { 19 20 answer); 21 22 23 if-else-if 1 void Foo(string answer) 2 { 3 if (answer == "no") 4 { 5 else Console.WriteLine("Вы ответили Нет"); 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 17 из 33 ( 6 } 7 else if (answer == "yes") 8 { 9 https://www.elma-bpm.ru/KB/article-6651.html ); Console.WriteLine("Вы ответили Да"); 10 } 11 else 12 { 13 // Что должно случиться, когда этот блок выполнится? Игнорировать это? 14 // Если нет, то сгенерировать исключение InvalidOperationException. 15 16 } return if-else 1 bool isPositive; 2 3 if (value > 0) 4 { 5 isPositive = true; 6 } 7 else 8 { 9 10 isPositive } 1 bool isPositive ( 1 string classification; 2 3 if (value> 0) 4 { 5 classification = "positive"; 6 } 7 else 8 { 9 classification = "negative"; 10 11 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 18 из 33 12 https://www.elma-bpm.ru/KB/article-6651.html return 1 return (value 1 int result; 0) 2 3 if (offset == null) 4 { 5 result = -1; 6 } 7 else 8 { 9 10 result = offset.Value; } 11 12 return 1 return offset ?? 1 if (employee.Manager != null) 2 { 3 1 return employee.Manager.Name; 4 } 5 else 6 { 7 8 } 1 return employee Manager 1 return workflowTask 1 return GetProcessHeader Header? Published 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 19 из 33 https://www.elma-bpm.ru/KB/article-6651.html 1 if (member.HidesBaseClassMember && (member.NodeType != NodeType.InstanceInitializer 2 { 3 // что-то делаем 4 } 1 if (NonConstructorMemberUsesNewKeyword(member)) 2 { 3 4 // что-то делаем } 5 6 7 private bool NonConstructorMemberUsesNewKeyword(Member member) 8 { 9 return 10 11 12 } 1 public class MyString 2 { 3 private string someText; 4 5 public int IndexOf(string phrase) 6 { 7 return IndexOf(phrase, 0); 8 } 9 10 public int IndexOf(string phrase, int startIndex) 11 { 12 return IndexOf(phrase, startIndex, someText.Length - startIndex); 13 } 14 15 public virtual int IndexOf(string phrase int startIndex, int count) 16 17 18 19 } 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 20 из 33 https://www.elma-bpm.ru/KB/article-6651.html MyString IndexOf this() 1 public virtual int IndexOf(string phrase, int startIndex = 0, int count = -1) 2 { 3 int length = (count == -1) ? (someText.Length - startIndex) : count; 4 return someText IndexOf(phrase 5 } 1 object[] myAttributes startIndex length); typeof(MyAttribute), inherit: 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 21 из 33 ref https://www.elma-bpm.ru/KB/article-6651.html out 1 bool int TryParse 1 public Customer CreateCustomer 1 Customer customer ) {} CreateCustomer is as as, null NullReferenceException 1 var remoteUser = user as RemoteUser; 2 if (remoteUser != null) 3 { 4 } 1 if (user is RemoteUser remoteUser) 2 { 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 22 из 33 2 { 3 } https://www.elma-bpm.ru/KB/article-6651.html С# 7 as HorizontalAlignment C# 4 null AlignmentHorizontal; CanScrollHorizontally ScrollableX AppDomain IBusinessService ErrorLevel FatalError Click listItem MainPanel MaximumItems maximumItems RedValue listOfValues ToString FormatText 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# https://www.elma-bpm.ru/KB/article-6651.html FormatText System.Drawing typeName TView BackColor firstName g_ s_ _currentUser mUserName m_loginTime OnButtonClick index OnBtnClick i q query UI UserInterface Id Identity Стр. 23 из 33 GetLength Enum Class 1 GetInt; Struct private readonly IMetadataRuntimeService MetadataRuntimeService IComponent IPersistable ICustomAttributeProvider SearchExamination Common SiteSecurity Utility Helper 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 24 из 33 https://www.elma-bpm.ru/KB/article-6651.html Т Т ISession TSession 1 class Employee 2 { 3 // Плохо! 4 static GetEmployee() {} 5 DeleteEmployee() {} 6 7 // Правильно 8 static Get() {...} 9 Delete() {...} 10 11 // Тоже верно. 12 13 14 } Add Remove 1 bool b001 CanSeek (lo Count l0) AddItem Delete NumberOfItems 101) CannotSeek 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# CanSeek https://www.elma-bpm.ru/KB/article-6651.html CannotSeek Is Has Can Allows Support CacheLevel CacheLevel Show, ShowDialog 1 NHibernate.Extensibility 2 Microsoft.ServiceModel.WebApi 3 Microsoft.VisualStudio.Debugging 4 FluentAssertion Primitives 5 CaliburnMicro Collections Click Deleted Closing Minimizing Стр. 25 из 33 1 Arriving Search public event EventHandler –ing –ed Closing Closed Before After Deleting BeginDelete Deleted EndDelete Deleting Delete 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# https://www.elma-bpm.ru/KB/article-6651.html Deleted On On Closing OnClosing 1 button Click ( ) Extensions Extensions Async TaskAsync Async Task Task<TResult> TaskAsync Any() IEnumerable IEnumerable<T> Count Count() Any() Count() IQueryable<T> IEnumerable<T> async async Task.Run Async Стр. 26 из 33 async 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# https://www.elma-bpm.ru/KB/article-6651.html Task.Run Task.Run await async Task.Wait await Task.Wait async await 1 private async Task GetDataAsync() 2 { 3 var result = await MyWebService.GetDataAsync(); 4 return result ToString() 5 } 1 public ActionResult ActionAsync() 2 { 3 var data = GetDataAsync().Result; 4 5 6 return View(data) } System object Object string Int32.Parse() String int Int32 int.Parse() ReadInt32 GetUInt16 Стр. 27 из 33 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 28 из 33 ConnectionStrings https://www.elma-bpm.ru/KB/article-6651.html ConfigurationManager Settings app.config web.config AssemblyInfo.cs AssemblyInfo.cs SolutionInfo.cs 1 var query from item in items 1 var query items Where(item 1 Customer customer = Array.Find(customers, delegate(Customer customer) 2 { 3 4 Length select item; 0) return customer.Name == "Tom"; }); используйте лямбда-выражение: 1 Customer customer customer customer Name == "Tom"); 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# https://www.elma-bpm.ru/KB/article-6651.html или даже лучше это: 1 var customer customers Name "Tom") dynamic dynamic Activator Type.GetProperty() Type.GetMethod() async await 1 public Task GetDataAsync() 2 { 3 return MyWebService.FetchDataAsync() 4 5 Task .ContinueWith(t => new ( Result)) } объявляйте метод следующим образом: 1 public async Task<Data> GetDataAsync() 2 { 3 string result = await MyWebService.FetchDataAsync(); 4 return new Data(result) 5 async Стр. 29 из 33 } await public protected internal 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 30 из 33 ( https://www.elma-bpm.ru/KB/article-6651.html ) if if (condition == null); + - == if else switch case do while for 1 var dto = new ConsumerDto 2 { 3 Id = 123, 4 Name = "Microsoft", 5 PartnerShip = PartnerShip.Gold, 6 ShoppingCart = 7 { 8 ["VisualStudio"] 9 10 foreach } }; 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 31 из 33 https://www.elma-bpm.ru/KB/article-6651.html 1 methodThatTakesAnAction.Do(x => 2 { 3 // какие-то действия 4 } 1 private string GetLongText => 2 "ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC A 1 var query from product 1 var query = product Price 2 from product in products 3 where product.Price > 10 4 select 10 select product from if (!string.IsNullOrEmpty(str) && (str != "new")); #region 1 // Пространства имен Microsoft первые 2 using System; 3 using System.Collections.Generic; 4 using System.XML; using 5 6 // Другие пространства имен идут в алфавитном порядке 7 using EleWise.ELMA.ComponentModel; 8 using EleWise ELMA Services 9 using Telerik 10 using Telerik using 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 32 из 33 https://www.elma-bpm.ru/KB/article-6651.html #region #region #region #region 11.07.2023, 12:24 [ELMA3] Стандарты написания программного кода на языке C# Стр. 33 из 33 https://www.elma-bpm.ru/KB/article-6651.html 11.07.2023, 12:24