Формат блога - записки на салфетке... , важные и не очень мелочи которые легко забыть
Обо мне
Метки
- C#
- заметки на полях
- многопоточность
- notes for memory
- DevExpress
- XtraGrid
- async
- await
- multithreading
- parallel programming
- Отладка
- асинхронный ввод-вывод
- внутреннее устройство Windows
- Columns
- WinForms
- архитектура приложения
- обучение
- BlockingCollection
- Entity Framework
- ExecutionContext
- IIS
- Lazy
- Lazy loading
- Leading columns
- Npgsql
- OutOfMemory Exception
- PostgreSQL.
- RegExp
- SOLID
- Solution Explorer
- SynchronizationContext
- ThreadPool
- Tuple
- VS2013
- VS2013 bug
- Visual Studio
- WPF
- boxing
- context menu
- debuger
- filter
- patterns
- reference types
- unboxing
- value types
- базы данных
- контекстное меню
- кортежи
- математика
- распаковка
- физика
среда, 26 ноября 2014 г.
четверг, 23 октября 2014 г.
Design Patterns for C#
классная подборка дизайнов в C#
часть 1
часть 2
- Абстрактная фабрика
- Каскад
- Pluggable behavior (очень прикольно позволяет менять код вызываемой функции ( в данном случае условие) снаружи ( код передается как параметр)
понедельник, 8 сентября 2014 г.
boxing/unboxing - распаковка/упаковка в C#
Итак - у нас в языке C# есть размерные типы ( хранятся в стеке-value types) и ссылочные ( живут в куче - reference types). Размерные - простые и обычно маленькие ( ибо опять же стек не резиновый), ссылочные - большие ( и представляют собой ссылку на область памяти где начинается объект).
Проблема №1 (при копировании ссылочного типа создается еще один указатель на одну и ту же область памяти !)
Проблема №1 (при копировании ссылочного типа создается еще один указатель на одну и ту же область памяти !)
// Ссылочный тип (поскольку 'class'),
class SomeRef { public Int32 x; }
// Размерный тип (поскольку 'struct'),
struct SomeVal { public Int32 x; }
static void ValueTypeDemoO {
SomeRef r1 = new SomeReff); // Размещается в куче.
SomeVal v1 = new SomeValf); // Размещается в стеке.
г1.х = 5; // Разыменовываем указатель,
vl.x = 5; // Изменения в стеке.
Console.WriteLine(rl.x); // Отображается "5".
Console.Writel_ine(v1 .x); // Также отображается "5".
SomeRef г2 = г1; // Копируется только ссылка (указатель).
SomeVal v2 = v1; // Помещаем в стек и копируем члены.
г1.х = 8; // Изменяются г1.х и г2.х. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
vl.x = 9; // Изменяется vl.x, но не v2.x.
Console.WriteLine(rl.x); // Отображается "8".
Console.WriteLine(r2.x); // Отображается "8". Хотя в коде видно изменение лишь r1.x
Console.WriteLine(vl.x); // Отображается "9".
Console.WriteLine(v2.x); // Отображается "5". В принципе интуитивно понятно
Проблема №2(boxing/unboxing) - при приведении размерного типа к ссылочному и обратно - гоняем данные из стека в память и обратно ( откуда тормоза ! )
// Объявляем размерный тип.
struct Point {
public Int32 x, у;
}
static void Main() {
Point p;
p.x = p.у = 1;
Object о = p; // Упаковка р; о указывает на упакованный объект.
р = (Point) о; // Распаковка о и копирование полей из объекта в стек.
}
В принципе однократно это не столь критично - а вот в цикле могут быть серьезные тормоза !Tuple или кортеж
Массивы комбинируют объекты одного типа, а кортежи (tuple) могут комбинировать объекты различных типов. стандартный класс Tuple<T1> содержит один элемент, Tuple<T1, Т2> — два элемента и т.д. до восьми, последний параметр называется TRest, в котором должен передаваться сам кортеж. Таким образом, есть возможность создавать кортежи с любым количеством параметров.
Обычно используются как возможность возврата кучи разных значений ( особенно в многопоточности).
Обычно используются как возможность возврата кучи разных значений ( особенно в многопоточности).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
// Данный метод возвращает кортеж с 4-мя
// разными значениями
static Tuple<int, float, string, char> Corteg(int a, string name)
{
int sqr = a * a;
float sqrt = (float)(Math.Sqrt(a));
string s = "Привет, " + name;
char ch = (char)(name[0]);
return Tuple.Create<int, float, string, char>(sqr, sqrt, s, ch);
}
static void Main(string[] args)
{
var myTuple = Corteg(25,"Alexandr");
Console.WriteLine("{0}\n25 в квадрате: {1}\nКвадратный корень из 25: "
+ "{2}\nПервый символ в имени: {3}\n",myTuple.Item3,myTuple.Item1,myTuple.Item2,myTuple.Item4);
// Создаем кортеж произвольной размерности
var myTuple2 = Tuple.Create<int, char, string, decimal, float, byte, short, Tuple<int,
float, string, char>>(12, 'C', "Name", 12.3892m, 0.5f, 120, 4501, myTuple);
Console.ReadLine();
}
}
public class Tuple<T1,T2,T3,T4,T5,T6,T7,TRest>
{
}
}
вторник, 19 августа 2014 г.
Parallel programming - concurent queue
Если есть очередь - как ее распаралелить, казалось бы нельзя - но есть
BlockingCollection и вот как этим пользоваться !
Multithreading debuging - naming threads
Студия позволяет именовать треды - и тогда в дебагере видно какой конкретно тред сейчас исполняется, а также по имени треда можно поставить точку останова
Lazy loading pattern
Смысл паттерна - в отложенной загрузке ( не в момент создания класса в конструкторе, а в момент самого использования переменной класса) - используется класс Lazy
вторник, 8 июля 2014 г.
пятница, 20 июня 2014 г.
DevExpress - правильная покраска грида
Открываем Feature Brower - и у Focused Cell и Row - устанавливаем нужный BackColor
Leading columns DevExpress
Нужно кликнуть по названию вашего XtraGrid и в свойствах найти OptionsView и поставить ShowIndicator = False - если надо спрятать !
Подписаться на:
Сообщения
(
Atom
)