Public class A
{ private int x;
private int y;
private static int z;
private void SomeOperation()
{ x = 1;
this.y = 2;
z = 3;
// Присваивание this в объектах является ошибкой
// A newinstance = new A();
// this = newinstance;
}
static void Main()
{ A obj = new A();
obj.SomeOperation();
System.Console.WriteLine("x = {0}, y = {1}, z = {2}",
obj.x, obj.y, A.z);
// Вывод: x = 1, y = 2, z = 3
Console.ReadLine(); // Ожидание нажатия клавиши <Enter>
}
}
В методе Main создается новый экземпляр класса A и затем вызывается метод SomeOperation через экземпляр этого класса. Внутри тела метода SomeOperation имеется доступ к полям экземпляра и статическим полям класса, поэтому присваивать им значения можно просто с использованием их идентификаторов. Несмотря на то что, как уже упоминалось, в методе SomeOperation можно присваивать значение статическому члену z, не квалифицируя его, для достижения лучшей читабельности кода во время присваивания значений следует квалифицировать статические поля даже в методах, относящихся к тому же самому классу. Это поможет тем, кому придется сопровождать код.
Обратите внимание, что при присваивании значения поле у снабжается префиксом – идентификатором this. С помощью this можно обращаться к полям экземпляра, как было показано в предыдущем примере кода. Поскольку значение this доступно только для чтения, ему нельзя присвоить что-либо, что заставит его ссылаться на другой экземпляр. При попытке сделать это компилятор сообщит об ошибке, и код не скомпилируется.
|
|
Перегрузка метода.
Класс может иметь несколько реализаций или перегрузок одного и того же метода, которые отличаются от других числом или типами параметров. Например:
public int sampleMethod(string sampleParam)
{ // Код, использующий данные типа string
};
public int sampleMethod(int sampleParam)
{ // Код, использующий данные типа int
}
Как правило, метод объявляется при определении класса. Однако C# и Visual Basic также поддерживают методы расширения, которые позволяют добавлять методы в существующий класс вне определения класса.
Конструкторы вызываются при первоначальной загрузке класса средой CLR или при создании объекта [5]. Существуют два типа конструкторов: статические конструкторы и конструкторы экземпляра. Класс может иметь только один статический конструктор, не имеющий параметров. Он вызывается, когда CLR загружает тип. Имя статического конструктора должно совпадать с именем класса, к которому он принадлежит. Как и к любому другому члену класса, к статическому конструктору можно присоединять атрибуты метаданных.
С другой стороны, конструкторы экземпляра вызываются при создании экземпляра класса. Обычно они устанавливают состояние объекта за счет инициализации полей в желательное предопределенное состояние. Можно также предпринять любые другие действия по инициализации, такие как подключение к базе данных и открытие файла. У класса может быть несколько конструкторов экземпляра, которые могут быть перегружены (т.е. иметь разные типы параметров). Подобно статическим конструкторам, конструкторы экземпляра именуются по названию определяющего их класса. Особенность таких конструкторов состоит в необязательности выражения инициализатора. С помощью инициализатора, который следует за двоеточием после списка параметров, можно вызвать конструктор базового класса или другой конструктор того же класса, указывая, соответственно, ключевые слова base и this. О ключевом слове base пойдет речь в разделе "Ключевое слово base " далее в главе. Рассмотрим следующий пример кода с двумя комментариями:
|
|