Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 157 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 20:

Консольные приложения в С#

< Лекция 19 || Лекция 20: 1234567891011

Методы классов в C#

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

Методы могут принимать или не принимать параметры, могут возвращать или не возвращать значения, могут быть методами класса (статическими) или методами экземпляра (объекта).

Для каждого метода существует свой уровень доступа, который определяет, откуда можно будет обратиться к этому методу. Для указания уровня доступа существуют специальные модификаторы. Они приведены в таблице

Таблица 20.7 . Модификаторы уровня доступа к методам в C#
Модификатор Назначение
public Модификатор общедоступности метода
private (по умолчанию) Метод будет доступен только внутри класса, где он определен. Если при объявлении метода модификатор явно не указан, то используется по умолчанию модификатор private
protected Метод будет доступен только внутри самого класса и внутри любого производного от него класса. Для остальных вызовов из внешнего мира такой метод будет недоступен
internal Метод будет доступен из всех классов внутри сборки, в которой он определен. Из-за пределов этой сборки обратиться к нему будет нельзя
protected internal Доступен для самого класса и его наследников внутри сборки, где они определены

Ниже приведены заготовки кода, иллюстрирующие уровни доступа к методам.

// Уровни доступа к методам
class SomeClass
{
  // Доступен отовсюду
  public void Method1(){...}
  
  // Доступен только из методов класса SomeClass
  private void Method2(){...}
  
  // Доступен из класса SomeClass и его наследников
  // на любом нижестоящем уровне иерархии наследования
  protected void Method3(){...}
  
  // Доступен из всех классов той же сборки
  internal void Method4(){...}
  
  // Доступен для себя и наследников из той же сборки
  protected internal void Method5(){...}
  
  // Только для внутреннего пользования
  void Method6(){...}
}
Листинг 20.32 . Иллюстрация уровней доступа к методам

Сейчас мы продемонстрируем то, что в C# имена классов, имена пространства имен, идентификаторы типов данных и имена методов можно писать русскими буквами. Только ключевые слова должны оставаться неизменными, а все идентификаторы, которые волен выбирать программист, можно излагать кириллицей. Мы просто это продемонстирируем и заметим, что это плохая практика, хотя такая возможность есть.

using System;
  
namespace МоеПространствоИмен
{
class Жалобщик
{
  // Объект для генерации случайных чисел
  // rand - закрытая private переменная класса
  System.Random rand = new System.Random();
  
  private int ДатьЧисло(short лимит)
  {
  // Генерирует целое число в диапазоне
  // от нуля до "лимит"
  return rand.Next(лимит);
  }
  
  public string ГенераторЖалоб()
  {
  string[] массивЖалоб = new string[5]
    {
    "О, зачем я пошел на эту специальность!",
    "Как бы я был счастлив, если бы не C#!",
    "Ну почему именно я и именно со мной!",
    "Подвесить бы Уайта Гейтца за его язык C#!",
    "Единственное спасение - уволить Снеткова!"
        };
    return массивЖалоб[ДатьЧисло(5)];
    }
  
  static void Main()
    {
    Жалобщик жалобы = new Жалобщик();
    for(int i = 0; i < 10; i++)
    {
    Console.WriteLine("{0}) \t{1}", 
      i+1, жалобы.ГенераторЖалоб());
    }
  
    while(true);
    }
  }
}
Листинг 20.33 . Применение кириллицы при выборе идентификаторов

Результаты выполнения не зависят от "культуры"

1)   О, зачем я пошел на эту специальность!
2)   Как бы я был счастлив, если бы не C#!
3)   Единственное спасение - уволить Снеткова!
4)   Как бы я был счастлив, если бы не C#!
5)   Как бы я был счастлив, если бы не C#!
6)   Подвесить бы Уайта Гейтца за его язык C#!
7)   О, зачем я пошел на эту специальность!
8)   Как бы я был счастлив, если бы не C#!
9)   Единственное спасение - уволить Снеткова!
10)   Подвесить бы Уайта Гейтца за его язык C#!

Предостережение

Никогда не используйте русские имена идентификаторов в программе. Иначе мозги лопнут если и не у Вас, так у бедного сопровождающего программиста - точно.

Статические методы и статические данные

(методы уровня классов и методы уровня объектов; общие данные для всех объектов и индивидуальные данные для каждого объекта))

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

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

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

Приведем примеры...

using System;
  
namespace Test
{
  class Teenager
  {
  // Объект для генерации случайных чисел
  // rand - закрытая private переменная класса
  static System.Random rand = new System.Random();
  
  private static int GetRandomNumber(short upperLimit)
  {
  // Генерирует целое число в диапазоне
  // от 0 до upperLimit
  return rand.Next(upperLimit);
  }
  
  public static string Complain()
  {
  string[] messages = new string[5]
    {
    "О, зачем я пошел на эту специальность!",
    "Как бы я был счастлив, если бы не C#!",
    "Ну почему именно я и именно со мной!",
    "Подвесить бы Уайта Гейтца за его язык C#!",
    "Единственное спасение - уволить Снеткова!"
    };
  return messages[GetRandomNumber(5)];
  }
  
  static void Main()
  {
  for(int i = 0; i < 10; i++)
  {
  Console.WriteLine("{0}) \t{1}", i+1, 
    Teenager.Complain());
  }
  while(true);
  }
}
}
Листинг 20.34 . Методы уровня класса

