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

Содержание

Слайд 2

Net Framework

История:
Java..
Одна платформа на множестве устройств
Состав:
1. Common Language Runtime (CLR)
2. Framework Class

Net Framework История: Java.. Одна платформа на множестве устройств Состав: 1. Common
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,

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

Слайд 4

class/struct

Reference type (ссылочный тип, class):
Располагаются в куче и передается по ссылке (умный

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)
Finalize
Видимость класса:
public, internal, private, sealed
Видимость

class Функции класса Object: Type GetType() string ToString() int GetHashCode() bool Equals(object
типов, полей, методов:
public, internal, protected, private
Аттрибуты методов:
static, virtual, override, abstract
Сведения:
Нет множественного наследования, есть много интерфейсов
Равенство, тождество

Некий класс:
public class SomeClass
{
private Int32 m_value = 0;
public Int32 Value { get; set; }
public SomeClass(){}
}

Слайд 6

struct

Важно:
Массив структур значительно эффективнее массива классов
class IntClass { public Int32 value; }
struct

struct Важно: Массив структур значительно эффективнее массива классов class IntClass { public
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 =

Функции, свойства, аттрибуты Функции: void Func( ref Int32 v1, out Int32 v2
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 )
{
/* do something */
}

Чем так:
if( obj is SomeClass ) {   SomeClass sc = obj as SomeClass;   /* do something */ }

Слайд 9

Обработка исключений

IDisposable:
private class Starter : IDisposable {   public Starter( Object obj ){  Start(); 

Обработка исключений IDisposable: private class Starter : IDisposable { public Starter( Object
}   public void Dispose() { Stop();  } }

Использование:
void DoSomething() {   using( new Starter() )   {   } }

Обработка исключений:
try
{
}
catch ( Exception exc )
{
Dbg.LogError( exc.ToString( ) );
}
finally
{
}

Слайд 10

Работа со строками

String:
Split, IndexOf, Trim, Remove, Replace…
If( str. Equals( “name” ) ||

Работа со строками String: Split, IndexOf, Trim, Remove, Replace… If( str. Equals(
str == “name” ) // сравнение
String str = @”hello\no”; // все символы строки используются как есть
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

Делегаты и лямбда функции

Делегат и лямбда функция:
delegate int Del( int v );
void

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

Слайд 12

Контейнеры

Массивы:
Int32[] arr = new Int32[ count ];
Int32[] arr = new Int32[] {

Контейнеры Массивы: Int32[] arr = new Int32[ count ]; Int32[] arr =
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

Контейнеры List : List arr = new List ( count ); Int32
);
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 ) )   return img;

Чем так (11.29s + 47%):
if( images.ContainsKey( name ) )   return images[ name ];

Слайд 14

Контейнеры

Компактная обработка массива:
list.ForEach( item => item.DoSomething() );
SomeClass item = list.Find( item =>

Контейнеры Компактная обработка массива: list.ForEach( item => item.DoSomething() ); SomeClass item =
item.Name == name );
List items = list.FindAll( item => item.Value > 10 );
bool res = list.TrueForAll( item => item.IsValid );
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,

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

Слайд 16

Рекомендуемая литература

Программирование на платформе Microsoft .NET Framework, Рихтер Дж. [ Русская редакция,

Рекомендуемая литература Программирование на платформе Microsoft .NET Framework, Рихтер Дж. [ Русская
2003]
Professional C#, Simon Robinson [ Wrox Press, 2001]
http://rsdn.ru – полезные статьи на русском
http://www.codeproject.com/ - много примеров реализации, очень помогает для создания своих визуальных компонентов
Имя файла: C#-От-основ-к-эффективному-коду.pptx
Количество просмотров: 847
Количество скачиваний: 2