SlideShare a Scribd company logo
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< Image>; // аналог 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)                      public class SomeClass
•   Finalize                                     {
                                                        private Int32         m_value = 0;
                                                        public Int32          Value { get; set; }
Видимость класса:
                                                       public SomeClass(){}
• public, internal, private, sealed              }


Видимость типов, полей, методов:
• public, internal, protected, private

Аттрибуты методов:
• static, virtual, override, abstract

Сведения:
• Нет множественного наследования, есть много интерфейсов
• Равенство, тождество
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}
Функции, свойства, аттрибуты
Функции:
   void       Func( ref Int32 v1, out Int32 v2 )      {   v1 = v2 = 10; }
   Int32 v1 = 0, v2 = 0;
   Func( ref v1, out v2 );


Свойства:
   1 Вариант:
             private Int32       m_value;
             public Int32        Value{               get{ return m_value; }    set{ m_value = value; }   }
   2 Вариант:
             public Int32        Value{ get; set; }
   3 Вариант:
             private Int32[]      m_arr ;
             public Int32        this[ 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 )
       {                                           if( obj is SomeClass )
        /* do something */                         {
       }                                                SomeClass sc = obj as SomeClass;
                                                        /* do something */
                                                   }
Обработка исключений
Обработка исключений:
try
{
}
catch ( Exception exc )
{
     Dbg.LogError( exc.ToString( ) );
}
finally
{
}


            IDisposable:
            private class Starter : IDisposable
            {
                public Starter( Object obj ){ Start();    }
                public void Dispose()        {  Stop();   }
            }


                                        Использование:
                                        void DoSomething()
                                        {
                                            using( new Starter() )
                                            {
                                            }
                                        }
Работа со строками
String:
•    Split, IndexOf, Trim, Remove, Replace…
•    If( str. Equals( “name” ) || str == “name” ) // сравнение
•    String str = @”hellono”; // все символы строки используются как есть

•   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< Int32 >:
     List< Int32 > arr = new List< Int32 >( count );
     Int32 val = arr[ 10 ];
     arr.Add(); Remove, Clear, Sort, IndexOf

ArrayList  List< Object >

Dictionary< key, value > (Hashtable):
     Dictionary< String, SomeClass > arr = new Dictionary< String, SomeClass >
     arr* “name” + = “newValue”; // установка значения
     String val = arr* “name” +; // получение значения

      Предпочтительнее так (7.64s):
      Image img = null;
      if( images.TryGetValue( name, out img ) )           Чем так (11.29s + 47%):
            return img;                                   if( images.ContainsKey( name ) )
                                                                return images[ name ];
Контейнеры
Компактная обработка массива:
1. list.ForEach( item => item.DoSomething() );
2. SomeClass item = list.Find( item => item.Name == name );
3. List<SomeClass> items = list.FindAll( item => item.Value > 10 );
4. bool res = list.TrueForAll( item => item.IsValid );

5.   foreach( var pair in dict ) лучше чем так
      foreach( KeyValuePair< String, SomeClass > 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]
• http://rsdn.ru – полезные статьи на русском
• http://www.codeproject.com/ - много примеров реализации, очень
  помогает для создания своих визуальных компонентов
Спасибо за внимание
Ad

More Related Content

What's hot (19)

10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collections
MERA_school
 
Лекция 1. Начало.
Лекция 1. Начало.Лекция 1. Начало.
Лекция 1. Начало.
Roman Brovko
 
Лекция 6. Классы 1.
Лекция 6. Классы 1.Лекция 6. Классы 1.
Лекция 6. Классы 1.
Roman Brovko
 
Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.
Roman Brovko
 
Лекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILЛекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GIL
Roman Brovko
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture library
MERA_school
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
Яковенко Кирилл
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.
Roman Brovko
 
3. java lecture classes
3. java lecture classes3. java lecture classes
3. java lecture classes
MERA_school
 
8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threads
MERA_school
 
