SlideShare una empresa de Scribd logo
1 de 17
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/ - много примеров реализации, очень
  помогает для создания своих визуальных компонентов
Спасибо за внимание

Más contenido relacionado

La actualidad más candente

10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collections
MERA_school
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture library
MERA_school
 
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
 
Фундаментальные основы разработки под 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
 

La actualidad más candente (19)

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

Destacado

Каталог мебели 8 Марта
Каталог мебели 8 МартаКаталог мебели 8 Марта
Каталог мебели 8 Марта
8marta
 
как вставить презентацию в страницу вашего сайта
как вставить презентацию в страницу вашего сайтакак вставить презентацию в страницу вашего сайта
как вставить презентацию в страницу вашего сайта
zheka24
 

Destacado (12)

Каталог мебели 8 Марта
Каталог мебели 8 МартаКаталог мебели 8 Марта
Каталог мебели 8 Марта
 
как вставить презентацию в страницу вашего сайта
как вставить презентацию в страницу вашего сайтакак вставить презентацию в страницу вашего сайта
как вставить презентацию в страницу вашего сайта
 
каталог 8 marta
каталог 8 martaкаталог 8 marta
каталог 8 marta
 
Masters of SlideShare
Masters of SlideShareMasters of SlideShare
Masters of SlideShare
 
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
 
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
 
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
 
You Suck At PowerPoint!
You Suck At PowerPoint!You Suck At PowerPoint!
You Suck At PowerPoint!
 
2015 Upload Campaigns Calendar - SlideShare
2015 Upload Campaigns Calendar - SlideShare2015 Upload Campaigns Calendar - SlideShare
2015 Upload Campaigns Calendar - SlideShare
 
What to Upload to SlideShare
What to Upload to SlideShareWhat to Upload to SlideShare
What to Upload to 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
 
Getting Started With SlideShare
Getting Started With SlideShareGetting Started With SlideShare
Getting Started With SlideShare
 

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

Школа-студия разработки приложений для 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
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript
Dmytro Mindra
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
Andrey Karpov
 
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
Nikolay Grebenshikov
 

Similar a 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
 
Bytecode
BytecodeBytecode
Bytecode
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScript
 
[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)
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
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...
 
Быстрое введение в TDD от А до Я
Быстрое введение в TDD от А до ЯБыстрое введение в TDD от А до Я
Быстрое введение в TDD от А до Я
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
 

Más de Vasiliy Deynega

Más de Vasiliy Deynega (7)

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

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/ - много примеров реализации, очень помогает для создания своих визуальных компонентов