Использование значений равенства для сравнения объектов шрифта в C#
В этом примере объясняется различие между ссылочным равенством и равенством значений и показано, как вы можете проверить равенство значений для объектов шрифта.
Ссылочное равенство спрашивает, ссылаются ли две переменные на один и тот же объект. Напротив, значение равенства задает вопрос, имеют ли два объекта одинаковые значения.
Например, программа может создавать два разных объекта Font, которые имеют те же свойства: Name, Размер, Стиль и т. д. Переменные, указывающие на эти объекты, будут иметь равенство по значению, поскольку они относятся к объектам с одинаковыми значениями, но у них не будет ссылочного равенства, потому что они не будут ссылаться на один экземпляр Font.
Многие классы предоставляют только ссылочное равенство (потому что это проще). К сожалению, вам часто нужно знать, представляют ли два объекта одну и ту же логическую вещь, а не относятся ли они к одному экземпляру.
Пример
// Отображение диалогового окна. private void btnSelectFont_Click(object sender, EventArgs e) { // Сохранить исходный шрифт. Font original_font = this.Font; // Инициализировать диалог. fdFont.Font = this.Font; // Отобразим диалог и проверим результат. if (fdFont.ShowDialog() == DialogResult.OK) { // Применить выбранный шрифт. this.Font = fdFont.Font; } else { // Восстановить исходный шрифт. this.Font = original_font; } }
В этом примере установка шрифта формы выполняется быстро и легко. Если вашему приложению необходимо выполнить большую работу (например, создав сложный рисунок, использующий шрифт), вы можете сэкономить время, проверив текущий шрифт формы, чтобы увидеть, нужно ли его менять. Например, если пользователь нажал «Применить», а затем «ОК», чтобы диалог по-прежнему выбирал шрифт, который форма уже показывает, вам не нужно снова устанавливать шрифт формы.
К сожалению, class Equals метод и == проверяют ссылочное равенство, поэтому он возвращает только true, если два Font относятся к одному экземпляру объекта. В этом примере это не очень хорошо (или действительно большинство примеров, о которых я могу думать), потому что диалог шрифта имеет свой собственный объект Font для представления его шрифта.
В этом примере используется следующий метод расширения Font для проверки двух объектов Font для равенства значений.
public static class FontExtensions { // Возвращаем true, если шрифты представляют один и тот же шрифт. // Обратите внимание, что свойство FontStyle включает // Bold, Italic, Regular, Strikeout и Underline. public static bool ValueEquals(this Font font, Font other) { if (font.Name != other.Name) return false; if (font.SizeInPoints != other.SizeInPoints) return false; if (font.Style != other.Style) return false; return true; } }
Метод ValueEquals сравнивает имена, размеры и стили Font s. Если какое-либо из этих свойств отличается, метод возвращает false, чтобы указать, что шрифты разные. Если все свойства одинаковы, метод возвращает true.
В этом примере основная программа использует метод
// Отображение диалогового окна. private void btnSelectFont_Click(object sender, EventArgs e) { // Сохранить исходный шрифт. Font original_font = this.Font; // Инициализировать диалог. fdFont.Font = this.Font; // Отобразим диалог и проверим результат. if (fdFont.ShowDialog() == DialogResult.OK) { // Применить выбранный шрифт. if (!this.Font.ValueEquals(fdFont.Font)) this.Font = fdFont.Font; } else { // Восстановить исходный шрифт. if (!this.Font.ValueEquals(original_font)) this.Font = original_font; } }
Теперь, если шрифт формы уже имеет правильное значение, код не устанавливает его снова.