воскресенье, 16 августа 2009 г.

Сертификация

Получен сертификат по C# от Brainbench: http://www.brainbench.com/transcript.jsp?pid=6408644

пятница, 31 июля 2009 г.

Презентация по использованию Drag and Drop

На ресурсе SlideShare я разместил первую часть презентации, посвященной использованию Drag and Drop для Windows Forms с использованием языка C#. В настоящее время в презентации представлена только часть, отвечающая за использование drag and drop функционала для двух элементов TextBox. Вторая часть включает в себя рассмотрение компонента ListBox, а третья - TreeView.

суббота, 20 июня 2009 г.

Информация по изменениям...

Всю информацию по изменениям в блогах по программированию на различных языках, о добавлении новых презентаций, о начале новых курсов можно узнать через twitter: AlexeiBo

среда, 10 июня 2009 г.

Создание потока, в который необходимо передать параметр

Для создания потока, в который необходимо передать параметр, можно воспользоваться конструктором класса Thread, который в качестве параметра берет делегат ParameterizedThreadStart:

public Thread(
ParameterizedThreadStart start
)


Сам делегат имеет следующий вид:

public delegate void ParameterizedThreadStart(
Object obj
)

Для запуска потока необходимо воспользоваться методом Start:

public void Start(
Object parameter
)

Рассмотрим пример, в котором создается поток, и в этот поток передается параметр:

Thread t=new Thread(ThreadTask.Task);
t.Start(100); // передаем число 100 в поток
t.Join();
Console.WriteLine("End");

Приведенный выше код является методом Main, который создает поток, запускает его и передает в него данные. После окончания работы потока метод Main также завершает работу.
Теперь посмотрим, что представляет собой делегат:

public static void Task(object data){
int i=(int)data;
Console.WriteLine("Received data: {0}",i);
}

Данный делегат получает данные, которые затем выводит на экран, через метод Start, что позволяет каждый раз, запуская поток, передавать в него новые значения.

пятница, 5 июня 2009 г.

Рассмотрим создание потоков в Mono.

Нас будет интересовать класс Thread, который отвечает за создаваемый поток. После создания потока его необходимо запустить. За это отвечает метод Start, который запускает поток. Метод Join позволяет дождаться завершения выполнения потока.

Рассмотрим пример потока, который после запуска несколько раз выводит фразу на экран и после этого завершается. Поток, выполняющий метод Main, ожидает завершение этого потока и после его завершения заканчивает свою работу.


using System;
using System.Threading;

public class Test{
public static void Main(){
Console.WriteLine("It's a test");
Thread t=new Thread(ThreadTask);
t.Start();
t.Join();
Console.WriteLine("Main thread was closed");
}
public static void ThreadTask(){
for(int i=0;i<3;++i){
Console.WriteLine("Thread output");
Thread.Sleep(1000);
}
}
}


Передать задачу потоку можно и с помощью анонимного делегата. Соответствующий код приведен ниже.


Thread t2=new Thread(delegate(){
Console.WriteLine("Second thread");
});
t2.Start();
t2.Join();


В приведенном выше коде задача представлена анонимным методом. Использование анонимного метода в дальнейшем невозможно. Создание такого кода оправдано, если Вам необходимо использовать метод только один раз. В этой ситуации можно создать его «по месту» необходимости и сразу же использовать.

суббота, 31 января 2009 г.

Создание массивов через CreateInstance

В данном посте хочется рассмотреть возможность создания массива через CreateInstance объекта System.Array.
Данный метод имеет несколько перегруженных вариантов. Остановимся на первом самом простом:

public static Array CreateInstance( Type elementType, int length).

Пример создания массива с использованием данного метода приведен ниже:

Array arr=Array.CreateInstance(typeof(int),5);
Console.WriteLine("Rank: {0}, length: {1}",arr.Rank, arr.Length);

В результате исполнения данного кода получаем одномерный массив на 5 элементов.
Пример использования данного массива:

for(int i=0;i<arr.Length;++i)
arr[i]=i;

Предположим, что нас не устраивает начальный индекс в массиве (мы знаем, что элементы массива имеют индекс, который начинается с нуля).
Если мы посмотрим нижнюю границу, то увидим следующее:

Array arr=Array.CreateInstance(typeof(int),5);
Console.WriteLine("Rank: {0}, length: {1}, Lower bound: {2}",arr.Rank, arr.Length, arr.GetLowerBound(0));

нижняя граница: 0. Узнать нижнюю границу можно через метод GetLowerBound, передав в качестве параметра измерение (измерения начинаются тоже с нуля).
Изменим наш код так, чтобы идекс начинался с 5, а в массиве было 5 элементов. В этом случае элементы массива будут индексироваться с 5 до 10. Посмотрим код:

Array arr=Array.CreateInstance(typeof(int),new int[1]{5},new int[1]{5});
Console.WriteLine("Rank: {0}, length: {1}, Lower bound: {2}",arr.Rank, arr.Length, arr.GetLowerBound(0));
for(int i=arr.GetLowerBound(0);i<arr.GetUpperBound(0);++i)
{
arr.SetValue(i,i);
Console.WriteLine("element: {0}",arr.GetValue(i));
}

Здесь использовалась перегруженная функция CreateInstance объекта Array:

public static Array CreateInstance( Type elementType, int[] lengths, int[] lowerBounds ),

которая берет массив длин по измерениям, а также массив нижних индексов по каждому измерению.
Метод GetUpperBound позволяет получить верхнюю границу изменения индекса по измерению, которое задается в качестве параметра. Как я уже упомянул ранее, измерения нумеруют с 0.

Еще 2 функции, которые были использованы:

public Object GetValue( int index ) - метод, который позволяет получить значение элемента массива в заданной с помощью параметра позиции

public void SetValue( Object value, int index ) - метод, который помещает value в позицию элемента массива с индексом index.