Идентификация объекта и идентификация значения 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Идентификация объекта и идентификация значения



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

· Чтобы определить, ссылаются ли два экземпляра класса на одно расположение в памяти (это значит, что они имеют одинаковый идентификатор), воспользуйтесь статическим методом ObjectReferenceEquals()()(). (System..::.Object является неявным базовым классом для всех типов значений и ссылочных типов, включая структуры и классы, определенные пользователем).

· Чтобы определить, имеют ли поля экземпляра в двух экземплярах структур одинаковые значения, воспользуйтесь методом ValueTypeEquals()()(). Поскольку все структуры неявно наследуют от System..::.ValueType, метод может быть вызван непосредственно в объекте, как показано в следующем примере.

if(p2.Equals(p1)) Console.WriteLine("p2 and p1 have the same values.");

· Реализация System..::.ValueType Equals использует отображение, поскольку необходимо определить поля, находящиеся в любой структуре. При создании собственных структур переопределите метод Equals для предоставления эффективного алгоритма равенства, соответствующего вашему типу.

· Чтобы определить равенство значений полей в двух экземплярах класса, можно воспользоваться методом ObjectEquals()()() или оператором ==. Однако их следует использовать, только если они были переопределены или перегружены классом для предоставления пользовательского определения значения "равенство" для объектов данного типа. Класс может реализовать интерфейс IEquatable<(Of <(T>)>) или интерфейс IEqualityComparer<(Of <(T>)>). Оба интерфейса предоставляют методы для проверки равенства значений. При разработке собственных классов, которые переопределяют Equals, следуйте рекомендациям, указанным в документах Правила переопределения метода Equals и оператора равенства (==) и Object..::.Equals(Object).


Classes

A class is the most powerful data type in C#. Like structures, a class defines the data and behavior of the data type. Programmers can then create objects that are instances of this class. Unlike structures, classes support inheritance, a fundamental part of object-oriented programming. For more information, see Inheritance.

Declaring Classes

Classes are defined by using the class keyword, as shown in the following example:

