valker's blog

valker's blog: идеи, размышления, наблюдения

Posts Tagged ‘c#

Roslyn

leave a comment »

Microsoft представила Community Technology Preview своей новой технологии — Roslyn. В двух словах — это попытка предоставить возможности компиляторов, как сервисов для приложений пользователя. Самое интересное, что поддерживают они только два языка. Угадайте какие? Правильно — C# и VisualBasic. Думается, что эта технология направлена на дальнейшую популяризацию названных языков. Очень хочется в этом ошибиться.

Written by valker

Октябрь 23, 2011 at 8:57 пп

Опубликовано в жизнь

Tagged with , ,

C# как узнать текущую раскладку клавиатуры

leave a comment »

using System.Windows.Forms; // For InputLanguage
using System.Diagnostics; // For Debug
//...
// распечетать текущую раскладку
Debug.WriteLine(InputLanguage.CurrentInputLanguage.LayoutName)
// чтобы узнать, когда раскладка меняется подпишитесь
// на событие System.Windows.Forms.Form.InputLanguageChanged

Written by valker

Январь 25, 2011 at 12:03 пп

Опубликовано в жизнь

Tagged with , ,

lock(this) — это плохо? Да!

leave a comment »

Почему конструкция lock(this) {…} — это плохо?

В двух словах дело в том, что клиент объекта вашего класса возможно уже захватил блокировку по нему в другом потоке.

Поэтому для внутренних блокировок лучше использовать специальный объект член-данных, созданный специально для этих целей:

class A {
    private object lockObject = new object();
    public void Method() {
        lock(lockObject) {...}
    }
}

Written by valker

Январь 17, 2011 at 1:46 пп

Как внедрить schemaLocation при построении XML файла с помощью XMLSerializer

leave a comment »

Недавно возникла такая небольшая задачка. В общем, решение такое — нужно добавить в свой класс такие строки:

[System.Xml.Serialization.XmlAttributeAttribute("schemaLocation", Namespace = System.Xml.Schema.XmlSchema.InstanceNamespace)]
public string xsiSchemaLocation = "тут пишите содержимое schemaLocation";

Written by valker

Май 7, 2010 at 3:48 пп

Опубликовано в жизнь

Tagged with , , ,

Сопрограммы, паттерн "Команда", C#

leave a comment »

Иногда, при написании программы с оконным пользовательским интерфейсом, возникает необходимость реализовать некоторую логику открытия/закрытия окон. Эта ситуация усугубляется необходимостью передавать параметры между этими окнами. Сейчас я покажу, как я решил эту проблему.

В данном примере поочерёдно создаётся два окна: Form1 и Form2. У каждого из них 2 кнопки: Ok и Cancel. По нажатию Ok текущее окно закрывается и открывается следующее. По нажатию Cancel программы заканчивает выполнение.

Для начала, я создал два класса, производных от System.Windows.Forms.Form, и расположил на них по кнопки, определив для каждой свойство DialogResult.

Затем я добавил в проект вот такой интерфейс:

    2     interface ICommand {

    3         ICommand execute(ProgramContext host);

    4     }

Класс ProgramContext — для передачи параметров между окнами. В нашем тривиальном примере он пустой.

Затем я создал базовый класс реализующий этот интерфейс:

 

    4 internal class FormCommandBase : ICommand {

    5     protected delegate Form CreateFormDelegate();

    6 

    7     protected delegate ICommand CreateCommandDelegate();

    8 

    9     private CreateFormDelegate cf;

   10     private CreateCommandDelegate cd;

   11 

   12     protected FormCommandBase(CreateFormDelegate cf, CreateCommandDelegate cd) {

   13         this.cf = cf;

   14         this.cd = cd;

   15     }

   16 

   17     public ICommand execute(ProgramContext host) {

   18         Form f = cf();

   19         f.ShowDialog();

   20         ICommand returnValue = null;

   21         if (f.DialogResult == DialogResult.OK) {

   22             returnValue = cd();

   23         }

   24         return returnValue;

   25     }

   26 }

Как видно, основная работа сосредоточена в функции execute(), которая создаёт экземпляр формы, показывает его на экране, дожидается результата и, в случае положительного ответа, создаёт следующую команду.

Наследники этого класса пишутся просто:

 

    2 internal class FirstFormCommand : FormCommandBase {

    3     public FirstFormCommand() : base(

    4             delegate() {return new Form1();},

    5             delegate() {return new SecondFormCommand();})

    6     {}

    7 }

    2 internal class SecondFormCommand : FormCommandBase {

    3     public SecondFormCommand() : base(

    4             delegate() {return new Form2();},

    5             delegate() {return new FirstFormCommand();})

    6     {}

    7 }

Вот и всё, осталось нашу программу «склеить» и запустить:

 

    5 static class Program {

    6     /// <summary>

    7     /// The main entry point for the application.

    8     /// </summary>

    9     [STAThread]

   10     static void Main() {

   11         Application.EnableVisualStyles();

   12         Application.SetCompatibleTextRenderingDefault(false);

   13 

   14         ICommand cmd = new FirstFormCommand();

   15         ProgramContext context = new ProgramContext();

   16         while (cmd != null) {

   17             cmd = cmd.execute(context);

   18         }

   19     }

   20 }

Удачи вам на дорогах и весёлого программирования!

Ссылки:

Written by valker

Апрель 3, 2007 at 12:42 пп

Опубликовано в жизнь

Tagged with , , ,