Talks on collections
Talks on collectionsTalks on collections
Talks on collections
Dmitry Zakharov
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.
Roman Brovko
 
Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.
Roman Brovko
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)
Anton Bukov
 
Лекция 4. Строки, байты, файлы и ввод/вывод.
 Лекция 4. Строки, байты, файлы и ввод/вывод. Лекция 4. Строки, байты, файлы и ввод/вывод.
Лекция 4. Строки, байты, файлы и ввод/вывод.
Roman Brovko
 
Лекция 7. Исключения и менеджеры контекста.
Лекция 7. Исключения и менеджеры контекста.Лекция 7. Исключения и менеджеры контекста.
Лекция 7. Исключения и менеджеры контекста.
Roman Brovko
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
Stanfy
 
Objective-C 2.0: краткое описание языка и рантайма
Objective-C 2.0: краткое описание языка и рантаймаObjective-C 2.0: краткое описание языка и рантайма
Objective-C 2.0: краткое описание языка и рантайма
Yandex
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
Dmitry Stropalov
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collections
MERA_school
 
Лекция 1. Начало.
Лекция 1. Начало.Лекция 1. Начало.
Лекция 1. Начало.
Roman Brovko
 
Лекция 6. Классы 1.
Лекция 6. Классы 1.Лекция 6. Классы 1.
Лекция 6. Классы 1.
Roman Brovko
 
Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.
Roman Brovko
 
Лекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILЛекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GIL
Roman Brovko
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture library
MERA_school
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
Яковенко Кирилл
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.
Roman Brovko
 
3. java lecture classes
3. java lecture classes3. java lecture classes
3. java lecture classes
MERA_school
 
8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threads
MERA_school
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.
Roman Brovko
 
Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.
Roman Brovko
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)
Anton Bukov
 
Лекция 4. Строки, байты, файлы и ввод/вывод.
 Лекция 4. Строки, байты, файлы и ввод/вывод. Лекция 4. Строки, байты, файлы и ввод/вывод.
Лекция 4. Строки, байты, файлы и ввод/вывод.
Roman Brovko
 
Лекция 7. Исключения и менеджеры контекста.
Лекция 7. Исключения и менеджеры контекста.Лекция 7. Исключения и менеджеры контекста.
Лекция 7. Исключения и менеджеры контекста.
Roman Brovko
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
Stanfy
 
Objective-C 2.0: краткое описание языка и рантайма
Objective-C 2.0: краткое описание языка и рантаймаObjective-C 2.0: краткое описание языка и рантайма
Objective-C 2.0: краткое описание языка и рантайма
Yandex
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
Dmitry Stropalov
 

Viewers also liked (12)

Каталог мебели 8 Марта
Каталог мебели 8 МартаКаталог мебели 8 Марта
Каталог мебели 8 Марта
8marta
 
как вставить презентацию в страницу вашего сайта
как вставить презентацию в страницу вашего сайтакак вставить презентацию в страницу вашего сайта
как вставить презентацию в страницу вашего сайта
zheka24
 
каталог 8 marta
каталог 8 martaкаталог 8 marta
каталог 8 marta
gilmullin
 
Masters of SlideShare
Masters of SlideShareMasters of SlideShare
Masters of SlideShare
Kapost
 
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareSTOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
Empowered Presentations
 
10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization
Oneupweb
 
How To Get More From SlideShare - Super-Simple Tips For Content Marketing
How To Get More From SlideShare - Super-Simple Tips For Content MarketingHow To Get More From SlideShare - Super-Simple Tips For Content Marketing
How To Get More From SlideShare - Super-Simple Tips For Content Marketing
Content Marketing Institute
 
You Suck At PowerPoint!
You Suck At PowerPoint!You Suck At PowerPoint!
You Suck At PowerPoint!
Jesse Desjardins - @jessedee
 
2015 Upload Campaigns Calendar - SlideShare
2015 Upload Campaigns Calendar - SlideShare2015 Upload Campaigns Calendar - SlideShare
2015 Upload Campaigns Calendar - SlideShare
SlideShare
 
