background preloader

C#

Facebook Twitter

Вся правда о TypeHandle в .NET. В разных умных книжках и статьях про .NET я часто наталкивался на упоминания про TypeHandle. Чаще всего пишут, что у каждого .NET-объекта в заголовке находится некоторый TypeHandle, который представляет собой ссылку на тип. Ещё пишут, что TypeHandle — это всегда указатель на таблицу методов типа. А в некоторых местах мне доводилось встречать информацию о том, что TypeHandle указывает на некий TypeDesc. В общем, я устал от неразберихи: давайте вместе разберёмся что к чему. А для этого нам придётся немного подизассемблировать, поизучать дампы памяти и залезть в исходники CLI.

Что нам понадобится? Нам нужна будет Visual Studio. Пример 1 Начнём с совсем простого примера: object a = new object(); Console.WriteLine(a); Console.ReadLine(); Последние пара строчек нужна затем, чтобы можно было нормально подебажить (в дальнейшем я их приводить не буду). Наш объект только что создался, а его адрес вернулся нам через регистр eax: В окне Registers находим значение eax (у вас адреса будут другие) ! Пример 2. Неочевидности в использовании C#-замыканий. Язык C# даёт нам возможность пользоваться замыканиями — мощным механизмом, который позволяет анонимным методам и лямбдам захватывать свободные переменные в своём лексическом контексте. И в .NET-мире многие программисты очень любят использовать замыкания, но немногие понимают, как они действительно работают.

Начнём с простого примера: public void Run() { int e = 1; Foo(x => x + e); } Ничего сложного тут не происходит: мы просто «захватили» локальную переменную e в лямбду, которая передаётся в некоторый метод Foo. Посмотрим, во что компилятор развернёт такую конструкцию: public void Run() { DisplayClass c = new DisplayClass(); c.e = 1; Foo(c.Action); } private sealed class DisplayClass { public int e; public int Action(int x) { return x + e; } } Как видно из примера, для нашего замыкания создаётся дополнительный класс, который содержит захватываемую переменную и целевой метод. Цикл for Наверное, это самый классический пример, который приводят все: В этом примере сделана типичная ошибка.

Scope. Introduction · ProblemBook.NET. Учимся округлять в C# А знаете ли вы, что Math.Round(1.5) == Math.Round(2.5) == 2? Можете ли сходу сказать, сколько будет -7%3 и 7%-3? Помните ли, чем отличаются Math.Round, Math.Floor, Math.Ceiling, Math.Truncate? А как происходит округление при использовании string.Format? Давайте немного погрузимся в мир округлений и разберёмся с нюансами, которые не для всех могут быть очевидными. Math.Round MSDN: Round public static decimal Round(decimal value) public static double Round(double value) public static decimal Round(decimal value, int digits) public static double Round(double value, int digits) public static decimal Round(decimal value, MidpointRounding mode) public static double Round(double value, MidpointRounding mode) public static decimal Round(decimal value, int digits, MidpointRounding mode) public static double Round(double value, int digits, MidpointRounding mode) Math.Round — это метод округления к ближайшему числу или к ближайшему числу с заданным количеством знаков после запятой.

Сводная таблица. Невероятные приключения в коде – Перевод блога Эрика Липперта. В прошлый раз мы обсуждали, как параметр «dynamic» стремится расшириться по программе подобно вирусу: если выражение типа dynamic «касается» другого выражения, то последнее зачастую тоже становится типа dynamic. Сегодня я хочу остановиться на менее всего понимаемом аспекте вывода типа метода, который также применяет модель заражения, когда в игру вступает параметр «dynamic».

Постоянные читатели знают, что… Предположим, что вы эпидемиолог, моделирующий возможное распространение сильно заразной болезни. Прямой способ моделирования серии прискорбных событий – предположить, что население может быть разделено на три категории: определенно зараженных, определенно здоровых и возможно зараженных. Если здоровый встречается с зараженным или возможно зараженным, то он переходит в категорию возможно зараженных. Сегодняшний пост, как обычно будет представлен в виде диалога. Я все пропустил! Я рад сообщить, что выпустили третий ознакомительный выпуск («Community Technology Preview») проекта Roslyn. C#. Учимся работать с MySQL. В этой статье мы рассмотрим взаимодействие с популярной СУБД «MySQL» из приложения на C#. К сожалению, в самом C# нет компонентов или классов для работы с MySQL, поэтому нам придется обратиться к общедоступному классу MySqlLib.

Что мы будем делать В статье я не буду грузить теорией, а рассмотрю типичные операции (выборка, добавление, удаление, обновление), возникающие при работе с БД. Все эти операции я буду рассматривать на примере конкретного приложения. Как правило, для знакомства с БД пишут свой телефонный справочник (прим. редактора – да, все мы с этого начинаем). Схема БД Для начала нам надо создать саму БД, с которой потом будем работать из своего приложения. Этой таблицы нам вполне достаточно для небольшого телефонного справочника. Использование класса MySqlLib Для использования класса MySQLLib нам понадобиться два файла: MySql.Data.dll и MySqlData.cs. Рисунок 1. В этом диалоге тебе нужно зайти в папку bin/Debug и выбрать MySql.Data.dll.

