C#. Класс. Описание класса. Объект класса. Конструктор класса. Деструктор. Ключевое слово this




Класс. Описание класса. Объект класса. Поля класса. Примеры. Ключевое слово this. Массив объектов в классе


Содержание


Поиск на других ресурсах:

1. Что такое класс и объект класса?

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

Если класс подобен типу в традиционных языках программирования, тогда объект класса подобен переменной. Иногда объекты называются экземплярами класса. Объект класса реализует один из возможных вариантов описания класса. При объявлении объекта класса для него выделяется память.

 

2. Какое отличие между объявлением класса и объявлением объекта класса?

При объявлении класса память не выделяется. Формируется только описание элементов класса.

Описание класса еще называют объявлением класса. В описании класса указываются данные и программный код. Как правило, программный код выполняет какую-то работу над данными в классе (оперирует данными в классе). При описании класса оперативная память для данных и программного кода не выделяется. Описание класса – это своего рода информация о том, какие данные есть в этом классе и какую работу (методы) выполняются над этими данными.

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

 

3. Что объявляется в классе?

При описании класса объявляются данные, которые он содержит, и программный код, который оперирует этими данными.

Также класс может содержать только данные или только программный код. Но при работе с классами большинство классов содержат и данные и программный код.

C# класс данные код рисунок

Данные помещаются в членах-данных, которые определяются классом, а код – в функциях-членах. В языке С# поддерживается несколько разновидностей членов-данных и функций-членов.

 

4. Что называется полями класса?

Члены-данные еще называются полями класса. К членам-данным относятся переменные экземпляра класса и статические переменные. Поля класса могут иметь любой допустимый в приложении тип.

 

5. Какие элементы языка C# могут относиться к функциям-членам класса?

К функциям-членам класса могут относиться:

  • методы;
  • конструкторы;
  • деструкторы;
  • индексаторы;
  • события;
  • операторы;
  • свойства.

 

6. Какая общая форма описания класса?

Класс создается с помощью ключевого слова class. Общая форма описания класса имеет вид:

class имя_класса
{
   // Объявление переменных экземпляра класса.
   доступ тип переменная1;
   доступ тип переменная2;
   // ...
   доступ тип переменнаяN;

   // Объявление методов.
   доступ возвращаемый_тип метод1(параметры)
   {
       // тело метода
   }
   доступ возвращаемый_тип метод2(параметры)
   {
       // тело метода
   }
   // ...
   доступ возвращаемый_тип методN(параметры)
   {
       // тело метода
   }
}

В вышеприведенном описании:

  • имя_класса – имя, которое дается классу. Имя класса определяет новый тип данных. Имя класса может отвечать сущности класса. В свою очередь, класс должен определять одну (и только одну) логическую сущность;
  • доступ – это тип доступа. В языке C# предусмотрены четырех модификаторы доступа: public (общедоступный член класса), private (скрытый член), protected (защищенный) и internal. Модификатор internal определяет доступность члена класса во всех членах сборки и его недоступность за пределами сборки.
  • тип – тип переменной, которая есть членом класса;
  • переменная1, переменная2, …, переменнаяN – переменные, которые есть членами класса (данными в классе);
  • метод1, метод2, …, методN – методы, которые есть членами класса;
  • возвращаемый_тип – тип, который возвращается методом класса;
  • параметры – параметры методов, которые определяются в классе.

 

7. Какие существуют типы (модификаторы) доступа к членам класса?

Доступ к членам класса может быть пяти типов:

  • private – закрытый доступ. В этом случае члены (данные или методы) класса доступны только в границах класса. Это означает, что доступ к private членам класса имеют только переменные и методы этого класса;
  • public – открытый доступ. В этом случае члены класса есть доступными за пределами класса. Это означает, что public-члены класса можно использовать во всех других фрагментах кода – даже тех, что определенны за пределами класса;
  • protected – защищенный доступ. Данный тип используется в случае наследственности при построении иерархии классов. В этом случае protected-члены класса есть защищенными. Такие члены класса есть открытыми в границах иерархии классов, но закрытыми за пределами иерархии классов;
  • internal – определяет доступность члена класса во всех файлах сборки и его недоступность за пределами сборки. Это означает, что internal-члены класса известны только в самой программе, но не за ее пределами. Данный модификатор полезен при создании программных компонент;
  • protected internal — это есть комбинация модификаторов protected  и internal с использованием логической операции «ИЛИ».  Такой член класса видим в пределах класса или в унаследованных классах а также в любых методах текущей сборки. Унаследованный класс может размещаться в той же самой сборке или даже в другой сборке.

 

