C# От основ к эффективному коду Дейнега Василий Михайлович It Works (itw66.ru)

Презентация:



Advertisements
Похожие презентации
Перегрузка операторов x = a + b результат 1-й операнд2-й операнд оператор По количеству операндов операторы делятся на: унарные (один операнд) бинарные.
Advertisements

АССОЦИАТИВНЫЕ КОЛЛЕКЦИИ Лекция 6 1. Отличие от последовательных 2 В последовательной коллекции каждый элемент ассоциируется с номером, начиная с 0. В.
Microsoft.NET Первая лекция. COM Доступ к компонентам только через интерфейсы Назначение уникальных идентификаторов компонентам и интерфейсам Регистрация.
Обобщения ( generics) Обобщения – это классы, структуры, интерфейсы и методы, в которых некоторые типы сами являются параметрами. Эти типы перечисляются.
Язык программирования C# Дмитрий Сошников
Ассоциативные списки Поиск данных происходит не по индексу или положению объекта, а по его ассоциативной связи: public interface Map { // Доступ к объектам.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
.NET framework Колотаев А.В.
Классы в С#. Перечисления С# Перечисление задает конечное множество возможных значений, которые могут получать объекты класса перечисление. [атрибуты][модификаторы]
ДЕЛЕГАТЫ Лекция 7 1. Зачем нужны делегаты 2 И данные, и код располагаются в памяти компьютера по определенным адресам. Передача адресов данных в C# происходит.
Гайдар Магдануров Microsoft.
Гайдар Магдануров Microsoft.
Современные среды программирования. Лекции, практики(22203, 22205): Горинов Николай Александрович Практики 22203, 22204: Ченин Алексей Александрович 22208:
Высокоуровневые методы информатики и программирования Лекция 14 Интерфейсы.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
Обобщения ( шаблоны ) Лекция 5. Тип, метод или интерфейс параметризованный другим типом Обобщенный тип Тип ( класс, структура ), который параметризован.
Лекция 2 Наследование Наследование в Java имеет тот же смысл, что и в С++. Однако наследование в Java осуществляется при помощи ключевого слова extends.
EXtreme Programming XP Тема 3. XP Пусть есть некоторая информационная система для банков. В качестве основной валюты для расчетов используется доллар,
Экзамен: итоги ©Павловская Т.А. (СПб НИУ ИТМО) 1.
Транксрипт:

C# От основ к эффективному коду Дейнега Василий Михайлович It Works (itw66.ru)

Net Framework История: Java.. Одна платформа на множестве устройств Состав: 1. Common Language Runtime (CLR) 2. Framework Class Library (FCL) Компиляция: Code -> Common Intermediate Language (IL) -> Processor Commands Множество языков (C#, C++, J#, VB..) + Множество платформ (x86, a64, Alpha, PowerPC..) Высокая скорость Простота: Сборка мусора Визуальный редактор форм Проверка безопасности типов Простота развертки приложений, нет dll hell, есть GAC. Метаданные и код в одной сборке

Базовые типы Все типы производные от System.Object! Int8, Int16, Int32, Int64, UInt8… Single, Double bool (Boolean) Char, byte String или string??? Object Функции: Не может быть в неймспейсе Не может иметь параметров по умолчанию Нет friend функций using: using Targem.Controls; using ImageList = List ; // аналог typedef

class/struct Reference type (ссылочный тип, class): Располагаются в куче и передается по ссылке (умный указатель в С++) new выделяет для них память Имеют дополнительные поля Value type (размерный тип, struct, enum): Значительно эффективнее, не имеют дополнительных полей, не делается разыменование Располагается в разных местах (чаще в стеке), но передается по значению new не выделяет память, а инициализирует структуру Не обрабатываются сборщиком мусора Упаковка – преобразование val -> ref: Int32 val = 10; Object obj = val; val = (Int32)obj; Дорогая операция!!!

class Функции класса Object: Type GetType() string ToString() int GetHashCode() bool Equals(object obj) Finalize Видимость класса: public, internal, private, sealed Видимость типов, полей, методов: public, internal, protected, private Аттрибуты методов: static, virtual, override, abstract Сведения: Нет множественного наследования, есть много интерфейсов Равенство, тождество Некий класс: public class SomeClass { private Int32m_value = 0; public Int32Value { get; set; } public SomeClass(){} }

struct Важно: Массив структур значительно эффективнее массива классов class IntClass { public Int32 value; } struct IntStruct { public Int32 value; } – Создание массива быстрее в 86 раз – Проход по массиву с записей в переменную быстрее в 5 раз Если при работе с структурами придется преобразовывать к Object, то лучше делать class (ArrayList). Enum: 1 Вариант: public enum TestEnum{ One = 0, Two, Tree } TestEnum t = TestEnum.One; Int32 it = (Int32)t; 2 Вариант: public enum TestEnum : Int32 { One = 0, Two, Tree } 3 Вариант: [ Flags ] public enum TestEnum{ One = 0x01, Two = 0x02, Tree = 0x04}

Функции, свойства, аттрибуты Функции: voidFunc( ref Int32 v1, out Int32 v2 ){ v1 = v2 = 10; } Int32 v1 = 0, v2 = 0; Func( ref v1, out v2 ); Свойства: 1 Вариант: private Int32m_value; public Int32Value{get{ return m_value; }set{ m_value = value; }} 2 Вариант: public Int32Value{ get; set; } 3 Вариант: private Int32[] m_arr ; public Int32this[ Int32 index ] // свойство с параметром { get{ return m_arr[ index ]; } set{ m_arr[ index ]= value; } } obj[ 10 ] = 100; Аттрибуты: [ Category( Object" ), DisplayName( Some Value" ), Description( This is description of value" ), ] public Int32 Value{ get; set; }

Базовые операции Операции: */% ||&&= - базовые операции как в С++ return obj1 ?? Obj2; // return obj1!=null ? obj1 : obj2; Приведение типов: Явное приведение типа генерирует исключение при ошибке is – проверка класса на принадлижность типу as – безопасное приведение к типу. Вернет null, если привести не удалось MyStruct str = (MyStruct)obj; // приведение типов к структуре или Enum Предпочтительнее так: SomeClass sc = obj as SomeClass; if( null != sc ) { /* do something */ } Чем так: if( obj is SomeClass ) { SomeClass sc = obj as SomeClass; /* do something */ }

Обработка исключений IDisposable: private class Starter : IDisposable { public Starter( Object obj ){ Start(); } public void Dispose() { Stop(); } } Использование: void DoSomething() { using( new Starter() ) { } } Обработка исключений: try { } catch ( Exception exc ) { Dbg.LogError( exc.ToString( ) ); } finally { }

Работа со строками String: Split, IndexOf, Trim, Remove, Replace… If( str. Equals( name ) || str == name ) // сравнение String str // все символы строки используются как есть String res = name: + strName + age: + age; // правильно, но очень медленно String.Format( {0} {1}, strName, age ); // в 2 раза быстрее предыдущего примера Convert.ToString( intValue ); // эффективнее чем intValue.ToString(); if( String.IsNullOrEmpty( name ) ) // проверка на null и нулевой строки StringBuilder: - для формирования длинны строк StringBuilder sb = new StringBuilder(); sb.Append(..); // добавление элемента в конец sb.AppendLine(..); // добавление элемента в конец + перевод строки Предпочтительнее так (2.35s): sb.Append( "name: " ); sb.Append( strName ); sb.Append( "age: " ); sb.Append( age); Чем так (3.2s + 35%): sb.Append( "name: " + strName + " age: " + age );

Делегаты и лямбда функции Делегат и лямбда функция: 1.delegate int Del( int v ); void RegisterCallback(Del del ); // передача делегата 2.Del del = x => x *x; // создание делегата через лямбда функцию Способы передачи функций: 1.void ActionFunc() { // do something } obj.RegisterCallback( ActionFunc ); // функция переданная делегатом 2.obj.RegisterCallback( delegate() // анонимный делегат, в 3 раза быстрее предыдущего { // do something } ); 3.obj.RegisterCallback( () => { /*do something*/} ); // лямбда функция Одинаково с предыдущим

Контейнеры Массивы: Int32[] arr = new Int32[ count ]; Int32[] arr = new Int32[] { 1, 2, 3, 4, 5 }; Int32[] arr = { 1, 2, 3, 4, 5}; Int32[,] arr = new Int32[2, 3]; Int32[,] arr = { { 1, 2, 3 }, { 4, 5, 6 } }; // массивы в виде матриц Int32[][] arr = new Int32[6][]; // массивы разной размерности для каждой строки arr – это объект класса Array Array.Resize, Copy, Sort, Find -Массивы структур значительно эффективнее массивов классов

Контейнеры List : List arr = new List ( count ); Int32 val = arr[ 10 ]; arr.Add(); Remove, Clear, Sort, IndexOf ArrayList List Dictionary (Hashtable): Dictionary arr = new Dictionary arr[ name ] = newValue; // установка значения String val = arr[ name ]; // получение значения Предпочтительнее так (7.64s): Image img = null; if( images.TryGetValue( name, out img ) ) return img; Чем так (11.29s + 47%): if( images.ContainsKey( name ) ) return images[ name ];

Контейнеры Компактная обработка массива: 1.list.ForEach( item => item.DoSomething() ); 2.SomeClass item = list.Find( item => item.Name == name ); 3.List items = list.FindAll( item => item.Value > 10 ); 4.bool res = list.TrueForAll( item => item.IsValid ); 5.foreach( var pair in dict ) лучше чем так foreach( KeyValuePair pair in dict )

Нужные компоненты Math: Math.Abs, Min, Max, Sin, Cos… Файлы: System.Xml: XmlDocument, XmlNode, XmlReader, XmlWriter… System.IO: File, Path, Directory, StreamReader, StreamWriter, FileStream, MemoryStream… Элементы GUI: System.Windows.Forms System.Drawing ( GDI, GDI+) -Reflection (RTTI) -Linq -Actions -…

Рекомендуемая литература Программирование на платформе Microsoft.NET Framework, Рихтер Дж. [ Русская редакция, 2003] Professional C#, Simon Robinson [ Wrox Press, 2001] – полезные статьи на русском много примеров реализации, очень помогает для создания своих визуальных компонентов

Спасибо за внимание