Когда вы определяете класс, вы определяете схему для типа данных. Это фактически не определяет какие-либо данные, но определяет определение имени класса. То есть, что представляет собой объект класса и какие операции могут выполняться на этом объекте. Объекты - это экземпляры класса. Методы и переменные, составляющие класс, называются членами класса.

Определение класса

Определение класса начинается с класса ключевого слова, за которым следует имя класса; и тело класса, заключенное в пару фигурных скобок. Ниже приведен общий вид определения класса:

<access specifier> class  class_name {
   // member variables
   <access specifier> <data type> variable1;
   <access specifier> <data type> variable2;
   ...
   <access specifier> <data type> variableN;
   // member methods
   <access specifier> <return type> method1(parameter_list) {
      // method body
   }
   <access specifier> <return type> method2(parameter_list) {
      // method body
   }
   ...
   <access specifier> <return type> methodN(parameter_list) {
      // method body
   }
}
  • Спецификаторы доступа определяют правила доступа для членов, а также сам класс. Если не указано, то спецификатор доступа по умолчанию для типа класса является внутренним . Доступ по умолчанию для членов является закрытым .
  • Тип данных задает тип переменной, а тип возврата указывает тип данных, возвращаемых методом, если таковой имеется.
  • Чтобы получить доступ к членам класса, вы используете оператор dot (.).
  • Оператор-точка связывает имя объекта с именем члена.

Следующий пример иллюстрирует обсуждаемые до сих пор концепции:

using System;

namespace BoxApplication {
   class Box {
      public double length;   // Length of a box
      public double breadth;  // Breadth of a box
      public double height;   // Height of a box
   }
   class Boxtester {
      static void Main(string[] args) {
         Box Box1 = new Box();   // Declare Box1 of type Box
         Box Box2 = new Box();   // Declare Box2 of type Box
         double volume = 0.0;    // Store the volume of a box here

         // box 1 specification
         Box1.height = 5.0;
         Box1.length = 6.0;
         Box1.breadth = 7.0;

         // box 2 specification
         Box2.height = 10.0;
         Box2.length = 12.0;
         Box2.breadth = 13.0;
           
         // volume of box 1
         volume = Box1.height * Box1.length * Box1.breadth;
         Console.WriteLine("Volume of Box1 : {0}",  volume);

         // volume of box 2
         volume = Box2.height * Box2.length * Box2.breadth;
         Console.WriteLine("Volume of Box2 : {0}", volume);
         Console.ReadKey();
      }
   }
}

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

Volume of Box1 : 210
Volume of Box2 : 1560

Функции членов и инкапсуляция

Функция-член класса - это функция, которая имеет свое определение или ее прототип в определении класса, аналогичном любой другой переменной. Он работает на любом объекте класса, членом которого он является, и имеет доступ ко всем членам класса для этого объекта.

Переменные-члены - это атрибуты объекта (с точки зрения дизайна), и они остаются закрытыми для реализации инкапсуляции. Доступ к этим переменным можно получить только с помощью функций открытого участника.

Положим выше понятия, чтобы установить и получить значение разных членов класса в классе -

using System;

namespace BoxApplication {
   class Box {
      private double length;   // Length of a box
      private double breadth;  // Breadth of a box
      private double height;   // Height of a box
      
      public void setLength( double len ) {
         length = len;
      }
      public void setBreadth( double bre ) {
         breadth = bre;
      }
      public void setHeight( double hei ) {
         height = hei;
      }
      public double getVolume() {
         return length * breadth * height;
      }
   }
   class Boxtester {
      static void Main(string[] args) {
         Box Box1 = new Box();   // Declare Box1 of type Box
         Box Box2 = new Box();
         double volume;
         
         // Declare Box2 of type Box
         // box 1 specification
         Box1.setLength(6.0);
         Box1.setBreadth(7.0);
         Box1.setHeight(5.0);
         
         // box 2 specification
         Box2.setLength(12.0);
         Box2.setBreadth(13.0);
         Box2.setHeight(10.0);
         
         // volume of box 1
         volume = Box1.getVolume();
         Console.WriteLine("Volume of Box1 : {0}" ,volume);
         
         // volume of box 2
         volume = Box2.getVolume();
         Console.WriteLine("Volume of Box2 : {0}", volume);
         
         Console.ReadKey();
      }
   }
}

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

Volume of Box1 : 210
Volume of Box2 : 1560

Конструкторы C #

Конструктор класса - это специальная функция-член класса, которая выполняется всякий раз, когда мы создаем новые объекты этого класса.