8. Какие возможности доступа дает использование спаренного модификатора доступа protected internal?

Спаренный идентификатор доступа protected internal состоит из двух отдельных модификаторов доступа protected и internal.

Член класса, который объявлен как protected internal, доступен:

  • в методах текущего класса;
  • в методах вложенного класса в случае, если в классе используются вложенные классы;
  • в методах производного класса (protected);
  • в методах текущей сборки (internal).


 

9. Может ли отсутствовать тип (модификатор) доступа при описании членов класса?

Ответ: да, может быть. В этом случае объявляемый член класса считается скрытым по умолчанию – private.

Пример.

...

// Объявление класса типа MyPoint
class MyPoint
{
    int x; // x - частный член класса (private)
    public int y;
}

...

// доступ к члену класса в программе
MyPoint p = new MyPoint();

// p.x = 25; - ошибка!, доступ закрыт
p.y = 13; // работает, так как p.y объявлен как public

...

 

10. Примеры описания простейших классов, содержащих только данные.

Пример 1. Класс, содержащий только данные. В этом примере создается новый тип MyPoint. Описывается общедоступный класс (public) MyPoint, описывающий точку на координатной плоскости.

...

public class MyPoint
{
    public int x; // координата x
    public int y; // координата y
}

...

Пример 2. Описание класса с именем MyBook, содержащего данные о книге.

...

public class MyBook
{
    public string Title;  // название книги
    public string Author; // фамилия автора
    public int year;      // год выпуска
    public float price;   // стоимость книги
}

...

 

11. Как создать объект (экземпляр класса)?

После описания класса создается новый тип. В предыдущем пункте создается тип с именем MyPoint. Объект класса описывается как обычная переменная некоторого типа.

Пример 1. Создание экземпляра объекта типа MyPoint (смотрите предыдущий пункт).

Способ 1. Создание экземпляра объекта типа MyPoint с именем p.

MyPoint p = new MyPoint(); // создается переменная p типа MyPoint,
// выделяется память под объект класса MyPoint,
// переменной p присваивается ссылка на объект

// заполнение полей класса
p.x = 25;
p.y = -10;

Способ 2.

MyPoint p;
p = new MyPoint();// выделение памяти - обязательно!!!, иначе - ошибка
// заполнение полей класса
p.x = 25;
p.y = -10;

Пример 2. Создание экземпляра класса типа MyBook (смотрите предыдущий пункт) с именем b.

MyBook b = new MyBook();

// заполнение полей класса
b.Title = "Title of Book";
b.Author = "Author of Book";
b.year = 1998;
b.price = 0.01f;

 

12. К каким типам данных принадлежат классы: к типам значения или к ссылочным типам?

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

Пример.

// переменная z есть типа double, который есть типом-значением
double z;
z = 2.85; // в переменную z заносится значение 2.85

MyPoint p; // создается переменная-ссылка p типа MyPoint
p = new MyPoint(); // выделяется память оператором new
// переменной p присваивается ссылка на выделенную память

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

C# ссылка тип значение рисунок

 

13. Пример описания класса, который содержит данные и методы (функции)

Над данными в классе можно выполнять некоторую работу. Это осуществляется функциями-членами класса.

В следующих фрагментах кода описываются классы с собственными функциями.

Пример 1. Модификация класса MyPoint, содержащего координаты точек. В класс добавлены четыре новые функции-члены (методы):

  • функция GetX(), возвращающая координату x;
  • функция GetY(), возвращающая координату y;
  • функция SetX(), устанавливающая координату x в новое значение;
  • функция SetY(), устанавливающая координату y в новое значение.

Внутренние переменные x, y класса объявлены как private.

class MyPoint
{
    // внутренние данные - объявлены как private
    private int x;
    private int y;

    // функция-член класса GetX
    public int GetX()
    {
        return x;
    }

    // функция-член класса GetY
    public int GetY()
    {
        return y;
    }

    // функция-член класса SetX
    public void SetX(int newx)
    {
        x = newx;
    }

    // функция-член класса SetY
    public void SetY(int newy)
    {
        y = newy;
    }
}

...

// использование класса в программе
MyPoint p = new MyPoint();

// вызов функций-членов класса
p.SetX(5);
p.SetY(8);

