модификаторы метода

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;
  •  }
  • }
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;
  •  }
  • }
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;
  •  }
  • }
оплата за электроэнергию

Введите начальные показания счетчика : 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;
  •  }
  • }
Привет Мир!

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;
  •  }
  • }
Привет Мир!

virtual / override

Полиморфизм — это возможность определения для каждого производного класса собственного способа выполнения одного и того же метода, определенным в базовом классе.

Модификатор 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;
  •  }
  • }
10
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;
  •  }
  • }
15
20

extern

Если код реализации метода написан не на языке C#, то такой метод называют внешним.
При объявлении внешнего метода используется модификатор extern, так же нужно указать в объявлении, что такой метод должен быть открытым public и статическим static.
Внимание!!! Каждому объявлению метода предшествует атрибут DllImport.
Синтаксис:
[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.
Visual Studio создала проект.
Выберите папку Resource Files. Правая кнопка мыши. Add. New Item.
В окне мастера выберите C++ File (.cpp). В поле Name введите имя файла, например main.
Внимание!!! По умолчанию расширение файла .cpp. Удалите буквы рр, что бы расширение было
Нажмите Add.
Введите код. Скомпилируйте, но не запускайте на выполнение. Ниже приведен синтаксис, как должна выглядеть функция.
Синтаксис:
тип __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);
  • }
Создайте приложение на C#.
Что бы доступ к файлу библиотеки был общим, его нужно скопировать в системную папку C:\Windows\System32, где хранятся библиотеки.
Если нужно, что бы доступ имела только определенная программа, написанная на языке 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;
  •  }
  • }
оплата за электроэнергию

Введите начальные показания счетчика : 0
Введите конечные показания счетчика : 100
Введите цену за 1 кВт/ч : 0,3084
Сумма за электроэнергию : 30,84