public
Методы с модификатором public являются открытыми и как правило, устанавливают значения для поля или возвращают значения поля.
Main.cs
usingSystem;classOne {-
privateintval; -
//метод устанавливает значение для поля -
publicvoidSetVal(intarg) { -
val = arg; -
} -
//метод возвращает значение поля -
publicintGetVal() { -
returnval; -
} }classProgram {-
publicstaticintMain() { -
One O =newOne(); -
O.SetVal(10); -
Console.WriteLine(O.GetVal()); -
Console.ReadKey(); -
return0; -
} }
usingSystem;classOne {-
privateintval; -
//метод устанавливает значение для поля -
publicvoidSetVal(intarg) { -
val = arg; -
} -
//метод возвращает значение поля -
publicintGetVal() { -
returnval; -
} }classProgram {-
publicstaticintMain() { -
One O =newOne(); -
O.SetVal(10); -
Console.WriteLine(O.GetVal()); -
Console.ReadKey(); -
return0; -
} }
10
private
Модификатор private установлен по умолчанию, поэтому явно его объявлять не обязательно.
Закрытые методы выполняют какие либо действия внутри класса.
Закрытые методы выполняют какие либо действия внутри класса.
Main.cs
usingSystem;classOne {-
privateintval; -
publicOne(intarg) { -
val = arg; -
} -
//закрытый метод увеличивает значение поля в 2 раза -
//не обязательно явно указывать модификатор private -
voidMultiplyTwo() { -
val*=2; -
} -
//метод возвращает значение поля -
publicintGetVal() { -
//закрытый метод выполняется внутри класса -
MultiplyTwo(); -
returnval; -
} }classProgram {-
publicstaticintMain() { -
One O =newOne(10); -
Console.WriteLine(O.GetVal()); -
Console.ReadKey(); -
return0; -
} }
usingSystem;classOne {-
privateintval; -
publicOne(intarg) { -
val = arg; -
} -
//закрытый метод увеличивает значение поля в 2 раза -
//не обязательно явно указывать модификатор private -
voidMultiplyTwo() { -
val*=2; -
} -
//метод возвращает значение поля -
publicintGetVal() { -
//закрытый метод выполняется внутри класса -
MultiplyTwo(); -
returnval; -
} }classProgram {-
publicstaticintMain() { -
One O =newOne(10); -
Console.WriteLine(O.GetVal()); -
Console.ReadKey(); -
return0; -
} }
20
protected
К методам с модификатором protected могут получить доступ только члены базового класса, где они определены и члены производного класса.
Main.cs
usingSystem;classCounter {-
ushortshowStart; -
ushortshowEnd; -
publicCounter(ushortarg0,ushortarg1) { -
showStart = arg0; -
showEnd = arg1; -
} -
protectedushortResultShow() { -
return(ushort)(showEnd - showStart); -
} }classElectro : Counter {-
decimalprice; -
//обратите внимание на инициализатор base базового класса -
publicElectro(ushortarg0,ushortarg1,decimalarg2) :base(arg0, arg1) { -
price = arg2; -
} -
publicdecimalSum() { -
//доступ к защищенному методу базового класса -
returnMath.Round(((decimal)(ResultShow()*price)), 2); -
} }classProgram {-
publicstaticintMain() { -
Console.WriteLine("оплата за электроэнергию\n"); -
Console.Write("Введите начальные показания счетчика : "); -
ushortshow_start =ushort.Parse(Console.ReadLine()); -
Console.Write("Введите конечные показания счетчика : "); -
ushortshow_end =ushort.Parse(Console.ReadLine()); -
Console.Write("Введите цену за 1 кВт/ч : "); -
decimalprice =decimal.Parse(Console.ReadLine()); -
Electro E =newElectro(show_start, show_end, price); -
Console.WriteLine("Сумма за электроэнергию : {0}", E.Sum()); -
Console.ReadKey(); -
return0; -
} }
usingSystem;classCounter {-
ushortshowStart; -
ushortshowEnd; -
publicCounter(ushortarg0,ushortarg1) { -
showStart = arg0; -
showEnd = arg1; -
} -
protectedushortResultShow() { -
return(ushort)(showEnd - showStart); -
} }classElectro : Counter {-
decimalprice; -
//обратите внимание на инициализатор base базового класса -
publicElectro(ushortarg0,ushortarg1,decimalarg2) :base(arg0, arg1) { -
price = arg2; -
} -
publicdecimalSum() { -
//доступ к защищенному методу базового класса -
returnMath.Round(((decimal)(ResultShow()*price)), 2); -
} }classProgram {-
publicstaticintMain() { -
Console.WriteLine("оплата за электроэнергию\n"); -
Console.Write("Введите начальные показания счетчика : "); -
ushortshow_start =ushort.Parse(Console.ReadLine()); -
Console.Write("Введите конечные показания счетчика : "); -
ushortshow_end =ushort.Parse(Console.ReadLine()); -
Console.Write("Введите цену за 1 кВт/ч : "); -
decimalprice =decimal.Parse(Console.ReadLine()); -
Electro E =newElectro(show_start, show_end, price); -
Console.WriteLine("Сумма за электроэнергию : {0}", E.Sum()); -
Console.ReadKey(); -
return0; -
} }
оплата за электроэнергию
Введите начальные показания счетчика : 0
Введите конечные показания счетчика : 100
Введите цену за 1 кВт/ч : 0,3084
Сумма за электроэнергию : 30,84
Введите начальные показания счетчика : 0
Введите конечные показания счетчика : 100
Введите цену за 1 кВт/ч : 0,3084
Сумма за электроэнергию : 30,84
new
Модификатор new явно скрывает метод базового класса, который имеет такое имя, как и метод производного.
Не желательно создавать имена членов в производном классе, которые соответствуют именам в базовом классе.
Не желательно создавать имена членов в производном классе, которые соответствуют именам в базовом классе.
Main.cs
usingSystem;classBase {-
publicstringShowText() { -
return"Hello World!"; -
} }classOne : Base {-
newpublicstringShowText() { -
return"Привет Мир!"; -
} }classProgram {-
publicstaticintMain() { -
One O =newOne(); -
Console.WriteLine(O.ShowText()); -
Console.ReadKey(); -
return0; -
} }
usingSystem;classBase {-
publicstringShowText() { -
return"Hello World!"; -
} }classOne : Base {-
newpublicstringShowText() { -
return"Привет Мир!"; -
} }classProgram {-
publicstaticintMain() { -
One O =newOne(); -
Console.WriteLine(O.ShowText()); -
Console.ReadKey(); -
return0; -
} }
Привет Мир!
static
Модификатор static создает статический метод, который принадлежит только типу, а не его объекту.
Main.cs
usingSystem;classOne {-
publicstaticstringShowText() { -
return"Привет Мир!"; -
} }classProgram {-
publicstaticintMain() { -
//доступ к методу происходит напрямую -
Console.WriteLine(One.ShowText()); -
Console.ReadKey(); -
return0; -
} }
usingSystem;classOne {-
publicstaticstringShowText() { -
return"Привет Мир!"; -
} }classProgram {-
publicstaticintMain() { -
//доступ к методу происходит напрямую -
Console.WriteLine(One.ShowText()); -
Console.ReadKey(); -
return0; -
} }
Привет Мир!
virtual / override
Полиморфизм — это возможность определения для каждого производного класса собственного способа выполнения одного и того же метода, определенным в базовом классе.
Модификатор virtual используется в базовом классе и указывает, что метод может быть переопределен в производном классе.
Модификатор virtual нельзя использовать с модификаторами override, static, abstract, private.
Модификатор override используется в производном классе и указывает новую реализацию метода, унаследованного от базового класса.
Модификатор override нельзя использовать с модификаторами virtual, static, new.
Модификатор virtual используется в базовом классе и указывает, что метод может быть переопределен в производном классе.
Модификатор virtual нельзя использовать с модификаторами override, static, abstract, private.
Модификатор override используется в производном классе и указывает новую реализацию метода, унаследованного от базового класса.
Модификатор override нельзя использовать с модификаторами virtual, static, new.
Main.cs
usingSystem;classBase {-
publicvirtualdecimalMultiply(decimalarg) { -
return(arg*=2); -
} }classOne : Base {-
//в производном классе переопределяем метод -
publicoverridedecimalMultiply(decimalarg) { -
return(arg*=3); -
} }classTwo : Base {-
//в производном классе переопределяем метод -
publicoverridedecimalMultiply(decimalarg) { -
return(arg*=4); -
} }classProgram {-
publicstaticintMain() { -
Base B =newBase(); -
Console.WriteLine(B.Multiply(5)); -
One O =newOne(); -
Console.WriteLine(O.Multiply(5)); -
Two T =newTwo(); -
Console.WriteLine(T.Multiply(5)); -
Console.ReadKey(); -
return0; -
} }
usingSystem;classBase {-
publicvirtualdecimalMultiply(decimalarg) { -
return(arg*=2); -
} }classOne : Base {-
//в производном классе переопределяем метод -
publicoverridedecimalMultiply(decimalarg) { -
return(arg*=3); -
} }classTwo : Base {-
//в производном классе переопределяем метод -
publicoverridedecimalMultiply(decimalarg) { -
return(arg*=4); -
} }classProgram {-
publicstaticintMain() { -
Base B =newBase(); -
Console.WriteLine(B.Multiply(5)); -
One O =newOne(); -
Console.WriteLine(O.Multiply(5)); -
Two T =newTwo(); -
Console.WriteLine(T.Multiply(5)); -
Console.ReadKey(); -
return0; -
} }
10
15
20
15
20
abstract / override
Абстрактный метод создается с помощью модификатора abstract в абстрактном базовом классе.
Он не имеет тела.
Абстрактный метод может быть объявлен только в абстрактном классе.
Реализация абстрактного метода должна происходить в производном классе.
Он не имеет тела.
Абстрактный метод может быть объявлен только в абстрактном классе.
Реализация абстрактного метода должна происходить в производном классе.
Main.cs
usingSystem;-
abstractclassBase { -
//абстрактный метод может быть объявлен только в абстрактном классе -
abstractpublicdecimalMultiply(decimalarg); }classOne : Base {-
//реализация абстрактного метода -
publicoverridedecimalMultiply(decimalarg) { -
return(arg*=3); -
} }classTwo : Base {-
//реализация абстрактного метода -
publicoverridedecimalMultiply(decimalarg) { -
return(arg*=4); -
} }classProgram {-
publicstaticintMain() { -
One O =newOne(); -
Console.WriteLine(O.Multiply(5)); -
Two T =newTwo(); -
Console.WriteLine(T.Multiply(5)); -
Console.ReadKey(); -
return0; -
} }
usingSystem;-
abstractclassBase { -
//абстрактный метод может быть объявлен только в абстрактном классе -
abstractpublicdecimalMultiply(decimalarg); }classOne : Base {-
//реализация абстрактного метода -
publicoverridedecimalMultiply(decimalarg) { -
return(arg*=3); -
} }classTwo : Base {-
//реализация абстрактного метода -
publicoverridedecimalMultiply(decimalarg) { -
return(arg*=4); -
} }classProgram {-
publicstaticintMain() { -
One O =newOne(); -
Console.WriteLine(O.Multiply(5)); -
Two T =newTwo(); -
Console.WriteLine(T.Multiply(5)); -
Console.ReadKey(); -
return0; -
} }
15
20
20
extern
Если код реализации метода написан не на языке C#, то такой метод называют внешним.
При объявлении внешнего метода используется модификатор extern, так же нужно указать в объявлении, что такой метод должен быть открытым public и статическим static.
Внимание!!! Каждому объявлению метода предшествует атрибут DllImport.
При объявлении внешнего метода используется модификатор extern, так же нужно указать в объявлении, что такой метод должен быть открытым public и статическим static.
Внимание!!! Каждому объявлению метода предшествует атрибут DllImport.
Синтаксис:
[DllImport("имя_библиотеки.dll",CharSet = CharSet.Unicode)]
public static extern тип имя_метода(список_параметров);
[DllImport("имя_библиотеки.dll",CharSet = CharSet.Unicode)]
public static extern тип имя_метода(список_параметров);
Откройте Visual Studio. Создайте новый проект. В шаблонах выберите Other Languages / Visual C++ / Win32 / Консольное приложение Win32. В поле имя введите имя проекта, например dllOne. Имя созданной библиотеки будет иметь такое же название, как и имя проекта.
Появляется окно мастера приложений. Next.
Application type выберите DLL, а в Additional options выберите Empty project.
Application type выберите DLL, а в Additional options выберите Empty project.
Visual Studio создала проект.
Выберите папку Resource Files. Правая кнопка мыши. Add. New Item.
В окне мастера выберите C++ File (.cpp). В поле Name введите имя файла, например main.
Внимание!!! По умолчанию расширение файла .cpp. Удалите буквы рр, что бы расширение было .с
Нажмите Add.
Внимание!!! По умолчанию расширение файла .cpp. Удалите буквы рр, что бы расширение было .с
Нажмите Add.
Введите код. Скомпилируйте, но не запускайте на выполнение. Ниже приведен синтаксис, как должна выглядеть функция.
Синтаксис:
тип __declspec(dllexport)имя_метода(список_параметров) {
//тело функции;
}
тип __declspec(dllexport)имя_метода(список_параметров) {
//тело функции;
}
main.c
unsignedshortshowStart;unsignedshortshowEnd;doubleprice;void__declspec(dllexport) Set(unsignedshortarg0, unsignedshortarg1,doublearg2) {-
showStart = arg0; -
showEnd = arg1; -
price = arg2; }unsignedshort__declspec(dllexport) ResultShow() {-
return(showEnd - showStart); }double__declspec(dllexport) Sum() {-
return(double)(ResultShow() * price); }
unsignedshortshowStart;unsignedshortshowEnd;doubleprice;void__declspec(dllexport) Set(unsignedshortarg0, unsignedshortarg1,doublearg2) {-
showStart = arg0; -
showEnd = arg1; -
price = arg2; }unsignedshort__declspec(dllexport) ResultShow() {-
return(showEnd - showStart); }double__declspec(dllexport) Sum() {-
return(double)(ResultShow() * price); }
Создайте приложение на C#.
Что бы доступ к файлу библиотеки был общим, его нужно скопировать в системную папку C:\Windows\System32, где хранятся библиотеки.
Если нужно, что бы доступ имела только определенная программа, написанная на языке C#, то нужно скопировать файл библиотеки в папку bin\Debug этой программы. В данном примере, файл библиотеки был скопирован в папку bin\Debug этой программы.
Введите код.
Если нужно, что бы доступ имела только определенная программа, написанная на языке C#, то нужно скопировать файл библиотеки в папку bin\Debug этой программы. В данном примере, файл библиотеки был скопирован в папку bin\Debug этой программы.
Введите код.
Main.cs
usingSystem;//подключить пространство именusingSystem.Runtime.InteropServices;classProgram {-
[DllImport("dllOne.dll", CharSet = CharSet.Unicode)] -
publicstaticexternvoidSet(ushortarg0,ushortarg1,doublearg2); -
[DllImport("dllOne.dll", CharSet = CharSet.Unicode)] -
publicstaticexterndoubleSum(); -
publicstaticintMain() { -
Console.WriteLine("оплата за электроэнергию\n"); -
Console.Write("Введите начальные показания счетчика : "); -
ushortshow_start =ushort.Parse(Console.ReadLine()); -
Console.Write("Введите конечные показания счетчика : "); -
ushortshow_end =ushort.Parse(Console.ReadLine()); -
Console.Write("Введите цену за 1 кВт/ч : "); -
doubleprice =double.Parse(Console.ReadLine()); -
Set(show_start, show_end, price); -
Console.WriteLine("Сумма за электроэнергию : {0:F}", Sum()); -
Console.ReadKey(); -
return0; -
} }
usingSystem;//подключить пространство именusingSystem.Runtime.InteropServices;classProgram {-
[DllImport("dllOne.dll", CharSet = CharSet.Unicode)] -
publicstaticexternvoidSet(ushortarg0,ushortarg1,doublearg2); -
[DllImport("dllOne.dll", CharSet = CharSet.Unicode)] -
publicstaticexterndoubleSum(); -
publicstaticintMain() { -
Console.WriteLine("оплата за электроэнергию\n"); -
Console.Write("Введите начальные показания счетчика : "); -
ushortshow_start =ushort.Parse(Console.ReadLine()); -
Console.Write("Введите конечные показания счетчика : "); -
ushortshow_end =ushort.Parse(Console.ReadLine()); -
Console.Write("Введите цену за 1 кВт/ч : "); -
doubleprice =double.Parse(Console.ReadLine()); -
Set(show_start, show_end, price); -
Console.WriteLine("Сумма за электроэнергию : {0:F}", Sum()); -
Console.ReadKey(); -
return0; -
} }
оплата за электроэнергию
Введите начальные показания счетчика : 0
Введите конечные показания счетчика : 100
Введите цену за 1 кВт/ч : 0,3084
Сумма за электроэнергию : 30,84
Введите начальные показания счетчика : 0
Введите конечные показания счетчика : 100
Введите цену за 1 кВт/ч : 0,3084
Сумма за электроэнергию : 30,84