What to Upload to SlideShare
What to Upload to SlideShareWhat to Upload to SlideShare
What to Upload to SlideShare
SlideShare
 
How to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & TricksHow to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & Tricks
SlideShare
 
Getting Started With SlideShare
Getting Started With SlideShareGetting Started With SlideShare
Getting Started With SlideShare
SlideShare
 
Каталог мебели 8 Марта
Каталог мебели 8 МартаКаталог мебели 8 Марта
Каталог мебели 8 Марта
8marta
 
как вставить презентацию в страницу вашего сайта
как вставить презентацию в страницу вашего сайтакак вставить презентацию в страницу вашего сайта
как вставить презентацию в страницу вашего сайта
zheka24
 
каталог 8 marta
каталог 8 martaкаталог 8 marta
каталог 8 marta
gilmullin
 
Masters of SlideShare
Masters of SlideShareMasters of SlideShare
Masters of SlideShare
Kapost
 
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareSTOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
Empowered Presentations
 
10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization
Oneupweb
 
How To Get More From SlideShare - Super-Simple Tips For Content Marketing
How To Get More From SlideShare - Super-Simple Tips For Content MarketingHow To Get More From SlideShare - Super-Simple Tips For Content Marketing
How To Get More From SlideShare - Super-Simple Tips For Content Marketing
Content Marketing Institute
 
2015 Upload Campaigns Calendar - SlideShare
2015 Upload Campaigns Calendar - SlideShare2015 Upload Campaigns Calendar - SlideShare
2015 Upload Campaigns Calendar - SlideShare
SlideShare
 
What to Upload to SlideShare
What to Upload to SlideShareWhat to Upload to SlideShare
What to Upload to SlideShare
SlideShare
 
How to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & TricksHow to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & Tricks
SlideShare
 
Getting Started With SlideShare
Getting Started With SlideShareGetting Started With SlideShare
Getting Started With SlideShare
SlideShare
 
Ad

Similar to C#. От основ к эффективному коду (20)

Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Глеб Тарасов
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
Alex Tumanoff
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
LuxoftTraining
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScript
Dmytro Mindra
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
Evgeny Kaziak
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript
Dmytro Mindra
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
Andrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
Pavel Tsukanov
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
Dima Dzuba
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
Глеб Тарасов
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
CocoaHeads
 
Быстрое введение в TDD от А до Я
Быстрое введение в TDD от А до ЯБыстрое введение в TDD от А до Я
Быстрое введение в TDD от А до Я
Andrey Bibichev
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
Technopark
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Dima Dzuba
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
MoscowDjango
 
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
Nikolay Grebenshikov
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Глеб Тарасов
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
Alex Tumanoff
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScript
Dmytro Mindra
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
Evgeny Kaziak
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript
Dmytro Mindra
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
Andrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
Pavel Tsukanov
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
Dima Dzuba
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
CocoaHeads
 
Быстрое введение в TDD от А до Я
Быстрое введение в TDD от А до ЯБыстрое введение в TDD от А до Я
Быстрое введение в TDD от А до Я
Andrey Bibichev
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
Technopark
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Dima Dzuba
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
MoscowDjango
 
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
Nikolay Grebenshikov
 
Ad

More from Vasiliy Deynega (7)

Инвестиции в Золото-добывающую компанию! От 276% за 2 года!
Инвестиции в Золото-добывающую компанию! От 276% за 2 года!Инвестиции в Золото-добывающую компанию! От 276% за 2 года!
Инвестиции в Золото-добывающую компанию! От 276% за 2 года!
Vasiliy Deynega
 
Зарабатывай с iWowWe
Зарабатывай с iWowWeЗарабатывай с iWowWe
Зарабатывай с iWowWe
Vasiliy Deynega
 
