Archive for the ‘C#’ Category
ExpandoObject или «Зачем из C# делают динамически типизированный язык?»
Сейчас в Visual C# Highlights последним постом висит «Introducing the Expando Object». Это, наверное, третий или четвертый пост про DLR (Dynamic Language Runtime), но лично для меня самый пугающий.
Посмотрим на пример (кстати, не так давно я описывал «Enumerator в Python»):
dynamic contact = new ExpandoObject(); contact.Name = "Alexander Shvetsov"; contact.Location = "Moscow, Russian Federation";
Разные модификаторы для get и set в C#
Отнють нетривиальным можно назвать возможность выставлять различные модификаторы доступа для get и set в свойствах. Все очень просто, а между тем и очень полезно.
public string Name
{
get { return this.name; }
internal set { this.name = value; }
}
Update: Жаль, нельзя так же определять свойства в интерфейсах.
Url Routing в ASP.NET
Сейчас достаточно популярен фреймворк ASP.NET MVC. Сам по себе «паттерн» MVC достаточно интересен, но не всегда применим. Конечно же он накладывает множество ограничений и на разработчика, и на приложение. Но ведь иногда можно почерпнуть отдельную часть, без ущерба для кого-либо, в данном случае это механизм URL роутинга, который всемте с .Net 3.5 SP1 вошел во фрэймворк в виде неймспейса System.Web.Routing.
Прочтите эту запись до конца »
Удобный дебаггинг в C#
Просматривая нэймспейс System.Diagnostics, обнаружил много интересного, но самым интересным показался аттрибут DebuggerStepThroughAttribute. Сегодня же, нашел интересный пост посвященный тому, как применять этот аттрибут к свойствам (очень неочевидно, но логично):
public object MyProperty {
[DebuggerStepThrough]
get { return this.myobject; }
}
В результате же на таком вызове мы не будем проваливаться в геттер:
object one = two.MyProperty;
Получение схемы базы MSSQL в C#
По запросу «mssql tables list c#» в Google первым результатом идет вариант с SQL запросом, использующим системный view INFORMATION_SCHEMA.Tables:
SELECT
table_name as [Name]
FROM
INFORMATION_SCHEMA.Tables
WHERE
TABLE_TYPE = 'BASE TABLE'
В действительности, этот вариант отнють не самый удобный. Попробовав разобраться сам, я быстро нашел метод GetSchema() и именно его теперь использую:
DataTable columns = connection.GetSchema("Columns");
На выходе получаем всю необходимую информацию, а главным образом TABLE_NAME, COLUMN_NAME и DATA_TYPE.
Производительность is и as в C#
В данный момент я работаю над компонентом, в котором для сериализации больших структур используется много кастов. То что кастинг (оператор ()) медленнее чем оператор as написано много статей, если быть кратким, то этот прирост производительности получается засчет того, что as в случае неправильного кастинга возвращает null, в то время как () выбрасывает exception. Я же приведу результат небольшого исследования производительности is и as.
Прочтите эту запись до конца »
Enumerator и хранение прав доступа
В Linux-подобных системах для определения прав доступа, используются паттерны rwx для владельца (owner), группы (group) и всех (all), таким образом получается последовательность вида rwx-rwx-rwx, которая однозначно может быть определена бинарной последовательностью, а в итоге чем-то вроде 777, 555 или 577, что очень легко читается и воспринимается.
Вышеописанная схема натолкнула меня на мысль об использовании подобной схемы в C# с енумераторами (enums) для определения прав доступа к чему-либо. Итак, начнем по порядку. Создадим енумератор:
public enum AccessLevel : int
{
Read = 1,
Write = 2,
Execute = 4
}
«Hello World!» на родном языке блога
using System;
using System.Text;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}