Конструктор имеет то же имя, что и класс, и у него нет никакого типа возврата. В следующем примере объясняется концепция конструктора -

using System;

namespace LineApplication {
   class Line {
      private double length;   // Length of a line
      
      public Line() {
         Console.WriteLine("Object is being created");
      }
      public void setLength( double len ) {
         length = len;
      }
      public double getLength() {
         return length;
      }

      static void Main(string[] args) {
         Line line = new Line();    
         
         // set line length
         line.setLength(6.0);
         Console.WriteLine("Length of line : {0}", line.getLength());
         Console.ReadKey();
      }
   }
}

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

Object is being created
Length of line : 6

Конструктор по умолчанию не имеет какого - либо параметра , но если вам нужно, конструктор может иметь параметры. Такие конструкторы называются параметризованными конструкторами . Этот метод позволяет назначить начальное значение объекту во время его создания, как показано в следующем примере -

using System;

namespace LineApplication {
   class Line {
      private double length;   // Length of a line
      
      public Line(double len) {  //Parameterized constructor
         Console.WriteLine("Object is being created, length = {0}", len);
         length = len;
      }
      public void setLength( double len ) {
         length = len;
      }
      public double getLength() {
         return length;
      }
      static void Main(string[] args) {
         Line line = new Line(10.0);
         Console.WriteLine("Length of line : {0}", line.getLength()); 
         
         // set line length
         line.setLength(6.0);
         Console.WriteLine("Length of line : {0}", line.getLength()); 
         Console.ReadKey();
      }
   }
}

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

Object is being created, length = 10
Length of line : 10
Length of line : 6

Деструктор C #

Деструктор специальной функция члена класса , который выполняется всякий раз , когда объект этого класса выходит из области видимости. Деструктор имеет такое же имя, что и класс с префиксом тильды (~) и он не может ни возвращать значение и не может принимать какие - либо параметры.

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

В следующем примере объясняется концепция деструктора -

using System;

namespace LineApplication {
   class Line {
      private double length;   // Length of a line
      
      public Line() {   // constructor
         Console.WriteLine("Object is being created");
      }
      ~Line() {   //destructor
         Console.WriteLine("Object is being deleted");
      }
      public void setLength( double len ) {
         length = len;
      }
      public double getLength() {
         return length;
      }
      static void Main(string[] args) {
         Line line = new Line();

         // set line length
         line.setLength(6.0);
         Console.WriteLine("Length of line : {0}", line.getLength());           
      }
   }
}

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

Object is being created
Length of line : 6
Object is being deleted

Статические члены класса C #

Мы можем определить членов класса как статические, используя ключевое слово static . Когда мы объявляем член класса статичным, это означает, что независимо от того, сколько объектов класса создано, есть только одна копия статического члена.

Ключевое слово static подразумевает, что для класса существует только один экземпляр элемента. Статические переменные используются для определения констант, потому что их значения могут быть получены путем вызова класса без создания его экземпляра. Статические переменные могут быть инициализированы вне функции-члена или определения класса. Вы также можете инициализировать статические переменные внутри определения класса.

Следующий пример демонстрирует использование статических переменных -

using System;

namespace StaticVarApplication {
   class StaticVar {
      public static int num;
      
      public void count() {
         num++;
      }
      public int getNum() {
         return num;
      }
   }
   class StaticTester {
      static void Main(string[] args) {
         StaticVar s1 = new StaticVar();
         StaticVar s2 = new StaticVar();
         
         s1.count();
         s1.count();
         s1.count();
         
         s2.count();
         s2.count();
         s2.count();
         
         Console.WriteLine("Variable num for s1: {0}", s1.getNum());
         Console.WriteLine("Variable num for s2: {0}", s2.getNum());
         Console.ReadKey();
      }
   }
}

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

Variable num for s1: 6
Variable num for s2: 6

Вы также можете объявить функцию- член как статическую . Такие функции могут иметь доступ только к статическим переменным. Статические функции существуют еще до создания объекта. Следующий пример демонстрирует использование статических функций -

using System;

namespace StaticVarApplication {
   class StaticVar {
      public static int num;
      
      public void count() {
         num++;
      }
      public static int getNum() {
         return num;
      }
   }
   class StaticTester {
      static void Main(string[] args) {
         StaticVar s = new StaticVar();
         
         s.count();
         s.count();
         s.count();
         
         Console.WriteLine("Variable num: {0}", StaticVar.getNum());
         Console.ReadKey();
      }
   }
}

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

Variable num: 3