Семинар по управлению проектами. Часть 2. Технический процесс
Семинар по управлению проектами. Часть 2. Технический процессСеминар по управлению проектами. Часть 2. Технический процесс
Семинар по управлению проектами. Часть 2. Технический процесс
Vasiliy Deynega
 
Семинар по управлению проектами. Часть 3. Рабочие инструменты
Семинар по управлению проектами. Часть 3. Рабочие инструментыСеминар по управлению проектами. Часть 3. Рабочие инструменты
Семинар по управлению проектами. Часть 3. Рабочие инструменты
Vasiliy Deynega
 
Семинар по управлению проектами. Часть 1. Команда
Семинар по управлению проектами. Часть 1. КомандаСеминар по управлению проектами. Часть 1. Команда
Семинар по управлению проектами. Часть 1. Команда
Vasiliy Deynega
 
Учись, пропуская мир через себя
Учись, пропуская мир через себяУчись, пропуская мир через себя
Учись, пропуская мир через себя
Vasiliy Deynega
 
Мир - это разность людских потенциалов
Мир - это разность людских потенциаловМир - это разность людских потенциалов
Мир - это разность людских потенциалов
Vasiliy Deynega
 
Инвестиции в Золото-добывающую компанию! От 276% за 2 года!
Инвестиции в Золото-добывающую компанию! От 276% за 2 года!Инвестиции в Золото-добывающую компанию! От 276% за 2 года!
Инвестиции в Золото-добывающую компанию! От 276% за 2 года!
Vasiliy Deynega
 
Зарабатывай с iWowWe
Зарабатывай с iWowWeЗарабатывай с iWowWe
Зарабатывай с iWowWe
Vasiliy Deynega
 
Семинар по управлению проектами. Часть 2. Технический процесс
Семинар по управлению проектами. Часть 2. Технический процессСеминар по управлению проектами. Часть 2. Технический процесс
Семинар по управлению проектами. Часть 2. Технический процесс
Vasiliy Deynega
 
Семинар по управлению проектами. Часть 3. Рабочие инструменты
Семинар по управлению проектами. Часть 3. Рабочие инструментыСеминар по управлению проектами. Часть 3. Рабочие инструменты
Семинар по управлению проектами. Часть 3. Рабочие инструменты
Vasiliy Deynega
 
Семинар по управлению проектами. Часть 1. Команда
Семинар по управлению проектами. Часть 1. КомандаСеминар по управлению проектами. Часть 1. Команда
Семинар по управлению проектами. Часть 1. Команда
Vasiliy Deynega
 
Учись, пропуская мир через себя
Учись, пропуская мир через себяУчись, пропуская мир через себя
Учись, пропуская мир через себя
Vasiliy Deynega
 
Мир - это разность людских потенциалов
Мир - это разность людских потенциаловМир - это разность людских потенциалов
Мир - это разность людских потенциалов
Vasiliy Deynega
 