Результаты выполнения

1)   Подвесить бы Уайта Гейтца за его язык C#!
2)   О, зачем я пошел на эту специальность!
3)   Как бы я был счастлив, если бы не C#!
4)   О, зачем я пошел на эту специальность!
5)   О, зачем я пошел на эту специальность!
6)   Ну почему именно я и именно со мной!
7)   Ну почему именно я и именно со мной!
8)   Как бы я был счастлив, если бы не C#!
9)   Подвесить бы Уайта Гейтца за его язык C#!
10)   Ну почему именно я и именно со мной!

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

using System;
  
namespace Test
{
  class Teenager
  {
  // Объект для генерации случайных чисел
  // rand - закрытая private переменная класса
  System.Random rand = new System.Random();
  
  private int GetRandomNumber(short upperLimit)
  {
  // Генерирует целое число в диапазоне
  // от 0 до upperLimit
  return rand.Next(upperLimit);
  }
  
  public string Complain()
  {
  string[] messages = new string[5]
    {
    "О, зачем я пошел на эту специальность!",
    "Как бы я был счастлив, если бы не C#!",
    "Ну почему именно я и именно со мной!",
    "Подвесить бы Уайта Гейтца за его язык C#!",
    "Единственное спасение - уволить Снеткова!"
    };
  return messages[GetRandomNumber(5)];
  }
  
  static void Main()
  {
  Teenager boy = new Teenager();
  for(int i = 0; i < 10; i++)
  {
  Console.WriteLine("{0}) \t{1}", i+1, boy.Complain());
  }
  
  while(true);
  }
}
}
Листинг 20.35 . Методы уровня объекта

Результаты выполнения

1)   Ну почему именно я и именно со мной!
2)   Единственное спасение - уволить Снеткова!
3)   Ну почему именно я и именно со мной!
4)   Подвесить бы Уайта Гейтца за его язык C#!
5)   Подвесить бы Уайта Гейтца за его язык C#!
6)   Единственное спасение - уволить Снеткова!
7)   Подвесить бы Уайта Гейтца за его язык C#!
8)   О, зачем я пошел на эту специальность!
9)   О, зачем я пошел на эту специальность!
10)   Единственное спасение - уволить Снеткова!

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

using System;
  
namespace Test
{
class CountObject
  {
  private static int countObject = 0;

  public CountObject()// Конструктор
  {
  countObject++;
  }
  
  public int GetCountFromObject()
  {
  return countObject;
  }
  
  public static int GetCountFromClass()
  {
  return countObject;
  }
  
  static void Main()
  {
  CountObject ob1 = new CountObject();
  CountObject ob2 = new CountObject();
  CountObject ob3 = new CountObject();
  CountObject ob4 = new CountObject();
  CountObject ob5 = new CountObject();
  
  Console.WriteLine("Создано объектов: {0}", 
      ob1.GetCountFromObject());
  Console.WriteLine("Создано объектов: {0}", 
      ob2.GetCountFromObject());
  Console.WriteLine("Создано объектов: {0}", 
      ob3.GetCountFromObject());
  Console.WriteLine("Создано объектов: {0}", 
      ob4.GetCountFromObject());
  Console.WriteLine("Создано объектов: {0}", 
      ob5.GetCountFromObject());
  
  Console.WriteLine("\nСоздано объектов: {0}", 
      CountObject.GetCountFromClass());
  
  while(true);
  }
}
}
Листинг 20.36 . Использование статической переменной

Результат примера

Создано объектов: 5
Создано объектов: 5
Создано объектов: 5 
Создано объектов: 5
Создано объектов: 5
  
Создано объектов: 5

Некоторые полезные статические члены класса Environment (среда)

В классе System.Environment определено множество инструментов, в том числе статических переменных и методов. Проиллюстрируем некоторые из них:

using System;
  
namespace Test
{
class Test
  {
  static void Main()
  {
  // Под какой OC мы работаем?
  Console.WriteLine("Текущая OC: \t\t{0}", 
    Environment.OSVersion);
  
  // Текущий каталог?
  Console.WriteLine("Текущий каталог: \t{0}", 
    Environment.CurrentDirectory);
  
  // Список логических дисков
  Console.WriteLine("Список дисков:"); 
  string[] drives = Environment.GetLogicalDrives();
  for(int i = 0; i < drives.Length; i++)
    Console.WriteLine("Диск {0}) \t\t{1}", 
      i+1, drives[i]);
  
  // Какая версия платформы .NET у нас установлена?
  Console.WriteLine("Текущая версия .NET: \t{0}", 
    Environment.Version);
        
  while(true);
  }
}
}
Листинг 20.37 . Получение некоторых сведений о среде выполнения через статические члены класса Environment

Результаты выполнения примера

Текущая OC:     Microsoft Windows NT 5.0.2195.0 
Текущий каталог:   C:\Test\bin\Release
Список логических дисков:
Диск 1)     A:\
Диск 2)     C:\
Диск 3)     D:\
Диск 4)     E:\
Диск 5)     F:\
Диск 6)     Z:\
Текущая версия .NET:   1.1.4322.573
< Лекция 19 || Лекция 20: 1234567891011
Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?