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

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

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

Константы

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

using System;
  
namespace Test
{
class DefConst
{
// Определение констант на уровне класса
private const int myIntConst = 5;
private const string myStringConst = 
  "Это константа уровня класса";
  
public void MyMethod()
  {
  // Определение констант на уровне метода
  const int myIntConst = 10;
  const string myStringConst = 
    "Это локальная константа метода";
        
  Console.WriteLine("Константа класса: {0}", 
    DefConst.myIntConst);
  Console.WriteLine("Константа класса: {0}", 
    DefConst.myStringConst);
  Console.WriteLine("\n");
  Console.WriteLine("Константа метода: {0}", myIntConst);
  Console.WriteLine("Константа метода: {0}", myStringConst);
  }
}
  
class App
{
static void Main()
  {
  DefConst instance = new DefConst();
  instance.MyMethod();

  while(true);
  }
}
}
Листинг 20.26 . Определения констант

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

Константа класса: 5
Константа класса: Это константа уровня класса
  
Константа метода: 10
Константа метода: Это локальная константа метода

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

Способ 1. Достаточно объявить конструктор класса как private

using System;
  
namespace Test
{
class DefConst
{
// Определение констант на уровне класса
public const int myIntConst = 5;
public const string myStringConst = "Это константа уровня класса";
private DefConst(){}
}
  
class App
{
static void Main()
{
//Error  DefConst instance = new DefConst();
Console.WriteLine("Константа класса: {0}", 
  DefConst.myIntConst);
Console.WriteLine("Константа класса: {0}", 
  DefConst.myStringConst);
//Error  Console.WriteLine("Константа класса: {0}", myIntConst);
//Error  Console.WriteLine("Константа класса: {0}", myStringConst);
  
while(true);
}
}
}
Листинг 20.27 . Класс для хранения констант

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

Константа класса: 5
Константа класса: Это константа уровня класса

Способ 2. Достаточно объявить весь класс как абстрактный. Экземпляры абстрактных классов создавать нельзя (компилятор проследит за этим)

using System;
  
namespace Test
{
abstract class DefConst
{
// Определение констант на уровне класса
public const int myIntConst = 5;
public const string myStringConst = 
  "Это константа уровня класса";
//Конструктор вообще не нужен
}
  
class App
{
static void Main()
{
//Error  DefConst instance = new DefConst();
Console.WriteLine("Константа класса: {0}", 
  DefConst.myIntConst);
Console.WriteLine("Константа класса: {0}", 
  DefConst.myStringConst);
//Error  Console.WriteLine("Константа класса: {0}", myIntConst);
//Error  Console.WriteLine("Константа класса: {0}", myStringConst);
  
while(true);
}
}
}
Листинг 20.28 . Абстрактный класс для хранения констант

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

Константа класса: 5
Константа класса: Это константа уровня класса

Использование отдельного класса для хранения констант удобно тем, что C# не позволяет объявлять глобальные константы.

Ключевое слово const нельзя использовать как часть объявления метода. Для этих целей служат модификаторы in и out.

Взаимное преобразование объектов в ссылочную и структурную форму (упаковка и распаковка)

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

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

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

using System;
  
namespace Test
{
//*********************************************************************
struct PERSON // Структурный тип
{
  // Данные класса без оператора доступа считаются private
  string Name;// Прямая инициализация в структурах не допускается
  int Age;// а в классах допускается
  
  //****************************************
  // Конструктор
  //****************************************
  public PERSON(string name, int age)
  {
  Name = name; Age = age;
  }
  
  //****************************************
  // Сервисы
  //****************************************
  public string GetName()
  {
  return Name;
  }
  //****************************************
  public int GetAge()
  {
  return Age;
  }
  //****************************************
  public void SetAge(int age)
  {
  Age = age;
  }
}
  
//*********************************************************************
class App
  {
  static void Main()
  {
  // Создаем объект на стеке
  PERSON petrov = new PERSON("Денис 
    Петров", 20);
  // Вывод
  Console.WriteLine("Объект petrov: Имя={0}; 
    возраст={1}",petrov.GetName(), petrov.GetAge());
  
  // Упаковываем в ссылку для передачи куда-то
  object pack = petrov;
  PutClass.Put(pack);
  
  while(true);
  }
}
  
//*********************************************************************
class PutClass
  {
  public static void Put(object pack)
  {
  // В месте получения распаковываем в самостоятельную копию
  PERSON unPack = (PERSON)pack;
  // Изменяем копию для проверки, что это действительно копия
  unPack.SetAge(33);
  Console.WriteLine("Объект unPack: Имя={0}; 
    возраст={1}", unPack.GetName(), unPack.GetAge());
  }
}
}
Листинг 20.29 . Применение упаковки и распаковки структурного объекта

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

Объект petrov: Имя=Денис Петров; возраст=20 
Объект unPack: Имя=Денис Петров; возраст=33
< Лекция 19 || Лекция 20: 1234567891011
Максим Филатов
Максим Филатов

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

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

 

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