C#. От основ к эффективному коду

  • 1. C# От основ к эффективному коду Дейнега Василий Михайлович It Works (itw66.ru)
  • 2. 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. Метаданные и код в одной сборке
  • 3. Базовые типы Все типы производные от System.Object! • Int8, Int16, Int32, Int64, UInt8… • Single, Double • bool (Boolean) • Char, byte • String или string??? • Object Функции: • Не может быть в неймспейсе • Не может иметь параметров по умолчанию • Нет friend функций using: • using Targem.Controls; • using ImageList = List< Image>; // аналог typedef
  • 4. class/struct Reference type (ссылочный тип, class): • Располагаются в куче и передается по ссылке (умный указатель в С++) • new выделяет для них память • Имеют дополнительные поля Value type (размерный тип, struct, enum): • Значительно эффективнее, не имеют дополнительных полей, не делается разыменование • Располагается в разных местах (чаще в стеке), но передается по значению • new не выделяет память, а инициализирует структуру • Не обрабатываются сборщиком мусора Упаковка – преобразование val -> ref: Int32 val = 10; Object obj = val; val = (Int32)obj; Дорогая операция!!!
  • 5. class Функции класса Object: • Type GetType() • string ToString() • int GetHashCode() Некий класс: • bool Equals(object obj) public class SomeClass • Finalize { private Int32 m_value = 0; public Int32 Value { get; set; } Видимость класса: public SomeClass(){} • public, internal, private, sealed } Видимость типов, полей, методов: • public, internal, protected, private Аттрибуты методов: • static, virtual, override, abstract Сведения: • Нет множественного наследования, есть много интерфейсов • Равенство, тождество
  • 6. 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}
  • 7. Функции, свойства, аттрибуты Функции: void Func( ref Int32 v1, out Int32 v2 ) { v1 = v2 = 10; } Int32 v1 = 0, v2 = 0; Func( ref v1, out v2 ); Свойства: 1 Вариант: private Int32 m_value; public Int32 Value{ get{ return m_value; } set{ m_value = value; } } 2 Вариант: public Int32 Value{ get; set; } 3 Вариант: private Int32[] m_arr ; public Int32 this[ 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; }
  • 8. Базовые операции Операции: • */% ||&&<>= - базовые операции как в С++ • return obj1 ?? Obj2; // return obj1!=null ? obj1 : obj2; Приведение типов: • Явное приведение типа генерирует исключение при ошибке • is – проверка класса на принадлижность типу • as – безопасное приведение к типу. Вернет null, если привести не удалось • MyStruct str = (MyStruct)obj; // приведение типов к структуре или Enum Предпочтительнее так: SomeClass sc = obj as SomeClass; Чем так: if( null != sc ) { if( obj is SomeClass ) /* do something */ { } SomeClass sc = obj as SomeClass; /* do something */ }
  • 9. Обработка исключений Обработка исключений: try { } catch ( Exception exc ) { Dbg.LogError( exc.ToString( ) ); } finally { } IDisposable: private class Starter : IDisposable { public Starter( Object obj ){ Start(); } public void Dispose() { Stop(); } } Использование: void DoSomething() { using( new Starter() ) { } }
  • 10. Работа со строками String: • Split, IndexOf, Trim, Remove, Replace… • If( str. Equals( “name” ) || str == “name” ) // сравнение • String str = @”hellono”; // все символы строки используются как есть • 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 );
  • 11. Делегаты и лямбда функции Делегат и лямбда функция: 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*/} ); // лямбда функция Одинаково с предыдущим
  • 12. Контейнеры Массивы: • 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 - Массивы структур значительно эффективнее массивов классов
  • 13. Контейнеры List< Int32 >: List< Int32 > arr = new List< Int32 >( count ); Int32 val = arr[ 10 ]; arr.Add(); Remove, Clear, Sort, IndexOf ArrayList  List< Object > Dictionary< key, value > (Hashtable): Dictionary< String, SomeClass > arr = new Dictionary< String, SomeClass > arr* “name” + = “newValue”; // установка значения String val = arr* “name” +; // получение значения Предпочтительнее так (7.64s): Image img = null; if( images.TryGetValue( name, out img ) ) Чем так (11.29s + 47%): return img; if( images.ContainsKey( name ) ) return images[ name ];
  • 14. Контейнеры Компактная обработка массива: 1. list.ForEach( item => item.DoSomething() ); 2. SomeClass item = list.Find( item => item.Name == name ); 3. List<SomeClass> items = list.FindAll( item => item.Value > 10 ); 4. bool res = list.TrueForAll( item => item.IsValid ); 5. foreach( var pair in dict ) лучше чем так foreach( KeyValuePair< String, SomeClass > pair in dict )
  • 15. Нужные компоненты 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 - …
  • 16. Рекомендуемая литература • Программирование на платформе Microsoft .NET Framework, Рихтер Дж. [ Русская редакция, 2003] • Professional C#, Simon Robinson [ Wrox Press, 2001] • http://rsdn.ru – полезные статьи на русском • http://www.codeproject.com/ - много примеров реализации, очень помогает для создания своих визуальных компонентов