public class Customer { //Fields, properties, methods and events go here... }

The class keyword is preceded by the access level. Because public is used in this case, anyone can create objects from this class. The name of the class follows the class keyword. The remainder of the definition is the class body, where the behavior and data are defined. Fields, properties, methods, and events on a class are collectively referred to as class members.

Creating Objects

Although they are sometimes used interchangeably, a class and an object are different things. A class defines a type of object, but it is not an object itself. An object is a concrete entity based on a class, and is sometimes referred to as an instance of a class.

Objects can be created by using the new keyword followed by the name of the class that the object will be based on, like this:

Customer object1 = new Customer();

 


Классы

Класс — это самый эффективный тип данных в C#. Как и структуры, класс определяет данные и поведение типа данных. При наличии класса программисты могут создавать объекты, являющиеся его экземплярами. В отличие от структур классы поддерживают наследование, фундаментальную часть объектно-ориентированного программирования. Дополнительные сведения см. в разделе Наследование.

Объявление классов

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

public class Customer { //Fields, properties, methods and events go here... }

Ключевому слову class предшествует уровень доступа. Поскольку в данном случае используется public, любой может создавать объекты из этого класса. Имя класса указывается после ключевого слова class. Оставшаяся часть определения является телом класса, в котором задаются данные и поведение. Поля, свойства, методы и события в классе обозначаются термином члены класса.

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

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

Объекты можно создавать с помощью ключевого слова new, за которым следует имя класса, на котором будет основан объект:

Customer object1 = new Customer();

 


When an instance of a class is created, a reference to the object is passed back to the programmer. In the previous example, object1 is a reference to an object that is based on Customer. This reference refers to the new object but does not contain the object data itself. In fact, you can create an object reference without creating an object at all:

Customer object2;

We do not recommend creating object references such as this one that does not refer to an object because trying to access an object through such a reference will fail at run time. However, such a reference can be made to refer to an object, either by creating a new object, or by assigning it to an existing object, such as this:

Customer object3 = new Customer(); Customer object4 = object3;

This code creates two object references that both refer to the same object. Therefore, any changes to the object made through object3 will be reflected in subsequent uses of object4. Because objects that are based on classes are referred to by reference, classes are known as reference types.

Class Inheritance

Inheritance is accomplished by using a derivation, which means a class is declared by using a base class from which it inherits data and behavior. A base class is specified by appending a colon and the name of the base class following the derived class name, like this:

public class Manager: Employee { // Employee fields, properties, methods and events are inherited // New Manager fields, properties, methods and events go here... }

When a class declares a base class, all the members of the class that are defined for the base class become part of the new class also. Because a base class may itself inherit from another class, which inherited from another class, and so on, a class may have many base classes.


При создании экземпляра класса ссылка на этот объект передается программисту. В предыдущем примере object1 является ссылкой на объект, основанный на Customer. Эта ссылка указывает на новый объект, но не содержит данные этого объекта. Фактически, можно создать ссылку на объект без создания самого объекта:

Customer object2;

Создание таких ссылок, которые не указывают на объект, не рекомендуется, так как попытка доступа к объекту по такой ссылке приведет к сбою во время выполнения. Однако такую ссылку можно сделать указывающей на объект, создав новый объект или назначив ее существующему объекту:

Customer object3 = new Customer(); Customer object4 = object3;

В данном коде создаются две ссылки на объекты, которые указывают на один объект. Поэтому любые изменения объекта, выполненные посредством object3, будут видны при последующем использовании object4. Поскольку на объекты, основанные на классах, указывают ссылки, классы называют ссылочными типами.

Наследование классов

Наследование выполняется с помощью образования производных, то есть класс объявляется с помощью базового класса, от которого он наследует данные и поведение. Базовый класс задается добавлением после имени производного класса двоеточия и имени базового класса:

public class Manager: Employee { // Employee fields, properties, methods and events are inherited // New Manager fields, properties, methods and events go here... }

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

 


Description

In the following example, a public class that contains a single field, a method, and a special method called a constructor is defined. The class is then instantiated with the new keyword.

Example

public class Person { // Field public string name;   // Constructor public Person() { name = "unknown"; }   // Method public void SetName(string newName) { name = newName; } } class TestPerson { static void Main() { Person person1 = new Person(); System.Console.WriteLine(person1.name);   person1.SetName("John Smith"); System.Console.WriteLine(person1.name); } }  

 


Описание

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

Пример

ß--


Output

unknown

John Smith

Classes Overview

Classes have the following properties:

· Unlike C++, only single inheritance is supported: a class can inherit implementation from only one base class.

· A class can implement more than one interface.

· Class definitions can be split between different source files.

· Static classes are sealed classes that contain only static methods.

 


Результат

unknown

John Smith

Общие сведения о классах

Классы имеют следующие свойства:

· В отличие от C++ поддерживается только одиночное наследование: класс может унаследовать реализацию только из одного базового класса.

· Класс может реализовать несколько интерфейсов. Дополнительные сведения см. в разделе Интерфейсы.

· Определения классов можно разделить между различными исходными файлами. Дополнительные сведения см. в разделе Разделяемые классы и методы.

· Статические классы — это запечатанные классы, содержащие только статические методы. Дополнительные сведения см. в разделе Статические классы и члены статических классов.

 


Structs

Structs are defined by using the struct keyword, for example:

public struct PostalAddress { // Fields, properties, methods and events go here... }

Structs share most of the same syntax as classes, although structs are more limited than classes:

· Within a struct declaration, fields cannot be initialized unless they are declared as const or static.

· A struct may not declare a default constructor (a constructor without parameters) or a destructor.

Because copies of structs are created and destroyed automatically by the compiler, a default constructor and destructor are unnecessary. In effect, the compiler implements the default constructor by assigning all the fields of their default values. Structs cannot inherit from classes or other structs.

Structs are value types. When an object is created from a struct and assigned to a variable, the variable contains the complete value of the struct. When a variable that contains a struct is copied, all the data is copied, and any modification to the new copy does not change the data for the old copy. Because structs do not use references, they do not have identity; you cannot distinguish between two instances of a value type with the same data. All value types in C# derive from ValueType, which inherits from Object.

Value types can be converted to reference types by the compiler in a process known as boxing.

Structs Overview

Structs have the following properties:

· Structs are value types and classes are reference types.

· Unlike classes, structs can be instantiated without using a new operator.

· Structs can declare constructors, but they must take parameters.

· A struct cannot inherit from another struct or class, and it cannot be the base of a class. All structs inherit directly from System.ValueType, which inherits from System.Object.

· A struct can implement interfaces.

· A struct can be used as a nullable type and can be assigned a null value.


Структуры

Структуры определяются с помощью ключевого слова struct, например:

ß--

Структуры используют большую часть того же синтаксиса, что и классы, однако они более ограничены по сравнению с ними.

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

· Структура может не объявлять используемый по умолчанию конструктор (конструктор без параметров) или деструктор.

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

Структуры являются типами значений. Если объект создан из структуры и назначен переменной, переменная будет содержать полное значение структуры. При копировании переменной, содержащей структуру, происходит копирование всех данных, а любое изменение новой копии не влияет на данные в старой копии. Поскольку в структурах отсутствуют ссылки, они не имеют идентификаторов, поэтому невозможно определить разницу между двумя экземплярами типа значения с одними и теми же данными. Все типы значений в C# являются производными от ValueType, который наследует от Object.

В процессе, известном как упаковка, компилятор может преобразовать типы значений в ссылочные типы. Дополнительные сведения см. в разделе Упаковка-преобразование и распаковка-преобразование.

Общие сведения о структурах

Структуры имеют следующие свойства.

· Структуры являются типами значений, а классы — ссылочными типами.

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

· Структуры могут объявлять конструкторы, но они должны принимать параметры.

· Структура не может наследовать от другой структуры или класса и не может быть основой класса. Все структуры наследуют непосредственно от System.ValueType, который наследует от System.Object.

· Структуры могут реализовывать интерфейсы.

· Структура может использоваться как тип, допускающий значение NULL, и ей можно назначить значение NULL.


Using Structs

The struct type is suitable for representing lightweight objects such as Point, Rectangle, and Color. Although it is possible to represent a point as a class, a struct is more efficient in some scenarios. For example, if you declare an array of 1000 Point objects, you will allocate additional memory for referencing each object; in this case, a struct would be less expensive. Since the.NET Framework contains an object called Point, we'll call our struct "CoOrds" instead.

public struct CoOrds { public int x, y;   public CoOrds(int p1, int p2) { x = p1; y = p2; } }

It is an error to declare a default (parameterless) constructor for a struct. A default constructor is always provided to initialize the struct members to their default values. It is also an error to initialize an instance field in a struct.

When you create a struct object using the new operator, it gets created and the appropriate constructor is called. Unlike classes, structs can be instantiated without using the new operator. If you do not use new, the fields will remain unassigned and the object cannot be used until all of the fields are initialized.

There is no inheritance for structs as there is for classes. A struct cannot inherit from another struct or class, and it cannot be the base of a class. Structs, however, inherit from the base class Object. A struct can implement interfaces, and it does that exactly as classes do.

Unlike C++, you cannot declare a class using the keyword struct. In C#, classes and structs are semantically different. A struct is a value type, while a class is a reference type.

Unless you need reference-type semantics, small classes may be more efficiently handled by the system as a struct.

 


Использование структур

Тип struct подходит для создания несложных объектов, таких как Point, Rectangle и Color. Хотя точку можно реализовать и в виде класса, в некоторых случаях структуры оказываются более эффективными. Например, при объявлении массива из 1000 объектов Point потребуется выделить дополнительную память для хранения ссылок на все эти объекты, и структура в таком случае будет более экономичным решением. Поскольку в.NET Framework уже имеется объект с именем Point, мы назовем нашу структуру CoOrds.

ß--

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

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

В отличие от классов структуры не поддерживают наследование. Структура не может быть унаследованной от другой структуры или класса и не может быть основой для других классов. Однако структуры наследуют базовому классу Object. Структуры могут реализовывать интерфейсы; этот механизм полностью аналогичен реализации интерфейсов для классов.

В отличие от C++ класс нельзя объявить с помощью ключевого слова struct. В C# классы и структуры семантически различаются. Структура является типом значения, тогда как класс — это ссылочный тип.

Если требуется использовать семантику ссылочных типов, небольшие классы могут обрабатываться системой более эффективно, чем структуры.

 


Example 1

Description

This example demonstrates struct initialization using both default and parameterized constructors.

Code

public struct CoOrds { public int x, y; public CoOrds(int p1, int p2) { x = p1; y = p2; } }
// Declare and initialize struct objects. class TestCoOrds { static void Main() { // Initialize: CoOrds coords1 = new CoOrds(); CoOrds coords2 = new CoOrds(10, 10); // Display results: System.Console.Write("CoOrds 1: "); System.Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y); System.Console.Write("CoOrds 2: "); System.Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y); } }

Output

CoOrds 1: x = 0, y = 0

CoOrds 2: x = 10, y = 10


Пример 1

Описание

В этом примере демонстрируется инициализация struct с помощью конструктора по умолчанию и с помощью конструктора с параметрами.

Код

ß---

 

Результат

CoOrds 1: x = 0, y = 0

CoOrds 2: x = 10, y = 10

 


Example 2

Description

This example demonstrates a feature that is unique to structs. It creates a CoOrds object without using the new operator. If you replace the word struct with the word class, the program will not compile.

Code

public struct CoOrds { public int x, y; public CoOrds(int p1, int p2) { x = p1; y = p2; } }
// Declare a struct object without "new." class TestCoOrdsNoNew { static void Main() { // Declare an object: CoOrds coords1; // Initialize: coords1.x = 10; coords1.y = 20; // Display results: System.Console.Write("CoOrds 1: "); System.Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y); } }

Output

CoOrds 1: x = 10, y = 20


Пример 2

Описание

В следующем примере демонстрируется уникальная возможность структур. В нем создается объект CoOrds без использования оператора new. Если заменить слово struct словом class, программа не будет скомпилирована.

Код

ß----

 

Результат

CoOrds 1: x = 10, y = 20

 


Inheritance

Classes can inherit from another class. This is accomplished by putting a colon after the class name when declaring the class, and naming the class to inherit from—the base class—after the colon, as follows:

public class A { public A() { } }   public class B: A { public B() { } }

The new class—the derived class—then gains all the non-private data and behavior of the base class in addition to any other data or behaviors it defines for itself. The new class then has two effective types: the type of the new class and the type of the class it inherits.

In the example above, class B is effectively both B and A. When you access a B object, you can use the cast operation to convert it to an A object. The B object is not changed by the cast, but your view of the B object becomes restricted to A's data and behaviors. After casting a B to an A, that A can be cast back to a B. Not all instances of A can be cast to B—just those that are actually instances of B. If you access class B as a B type, you get both the class A and class B data and behaviors. The ability for an object to represent more than one type is called polymorphism.

Structs cannot inherit from other structs or classes. Both classes and structs can inherit from one or more interfaces.

 


Наследование

Классы могут наследовать от других классов. Для этого при объявлении класса после его имени помещается двоеточие и указывается имя базового класса, от которого будет наследовать данный класс:

public class A { public A() { } }   public class B: A { public B() { } }

Новый производный класс получает все не являющиеся закрытыми данные и поведение базового класса вдобавок к собственным данным и поведению. Таким образом, новый класс имеет два действующих типа: тип нового класса и тип класса, который он наследует.

В приведенном выше примере класс B является одновременно классом B а A. При доступе к объекту можно выполнить операцию приведения для преобразования его в объект A. При выполнении операции приведения объект B не изменяется, но он ограничивается данными и поведением объекта A. После приведения объекта B к A этот объект A не может быть приведен обратно к B. Не все экземпляры A могут быть приведены к B — только те, которые фактически являются экземплярами B. При доступе к классу B как к типу B вы получаете данные и поведение одновременно класса A и B. Способность объекта представлять более одного типа называется полиморфизмом. Дополнительные сведения см. в разделе Полиморфизм. Дополнительные сведения об операции приведения см. в разделе Приведение.

Структуры не могут наследовать от других структур или классов. Как классы, так и структуры способны наследовать от одного или нескольких интерфейсов. Дополнительные сведения см. в разделе Интерфейсы.

 



Поделиться:


Последнее изменение этой страницы: 2017-01-19; просмотров: 121; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.217.144.32 (0.079 с.)