Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 11275 / 456 | Оценка: 4.12 / 4.01 | Длительность: 19:20:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 15:

С#. Классы и структуры.

< Лекция 14 || Лекция 15: 12345 || Лекция 16 >
Пространство имен System

Библиотека классов .NET Framework среды Visual Studio.NET состоит из иерархически организованного набора пространства имен. В каждом пространстве имен определяется набор типов (классы, структуры, нумераторы, интерфейсы). Пространство имен System содержит набор классов для общеиспользуемых значений и ссылочных типов данных, событий и обработчиков событий, интерфейсов, атрибутов и т.п. Также это пространство имен содержит классы, позволяющие выполнять преобразование типов, реализовывать операции ввода/вывода и т.п.

Все встроенные типы данных языка C# реализованы как классы пространства имен. Пространство имен System включает такие классы, как Console, String, Array, Math, Boolean, Byte, Char, DateTime, Decimal, Double, Int16, Int32, Void и т.п.

Псевдонимы типов языка C# и соответствующие им предопределенные типы пространства имен являются при написании программы взаимозаменяемыми.

Для определения типа переменной можно использовать метод GetType или оператор typeof.

Библиотека классов NET Framework предоставляет для реализации потоков ввода, вывода и ошибок класс Console, располагаемый в пространстве имен System.

Класс Console имеет следующие свойства, описывающие соответствующие потоки ввода/вывода:

  • In - стандартный поток ввода;
  • Out - стандартный поток вывода;
  • Error - стандартный поток вывода ошибок.

Класс Console содержит следующие методы, позволяющие осуществлять чтение и запись символов из потоков ввода/вывода:

  • Read - чтение символов из потока ввода;
  • ReadLine - чтение строки символов из потока ввода;
  • Write - запись строки символов в поток вывода;
  • WriteLine - запись в поток вывода строки символа, ограниченной символами конца строки.

Работа с различными видами коллекций реализуется такими классами пространства имен System.Collections , как:

  • ArrayList - динамически расширяемый массив;
  • BitArray - структура данных, каждый элемент которой реализуется как битовое значение;
  • Hashtable - коллекция связанных ключей и значений;
  • SortedList - массив, состоящий из пар "ключ-значение";
  • Queue - очередь;
  • Stack - коллекция объектов, реализуемая как стек.

Создание классов

Объявление класса

В языке С# определение класса не обязательно должно иметь методы конструктор и деструктор.

Управляемый код на языке С# избавлен от необходимости освобождения памяти, выделяемой под объекты, так как это реализуется средой NET Framework. Поэтому основное назначение деструктора в языке C# - это освобождение неуправляемых ресурсов, таких как окна, файлы, сетевые соединения и т.п.

Язык C# поддерживает три типа конструкторов:

  • конструктор экземпляра объекта ( instance ), используемый при создании объекта;
  • private-конструктор, указываемый в коде для предотвращения автоматического создания конструктора по умолчанию. Такой тип конструктора используется для классов, имеющих только статические члены. Экземпляр объекта с private-конструктором не может быть создан.
  • статический конструктор ( static ), вызываемый для инициализации класса до создания первого объекта или до первого вызова статического метода. Статический конструктор не может иметь модификаторы доступа и список параметров.

Конструктор экземпляра объекта имеет следующее формальное описание:

[атрибуты] [модификаторы_доступа] 
     имя_конструктора([список_формальных_параметров]) 
        [:base (список_аргументов) | :this (список_аргументов)] 
        { тело_конструктора }

Ключевое слово base определяет явный вызов конструктора базового класса, а ключевое слово this - вызов конструктора данного класса с указанным списком параметров.

Например:

public class AClass1
  {
    public AClass1()// Объявление конструктора
    {  
    }
  }

Ключевое слово class определяет имя объявляемого класса. Тело объявляемого класса указывается в фигурных скобках.

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

По умолчанию все переменные и методы - члены класса, заданные без модификатора доступа, считаются private -переменными (называемыми иногда приватными или закрытыми). Приватные переменные доступны только внутри экземпляра класса и не могут быть использованы во внешних функциях модуля.

Модификаторы доступа

В языке C# применяются следующие модификаторы доступа:

  • public - доступ не ограничен;
  • protected - доступ ограничен только наследуемыми классами;
  • internal - доступ ограничен рамками текущего проекта;
  • private - доступ ограничен рамками данного класса.

Для любого члена класса или объектного типа разрешено указывать только один модификатор доступа, за исключением комбинации protected internal, регламентирующей ограничение доступа наследуемыми классами текущего проекта.

Например:

class A 
{
   protected int x = 100;
}

class B : A 
{
   void M1() 
   {
      A a1 = new A();  // Создание объекта типа A
      B b1 = new B();  // Создание объекта типа B
     // a1.x = 200;   - доступ не разрешен
      b1.x = 200;   // Правильно реализованный доступ
   }
}

Отметим, что пространство имен не может иметь модификатора доступа.

Язык C# поддерживает использование вложенных классов.

Типы верхнего уровня, которые не являются вложенными в другие типы, могут иметь модификатор доступа только internal (по умолчанию) или public.

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

Член, определяемый в: Модификатор доступа,используемый по умолчанию Допустимые модификаторы доступа,используемые для членов
enum Public -
class private public protected internal private protected internal
interface public -
struct private public internal private

Структуры не могут иметь модификатор доступа protected,так как не могут быть наследуемы

Например:

using System;
namespace MyNameSpace 
{
   public class A 
   {
  public static int myPublicInt;
  internal static int myInternalInt;
  private static int myPrivateInt = 0;

  public class Nest1   // "Вложенный" член класса
  {
     public static int myPublicInt;
     internal static int myInternalInt;
     private static int myPrivateInt = 0;
  }

  private class Nest2   // "Вложенный" член класса
  {
     public static int myPublicInt = 0;
     internal static int myInternalInt = 0;
     private static int myPrivateInt = 0;
  }
   }
   public class MyClass 
   {
  public static int Main() 
  {
    // Доступ к членам класса A:
    A.myPublicInt = 1;  // Доступ не ограничен
    A.myInternalInt = 2; // Только в текущем проекте
    // A.myPrivateInt = 3; - ошибка: нет 
    // доступа вне класса   
    // Доступ к членам класса Nest1:
     A.Nest1.myPublicInt = 1; // Доступ не ограничен
     A.Nest1.myInternalInt = 2;   // Только в текущем проекте
    // A.Nest1.myPrivateInt = 3; - ошибка: нет 
    // доступа вне класса Nest1
    // Доступ к членам класса Nest2:
    // A.Nest2.myPublicInt = 1;   - ошибка: нет 
    // доступа вне класса A
    // A.Nest2.myInternalInt = 2; - ошибка: нет 
    // доступа вне класса A
    // A.Nest2.myPrivateInt = 3;  - ошибка: нет 
    // доступа вне класса Nest2
    return 0;
  }
   }
}
Листинг 15.1.
< Лекция 14 || Лекция 15: 12345 || Лекция 16 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

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

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);