// p.x и p.y - недоступны

// вывод на форму значения координаты x объекта класса p
label1.Text = p.GetX().ToString();

...

 

14. Пример использования массива объектов класса и описания деструктора в классе

В приведенном примере создается два класса. Первый типа «КНИГА» (MyBook), второй – массив книг MyBooks. В классе MyBooks описывается деструктор.

// класс типа "КНИГА"
class MyBook
{
    // поля класса - объявлены как скрытые (private)
    private string Title;
    private string Author;
    private int year;
    private float price;

    // конструктор класса без параметров
    public MyBook()
    {
        Title = "";
        Author = "";
        year = 1900;
        price = 0.00f;
    }

    // конструктор класса с четырьмя параметрами
    public MyBook(string t, string a, int y, float p)
    {
        Title = t;
        Author = a;
        year = y;
        price = p;
    }
}

// класс - массив книг
class MyBooks
{
    MyBook[] mas_books; // массив книг

    // конструктор класса MyBooks
    public MyBooks()
    {
        // выделение памяти под массив в целом
        mas_books = new MyBook[10];

        // выделение памяти под отдельный элемент массива
        for (int i = 0; i < 10; i++)
        {
            // вызов конструктора с четырьмя параметрами
            mas_books[i] = new MyBook("T" + i.ToString(),"A" + i.ToString(),i, (float)(i * 5));
        }
    }

    // деструктор класса MyBooks
    ~MyBooks()
    {
        // действия, которые нужно сделать перед уничтожением данного объекта
        // ...
    }

    // внутренний метод, который возвращает книгу, заданную индексом
    public MyBook GetBook(int index)
    {
        return (MyBook)mas_books[index];
    }
}

...

// использование в программе
MyBooks MB = new MyBooks(); // в конструкторе создается массив с 10 книг типа MyBook

...

 

15. Какие особенности использования ключевого слова this в классе?

В объявлении класса все члены класса получают неявно ссылку this, которая есть ссылкой на текущий экземпляр класса. Более подробно о случаях и примерах применения this в классах описывается здесь.

Пример. Объявление класса DemoThis. В классе есть два поля. Одно поле скрытое (private) типа int с именем i. Второе поле общедоступно (public) типа double с именем d.

В классе описаны два метода с именами GetI1() и GetI2(). Эти методы возвращают значение поля i. Эти методы выполняют одинаковую работу, но доступ к полю i осуществляется по разному. То же касается и методов GetD1() и GetD2().

В конструкторе класса DemoThis(int, double), получющего два параметра, ключевое слово this служит для доступа к полям (членам данных) i и d класса. Это обусловлено тем, что локальные переменные-параметры конструктора с такими же именами (i и d) скрывают объявленные члены данных класса.

class DemoThis
{
    private int i;   // скрытое поле
    public double d; // общедоступное поле

    // конструктор, который обнуляет поля
    public DemoThis()
    {
        i = 0; // без слова this
        this.d = 0.00; // с использованием this
    }

    // Данный конструктор демонстрирует преимущество использования
    // ключевого слова this.
    // Конструктор получает два параметра, имена которых совпадают с
    // названиями полей класса.
    public DemoThis(int i, double d)
    {
        this.i = i; // this.i - поле класса: private int i;
        this.d = d; // this.d - поле класса: public double d;
    }

    // возврат из метода без использования this
    public int GetI1()
    {
        return i;
    }

    // использование указателя this на собственный класс
    public int GetI2()
    {
        return this.i;
    }

    public double GetD1()
    {
        return d; // без указателя this
    }

    public double GetD2()
    {
        return this.d; // с указателем this
    }
}

 

16. Уровни доступности класса в сборке. Пример

В языке C# существует возможность скрыть класс (тип) в текущей сборке или сделать его доступным из других сборок (другого кода).

Уровень доступности класса может быть следующим:

  • public – открытый уровень доступности. При объявлении класса с уровнем доступности public этот класс доступен из любого кода любой сборки;
  • internal – в этом случае класс доступен в пределах текущей сборки.

Если перед словом class отсутствует ключевое слово public или internal, то по умолчанию принимается уровень доступа в пределах текущей сборки (internal).

Приклад.

// Объявление общедоступного класса
public class MyClass1
{
  // ...
}

// Объявление класса, доступного в пределах текущей сборки
internal class MyClass2
{
  // ...
}

 


Связанные темы