Работа с константными полями данных и полями данных, допускающими только чтение
Иногда требуется свойство, которое вы вообще не хотите изменять либо с момента компиляции, либо с момента его установки во время конструирования, также известное как
Понятие константных полей данных
Язык C# предлагает ключевое слово const
Предположим, что вы строите обслуживающий класс по имени MyMathClass
π
(для простоты будем считать его равным 3.14
). Начните с создания нового проекта консольного приложения по имени ConstData
и добавьте к нему файл класса MyMathClass.cs
. Учитывая, что давать возможность другим разработчикам изменять это значение в коде нежелательно, число π
можно смоделировать с помощью следующей константы://MyMathClass.cs
using System;
namespace ConstData
{
class MyMathClass
{
public const double PI = 3.14;
}
}
Приведите код в файле Program.cs
using System;
using ConstData;
Console.WriteLine("***** Fun with Const *****\n");
Console.WriteLine("The value of PI is: {0}", MyMathClass.PI);
// Ошибка! Константу изменять нельзя!
// MyMathClass.PI = 3.1444;
Console.ReadLine();
Обратите внимание, что ссылка на константные данные, определенные в классе MyMathClass
MyMathClass.PI
). Причина в том, что константные поля класса являются неявно static void LocalConstStringVariable()
{
// Доступ к локальным константным данным можно получать напрямую.
const string fixedStr = "Fixed string Data";
Console.WriteLine(fixedStr);
// Ошибка!
// fixedStr = "This will not work!";
}
Независимо от того, где вы определяете константную часть данных, всегда помните о том, что начальное значение, присваиваемое константе, должно быть указано в момент ее определения. Присваивание значения РI
class MyMathClass
{
// Попытка установить PI в конструкторе?
public const double PI;
public MyMathClass()
{
// Невозможно - присваивание должно осуществляться в момент объявления.
PI = 3.14;
}
}
Такое ограничение связано с тем фактом, что значение константных данных должно быть известно на этапе компиляции. Как известно, конструкторы (или любые другие методы) вызываются во время выполнения.
Понятие полей данных, допускающих только чтение
С константными данными тесно связано понятие
Поле только для чтения полезно в ситуации, когда значение не известно вплоть до стадии выполнения (возможно из-за того, что для его получения необходимо прочитать внешний файл), но нужно гарантировать, что впоследствии оно не будет изменяться. В целях иллюстрации рассмотрим следующую модификацию класса MyMathClass
class MyMathClass
{
// Поля только для чтения могут присваиваться
// в конструкторах, но больше нигде.
public readonly double PI;