Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #40, МАРТ 2004 г.

Программирование в XP

Tony

Спецвыпуск Xakep, номер #040, стр. 040-076-9


FAQ

Q: Как мне сделать, чтобы передаваемый параметр в метод C# был выходным?

A: Речь об аргументах метода? Для этого необходимо указать модификатор передаваемого параметра. Существуют три модификатора. Если параметр указывается без модификатора, то это входной параметр, если стоит модификатор ‘out’, то это выходной параметр. Далее, если стоит модификатор ‘ref’, то это одновременно входной и выходной параметр. И, наконец, если стоит модификатор ‘params’ - этот метод принимает переменное количество аргументов.

[C#]

public void Foo(int a); //Входной параметр

public void Foo(out int a); //Выходной параметр

public void Foo(ref int a); //Одновременно входной и выходной параметр

public void Foo(params int[] a); //Внутри метода все переданные параметры будут выглядеть как массив чисел int

public void Foo(params object[] a); //Если тебе необходимы аргументы различного типа, воспользуйся такой конструкцией

Q: Что такое атрибут и какая от него польза?

A: Атрибуты пришли в .NET Framework напрямую из COM, а вернее, IDL-языка определения интерфейса, используемого при создании COM-компонент. Воспринимай атрибут как некоторую аннотацию, дополнительное описание твоего типа, члена, сборки или модуля. Атрибут также является объектом и происходит от класса System.Attribute. Ты можешь создавать свои атрибуты, которые описывают то, что нужно именно твоему приложению.

Q: Как мне из кода .NET загрузить старенькую DLL?

A: Для этого можно воспользоваться атрибутом DllImport, он имеет кучу полей, которые ты можешь заполнить для получения нужного результата. Листинг кода показывает, как можно вызвать метод MessageBox() Windows API.

[C#]

using System;

using System.Runtime.InteropServices;

public class cExample

{

//У нас в программе метод будет называться по-другому. Важно, чтобы поле атрибута “EntryPoint” содержало реальное имя метода

[DllImport(“user32”, EntryPoint =”MessageBox”)]

public static extern Сообщение(int hwnd, String text, String caption, int op);

public static int Main(string[] args)

{

//C# позволяет в качестве имен типов, членов и т.д. использовать имена с русскими (да и с любыми другими национальными) символами

Сообщение(0, args[0], args[1], 0);

}

}

[Managed C++]

#using <mscorlib.dll>

using namespace System;

using namespace System::Runtime::InteropServices;

[DllImport(“user32”, EntryPoint =”MessageBox”)]

public static extern MessageBox(int hwnd, String text, String caption, int op);

int _tmain()

{

MessageBox(0, “Текст сообщения”, ”Заголовок окна”, 0);

return 0;

}

FAQ

Q: Работает ли в C# приведение типов?

A: Да, конечно, один тип привести к другому ты можешь так же, как это делается в C-программах. Если ты приводишь класс к базовому классу, то явного преобразования типа не требуется. Если CLR не может выполнить приведение типа, то будет выброшено исключение System.InvalidCastException.

Назад на стр. 040-076-8  Содержание  Вперед на стр. 040-076-10