Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Gosy_nepolnostyu_7v1.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
3.7 Mб
Скачать

17. Понятие класса Object в языке c#.

(Туривный С.)

Object Поддерживает все классы в иерархии классов .NET Framework и предоставляет низкоуровневые службы для производных классов. Он является исходным базовым классом для всех классов платформы .NET Framework и корнем иерархии типов.

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

Так как все классы в платформе .NET Framework являются производными класса Object, все методы, определённые в классе Object, доступны для всех объектов в системе. В производных классах могут переопределяться (и переопределяются) некоторые из этих методов, включая перечисленные ниже:

  • Equals — поддерживает сравнение объектов.

  • Finalize — выполняет операции очистки перед автоматической утилизацией

  • объекта.

  • GetHashCode — создаёт число, соответствующее значению объекта, обеспечивающее возможность использования хэш-таблицы.

  • ToString — создаёт понятную для пользователя строку текста, в которой описывается экземпляр класса.

Особенности производительности

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

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

  • Создайте пользовательский тип и его члены для использования универсальных шаблонов. Среда CLR при создании экземпляра класса создает закрытый универсальный тип и задает для него аргумент. Универсальный метод задается для определенного типа и его можно вызывать без упаковки-преобразования и параметра вызова.

Хотя иногда нужно разрабатывать именно классы общего назначения, принимающие и возвращающие типы Object, для повышения производительности можно также создать особые классы для конкретных часто используемых типов. Например, создав особый класс, задающий и возвращающий логические значения, можно избежать затрат на упаковку-преобразование и распаковку-преобразование значений такого типа.

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

using System; // The Point class is derived from System.Object. class Point {    public int x, y;    public Point(int x, int y)    {        this.x = x;        this.y = y;    }    public override bool Equals(object obj)    {        // If this and obj do not refer to the same type, then they are not equal.        if (obj.GetType() != this.GetType()) return false;        // Return true if  x and y fields match.        Point other = (Point) obj;        return (this.x == other.x) && (this.y == other.y);    }    // Return the XOR of the x and y fields.    public override int GetHashCode()    {        return x ^ y;    }    // Return the point's value as a string.    public override String ToString()    {        return String.Format("({0}, {1})", x, y);    }    // Return a copy of this point object by making a simple field copy.    public Point Copy()    {        return (Point) this.MemberwiseClone();    } } public sealed class App {    static void Main()    {        // Construct a Point object.        Point p1 = new Point(1,2);        // Make another Point object that is a copy of the first.        Point p2 = p1.Copy();        // Make another variable that references the first Point object.        Point p3 = p1;        // The line below displays false because p1 and p2 refer to two different objects.        Console.WriteLine(Object.ReferenceEquals(p1, p2));        // The line below displays true because p1 and p2 refer to two different objects that have the same value.        Console.WriteLine(Object.Equals(p1, p2));        // The line below displays true because p1 and p3 refer to one object.        Console.WriteLine(Object.ReferenceEquals(p1, p3));        // The line below displays: p1's value is: (1, 2)        Console.WriteLine("p1's value is: {0}", p1.ToString());    } } // This code example produces the following output: // // False // True // True // p1's value is: (1, 2) //

(https://msdn.microsoft.com/ru-ru/library/system.object(v=vs.110).aspx)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]