Вуаля! Создаем интерфейс Рисунок 2. Кодим. C# Работа с MySql. Подключение, запросы | Котодомик. Сегодня мы поговорим о MySql. СУБД, которую поддерживает почти любой хостер. А конкретно о том, как подключиться к подобной базе данных и работать с ней. Для начала нужно скачать официальный коннектор для работы с базами данных MySql на платформе .NET.

Для этого переходим по этой ссылке. Начинаем установку. Тут, в принципе, всё просто. Подводные камни (а также всякие панельки-браузеры) отсутствуют. Теперь, когда всё установлено, нам нужно подключить библиотеку к проекту. После чего можно объявить: using MySql.Data.MySqlClient; Теперь самое главное — подключение к базе данных: Вся информация (адрес для доступа к СУБД, имя пользователя, пароль, порт) есть у хостера. Многие хостеры требуют дополнительной защиты по IP. В любом случае я крайне не рекомендую использовать код, представленный выше, в клиентских приложениях (то есть в виде программ-«.exe»), которые будут распространяться в интернете/продаваться. Выходов из ситуации много. Программа минимум: то, что должен знать любой начинающий C#-программист.

Рассказывает Мош Хамедани, автор курсов по C# на udemy Мои студенты на Udemy часто задают мне вопросы такого рода: Мош, меня только что приняли на должность Junior C#-разработчик. Что ты посоветуешь? Что мне необходимо выучить? Итак, если вы ищете первую работу в качестве C#-разработчика или недавно её получили, эта статья расскажет вам, какие навыки являются необходимыми. Прежде чем я углублюсь в детали, я проясню кое-что: вы — джуниор, вам не нужно знать всё на свете! Каждый навык будет сопровождаться одной или несколькими ссылками на полезные ресурсы. Базовые навыки Вне зависимости от выбранной сферы разработки существует несколько моментов, которые стоит знать.

Структуры данных и алгоритмы Если у вас нет степени в Computer Science, я очень рекомендую потратить месяц на изучение структур данных и алгоритмов. Вот неплохая книга для начала изучения: Data Structures and Algorithms Made Easy Прим. перев. Если вы в чём-то не разобрались — не отчаивайтесь! Базы данных Вот полезные материалы: Бэкэнд. Wall. C# 5.0 и платформа .NET 4.5. C# и .NET --- C# 5.0 и платформа .NET 4.5 Ниже представлены разделы, которые входят в данную тему: Руководство по C# - Часть 1 В данном разделе описываются базовые понятия и возможности языка C#, например, такие как условные и арифметические операторы, циклы, операторы перехода, массивы, строки и т.д.

Здесь раскрывается объектно-ориентированная природа C#, подробно разбираются классы и их функции-члены (методы, конструкторы, деструкторы, свойства и индексаторы). Так же вы найдете подробное описание перегрузок функций-членов класса. Руководство по C# - Часть 2 Подробно описаны интерфейсы, делегаты, события и лямбда-выражения. Сборки .NET В данном разделе сначала будет показано, как создавать пространства имен в .NET, и в чем состоит разница между однофайловыми и многофайловыми, а также приватными и разделяемыми сборками.

Потоки и файлы Основы .NET Описывается общая работа с приложениями .NET - мониторинг, безопасность и локализация. Сетевое программирование (network programming) C# и .NET | Введение. Последнее обновление: 31.10.2015 На сегодняшний момент язык программирования C# один из самых мощных, быстро развивающихся и востребованных языков в ИТ-отрасли. В настоящий момент на нем пишутся самые различные приложения: от небольших десктопных программок до крупных веб-порталов и веб-сервисов, обслуживающих ежедневно миллионы пользователей. По сравнению с другими языками C# достаточно молодой, но в то же время он уже прошел большой путь. Первая версия языка вышла вместе с релизом Microsoft Visual Studio .NET в феврале 2002 года.

Текущей версией языка является версия C# 6.0, которая вышла в 20 июля 2015 года вместе с Visual Studio 2015. C# является языком с Си-подобным синтаксисом и близок в этом отношении к C++ и Java. Поэтому, если вы знакомы с одним из этих языков, то овладеть C# будет легче. C# является объектно-ориентированным и в этом плане много перенял у Java и С++. Роль платформы .NET Когда говорят C#, нередко имеют в виду технологии платформы .NET (WPF, ASP.NET). JIT-компиляция. Введение в ООП с примерами на C#. Часть четвёртая. Абстрактные классы. Рассказывает Akhil Mittal В прошлых статьях серии «Введение в ООП» мы рассматривали полиморфизм (а также его нюансы на практике) и наследование. В этой мы поговорим о самой захватывающей части ООП-парадигмы — об абстрактных классах. В целом концепция абстрактных классов в C# ничем не отличается от таковой в других языках, но в C# работать с ней приходится несколько иначе.

Что такое абстрактные классы В плане терминологии давайте доверимся MSDN: Модификатор abstract указывает, что реализация сущности с данным модификатором является неполной или отсутствует. Абстрактные классы в действии Итак, попробуем создать абстрактный класс: Попытаемся скомпилировать этот код: Compile time error: Cannot create an instance of the abstract class or interface ‘InheritanceAndPolymorphism.ClassA’ Что нужно запомнить: Мы не можем создать экземпляр абстрактного класса с помощью ключевого слова new.

Описание методов в абстрактном классе Попробуем добавить в наш абстрактный класс немного кода: Вау. Ура! Вывод: Проверим: