public
Методы с модификатором public являются открытыми и как правило, устанавливают значения для поля или возвращают значения поля.
Main.cs
using
System;
class
One {
-
private
int
val;
-
//метод устанавливает значение для поля
-
public
void
SetVal(
int
arg) {
-
val = arg;
-
}
-
//метод возвращает значение поля
-
public
int
GetVal() {
-
return
val;
-
}
}
class
Program {
-
public
static
int
Main() {
-
One O =
new
One();
-
O.SetVal(10);
-
Console.WriteLine(O.GetVal());
-
Console.ReadKey();
-
return
0;
-
}
}
using
System;
class
One {
-
private
int
val;
-
//метод устанавливает значение для поля
-
public
void
SetVal(
int
arg) {
-
val = arg;
-
}
-
//метод возвращает значение поля
-
public
int
GetVal() {
-
return
val;
-
}
}
class
Program {
-
public
static
int
Main() {
-
One O =
new
One();
-
O.SetVal(10);
-
Console.WriteLine(O.GetVal());
-
Console.ReadKey();
-
return
0;
-
}
}
10
private
Модификатор private установлен по умолчанию, поэтому явно его объявлять не обязательно.
Закрытые методы выполняют какие либо действия внутри класса.
Закрытые методы выполняют какие либо действия внутри класса.
Main.cs
using
System;
class
One {
-
private
int
val;
-
public
One(
int
arg) {
-
val = arg;
-
}
-
//закрытый метод увеличивает значение поля в 2 раза
-
//не обязательно явно указывать модификатор private
-
void
MultiplyTwo() {
-
val*=2;
-
}
-
//метод возвращает значение поля
-
public
int
GetVal() {
-
//закрытый метод выполняется внутри класса
-
MultiplyTwo();
-
return
val;
-
}
}
class
Program {
-
public
static
int
Main() {
-
One O =
new
One(10);
-
Console.WriteLine(O.GetVal());
-
Console.ReadKey();
-
return
0;
-
}
}
using
System;
class
One {
-
private
int
val;
-
public
One(
int
arg) {
-
val = arg;
-
}
-
//закрытый метод увеличивает значение поля в 2 раза
-
//не обязательно явно указывать модификатор private
-
void
MultiplyTwo() {
-
val*=2;
-
}
-
//метод возвращает значение поля
-
public
int
GetVal() {
-
//закрытый метод выполняется внутри класса
-
MultiplyTwo();
-
return
val;
-
}
}
class
Program {
-
public
static
int
Main() {
-
One O =
new
One(10);
-
Console.WriteLine(O.GetVal());
-
Console.ReadKey();
-
return
0;
-
}
}
20
protected
К методам с модификатором protected могут получить доступ только члены базового класса, где они определены и члены производного класса.
Main.cs
using
System;
class
Counter {
-
ushort
showStart;
-
ushort
showEnd;
-
public
Counter(
ushort
arg0,
ushort
arg1) {
-
showStart = arg0;
-
showEnd = arg1;
-
}
-
protected
ushort
ResultShow() {
-
return
(
ushort
)(showEnd - showStart);
-
}
}
class
Electro : Counter {
-
decimal
price;
-
//обратите внимание на инициализатор base базового класса
-
public
Electro(
ushort
arg0,
ushort
arg1,
decimal
arg2) :
base
(arg0, arg1) {
-
price = arg2;
-
}
-
public
decimal
Sum() {
-
//доступ к защищенному методу базового класса
-
return
Math.Round(((
decimal
)(ResultShow()*price)), 2);
-
}
}
class
Program {
-
public
static
int
Main() {
-
Console.WriteLine(
"оплата за электроэнергию\n"
);
-
Console.Write(
"Введите начальные показания счетчика : "
);
-
ushort
show_start =
ushort
.Parse(Console.ReadLine());
-
Console.Write(
"Введите конечные показания счетчика : "
);
-
ushort
show_end =
ushort
.Parse(Console.ReadLine());
-
Console.Write(
"Введите цену за 1 кВт/ч : "
);
-
decimal
price =
decimal
.Parse(Console.ReadLine());
-
Electro E =
new
Electro(show_start, show_end, price);
-
Console.WriteLine(
"Сумма за электроэнергию : {0}"
, E.Sum());
-
Console.ReadKey();
-
return
0;
-
}
}
using
System;
class
Counter {
-
ushort
showStart;
-
ushort
showEnd;
-
public
Counter(
ushort
arg0,
ushort
arg1) {
-
showStart = arg0;
-
showEnd = arg1;
-
}
-
protected
ushort
ResultShow() {
-
return
(
ushort
)(showEnd - showStart);
-
}
}
class
Electro : Counter {
-
decimal
price;
-
//обратите внимание на инициализатор base базового класса
-
public
Electro(
ushort
arg0,
ushort
arg1,
decimal
arg2) :
base
(arg0, arg1) {
-
price = arg2;
-
}
-
public
decimal
Sum() {
-
//доступ к защищенному методу базового класса
-
return
Math.Round(((
decimal
)(ResultShow()*price)), 2);
-
}
}
class
Program {
-
public
static
int
Main() {
-
Console.WriteLine(
"оплата за электроэнергию\n"
);
-
Console.Write(
"Введите начальные показания счетчика : "
);
-
ushort
show_start =
ushort
.Parse(Console.ReadLine());
-
Console.Write(
"Введите конечные показания счетчика : "
);
-
ushort
show_end =
ushort
.Parse(Console.ReadLine());
-
Console.Write(
"Введите цену за 1 кВт/ч : "
);
-
decimal
price =
decimal
.Parse(Console.ReadLine());
-
Electro E =
new
Electro(show_start, show_end, price);
-
Console.WriteLine(
"Сумма за электроэнергию : {0}"
, E.Sum());
-
Console.ReadKey();
-
return
0;
-
}
}
оплата за электроэнергию
Введите начальные показания счетчика : 0
Введите конечные показания счетчика : 100
Введите цену за 1 кВт/ч : 0,3084
Сумма за электроэнергию : 30,84
Введите начальные показания счетчика : 0
Введите конечные показания счетчика : 100
Введите цену за 1 кВт/ч : 0,3084
Сумма за электроэнергию : 30,84
new
Модификатор new явно скрывает метод базового класса, который имеет такое имя, как и метод производного.
Не желательно создавать имена членов в производном классе, которые соответствуют именам в базовом классе.
Не желательно создавать имена членов в производном классе, которые соответствуют именам в базовом классе.
Main.cs
using
System;
class
Base {
-
public
string
ShowText() {
-
return
"Hello World!"
;
-
}
}
class
One : Base {
-
new
public
string
ShowText() {
-
return
"Привет Мир!"
;
-
}
}
class
Program {
-
public
static
int
Main() {
-
One O =
new
One();
-
Console.WriteLine(O.ShowText());
-
Console.ReadKey();
-
return
0;
-
}
}
using
System;
class
Base {
-
public
string
ShowText() {
-
return
"Hello World!"
;
-
}
}
class
One : Base {
-
new
public
string
ShowText() {
-
return
"Привет Мир!"
;
-
}
}
class
Program {
-
public
static
int
Main() {
-
One O =
new
One();
-
Console.WriteLine(O.ShowText());
-
Console.ReadKey();
-
return
0;
-
}
}
Привет Мир!
static
Модификатор static создает статический метод, который принадлежит только типу, а не его объекту.
Main.cs
using
System;
class
One {
-
public
static
string
ShowText() {
-
return
"Привет Мир!"
;
-
}
}
class
Program {
-
public
static
int
Main() {
-
//доступ к методу происходит напрямую
-
Console.WriteLine(One.ShowText());
-
Console.ReadKey();
-
return
0;
-
}
}
using
System;
class
One {
-
public
static
string
ShowText() {
-
return
"Привет Мир!"
;
-
}
}
class
Program {
-
public
static
int
Main() {
-
//доступ к методу происходит напрямую
-
Console.WriteLine(One.ShowText());
-
Console.ReadKey();
-
return
0;
-
}
}
Привет Мир!
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
using
System;
class
Base {
-
public
virtual
decimal
Multiply(
decimal
arg) {
-
return
(arg*=2);
-
}
}
class
One : Base {
-
//в производном классе переопределяем метод
-
public
override
decimal
Multiply(
decimal
arg) {
-
return
(arg*=3);
-
}
}
class
Two : Base {
-
//в производном классе переопределяем метод
-
public
override
decimal
Multiply(
decimal
arg) {
-
return
(arg*=4);
-
}
}
class
Program {
-
public
static
int
Main() {
-
Base B =
new
Base();
-
Console.WriteLine(B.Multiply(5));
-
One O =
new
One();
-
Console.WriteLine(O.Multiply(5));
-
Two T =
new
Two();
-
Console.WriteLine(T.Multiply(5));
-
Console.ReadKey();
-
return
0;
-
}
}
using
System;
class
Base {
-
public
virtual
decimal
Multiply(
decimal
arg) {
-
return
(arg*=2);
-
}
}
class
One : Base {
-
//в производном классе переопределяем метод
-
public
override
decimal
Multiply(
decimal
arg) {
-
return
(arg*=3);
-
}
}
class
Two : Base {
-
//в производном классе переопределяем метод
-
public
override
decimal
Multiply(
decimal
arg) {
-
return
(arg*=4);
-
}
}
class
Program {
-
public
static
int
Main() {
-
Base B =
new
Base();
-
Console.WriteLine(B.Multiply(5));
-
One O =
new
One();
-
Console.WriteLine(O.Multiply(5));
-
Two T =
new
Two();
-
Console.WriteLine(T.Multiply(5));
-
Console.ReadKey();
-
return
0;
-
}
}
10
15
20
15
20
abstract / override
Абстрактный метод создается с помощью модификатора abstract в абстрактном базовом классе.
Он не имеет тела.
Абстрактный метод может быть объявлен только в абстрактном классе.
Реализация абстрактного метода должна происходить в производном классе.
Он не имеет тела.
Абстрактный метод может быть объявлен только в абстрактном классе.
Реализация абстрактного метода должна происходить в производном классе.
Main.cs
using
System;
-
abstract
class
Base {
-
//абстрактный метод может быть объявлен только в абстрактном классе
-
abstract
public
decimal
Multiply(
decimal
arg);
}
class
One : Base {
-
//реализация абстрактного метода
-
public
override
decimal
Multiply(
decimal
arg) {
-
return
(arg*=3);
-
}
}
class
Two : Base {
-
//реализация абстрактного метода
-
public
override
decimal
Multiply(
decimal
arg) {
-
return
(arg*=4);
-
}
}
class
Program {
-
public
static
int
Main() {
-
One O =
new
One();
-
Console.WriteLine(O.Multiply(5));
-
Two T =
new
Two();
-
Console.WriteLine(T.Multiply(5));
-
Console.ReadKey();
-
return
0;
-
}
}
using
System;
-
abstract
class
Base {
-
//абстрактный метод может быть объявлен только в абстрактном классе
-
abstract
public
decimal
Multiply(
decimal
arg);
}
class
One : Base {
-
//реализация абстрактного метода
-
public
override
decimal
Multiply(
decimal
arg) {
-
return
(arg*=3);
-
}
}
class
Two : Base {
-
//реализация абстрактного метода
-
public
override
decimal
Multiply(
decimal
arg) {
-
return
(arg*=4);
-
}
}
class
Program {
-
public
static
int
Main() {
-
One O =
new
One();
-
Console.WriteLine(O.Multiply(5));
-
Two T =
new
Two();
-
Console.WriteLine(T.Multiply(5));
-
Console.ReadKey();
-
return
0;
-
}
}
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
unsigned
short
showStart;
unsigned
short
showEnd;
double
price;
void
__declspec(dllexport) Set(unsigned
short
arg0, unsigned
short
arg1,
double
arg2) {
-
showStart = arg0;
-
showEnd = arg1;
-
price = arg2;
}
unsigned
short
__declspec(dllexport) ResultShow() {
-
return
(showEnd - showStart);
}
double
__declspec(dllexport) Sum() {
-
return
(
double
)(ResultShow() * price);
}
unsigned
short
showStart;
unsigned
short
showEnd;
double
price;
void
__declspec(dllexport) Set(unsigned
short
arg0, unsigned
short
arg1,
double
arg2) {
-
showStart = arg0;
-
showEnd = arg1;
-
price = arg2;
}
unsigned
short
__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
using
System;
//подключить пространство имен
using
System.Runtime.InteropServices;
class
Program {
-
[DllImport(
"dllOne.dll"
, CharSet = CharSet.Unicode)]
-
public
static
extern
void
Set(
ushort
arg0,
ushort
arg1,
double
arg2);
-
[DllImport(
"dllOne.dll"
, CharSet = CharSet.Unicode)]
-
public
static
extern
double
Sum();
-
public
static
int
Main() {
-
Console.WriteLine(
"оплата за электроэнергию\n"
);
-
Console.Write(
"Введите начальные показания счетчика : "
);
-
ushort
show_start =
ushort
.Parse(Console.ReadLine());
-
Console.Write(
"Введите конечные показания счетчика : "
);
-
ushort
show_end =
ushort
.Parse(Console.ReadLine());
-
Console.Write(
"Введите цену за 1 кВт/ч : "
);
-
double
price =
double
.Parse(Console.ReadLine());
-
Set(show_start, show_end, price);
-
Console.WriteLine(
"Сумма за электроэнергию : {0:F}"
, Sum());
-
Console.ReadKey();
-
return
0;
-
}
}
using
System;
//подключить пространство имен
using
System.Runtime.InteropServices;
class
Program {
-
[DllImport(
"dllOne.dll"
, CharSet = CharSet.Unicode)]
-
public
static
extern
void
Set(
ushort
arg0,
ushort
arg1,
double
arg2);
-
[DllImport(
"dllOne.dll"
, CharSet = CharSet.Unicode)]
-
public
static
extern
double
Sum();
-
public
static
int
Main() {
-
Console.WriteLine(
"оплата за электроэнергию\n"
);
-
Console.Write(
"Введите начальные показания счетчика : "
);
-
ushort
show_start =
ushort
.Parse(Console.ReadLine());
-
Console.Write(
"Введите конечные показания счетчика : "
);
-
ushort
show_end =
ushort
.Parse(Console.ReadLine());
-
Console.Write(
"Введите цену за 1 кВт/ч : "
);
-
double
price =
double
.Parse(Console.ReadLine());
-
Set(show_start, show_end, price);
-
Console.WriteLine(
"Сумма за электроэнергию : {0:F}"
, Sum());
-
Console.ReadKey();
-
return
0;
-
}
}
оплата за электроэнергию
Введите начальные показания счетчика : 0
Введите конечные показания счетчика : 100
Введите цену за 1 кВт/ч : 0,3084
Сумма за электроэнергию : 30,84
Введите начальные показания счетчика : 0
Введите конечные показания счетчика : 100
Введите цену за 1 кВт/ч : 0,3084
Сумма за электроэнергию : 30,84