public static void Main(String[] args) {
Wheels front = 2;
Wheels back = 4;
Wheels total = front + back;
Car greenFordExpedition = new Car(0, 4, 2);
Console.WriteLine("initial:\t" + greenFordExpedition);
greenFordExpedition += total;
Console.WriteLine("after add:\t" + greenFordExpedition);
greenFordExpedition -= front;
Console.WriteLine("after subtract:\t" + greenFordExpedition);
}
Компиляция и выполнение этого кода создадут приведенные ниже результаты:
initial: CAR-[wheels = 0| doors = 4| headlights = 2 ]
after add: CAR-[wheels = 6| doors = 4| headlights = 2 ]
after subtract: CAR-[wheels = 4| doors = 4| headlights = 2 ]
Так как Java не имеет других типов данных значений, кроме примитивных, размер которых всегда известен, то реального применения для оператора sizeof
нет. В C# типы данных значений охватывают примитивные типы, а также структуры и перечисления. Конечно, как и в Java, размер примитивных типов известен. Однако необходимо знать, сколько пространства занимает тип struct
или enum
, для чего служит оператор sizeof
. Синтаксис достаточно простой: sizeof()
, где будет struct
или enum
. Необходимо отметить один момент при использовании оператора sizeof
— он может использоваться только в ненадежном контексте. Оператор sizeof
не может быть перезагружен.
Оператор typeof
используется для получения объекта типа экземпляра типа без создания экземпляра типа. В Java каждый тип имеет переменную класса public static
, которая возвращает дескриптор объекта Class
, ассоциированный с этим классом. Оператор typeof
предоставляет функциональность этого типа. Так же как в случае sizeof
, синтаксис будет очень простым: typeof()
, где является любым типом, определенным пользователем, который вернет объект типа этого типа.
Делегаты являются членами пространства имен, которые инкапсулируют ссылку на метод внутри объекта делегата. Объект делегата может затем передаваться в код, вызывающий указанный метод, не зная во время компиляции, какой метод будет вызван. Красоту, мощь и гибкость делегатов можно увидеть только с помощью примера. Давайте посмотрим, как работают делегаты:
namespace Samples {
using System;
using System.Collections;
public delegate void TestDelegate(string k); // определяет делегата,
// который получает строку в качестве аргумента
public class Sample {
public Sample() {}
public void test(string i) {
Console.WriteLine(i + " has been invoked.");
}
public void text2(string j) {
Console.WriteLine("this is another way to invoke {0}" + j);
}
public static void Main(string[] args) {
Sample sm = new Sample();
TestDelegate aDelegate = new TestDelegate(sm.test);
TestDelegate anotherDelegate = new TestDelegate(sm.test2);
aDelegate("test");
anotherDelegate("test2");
}
}
}
Первый шаг по использованию делегатов состоит в определении делегата. Наш тестовый делегат определяется в строке public delegate void TestDelegate(string k);
. Затем определяется класс с методами, которые имеют сигнатуру, аналогичную делегату. Конечный шаг заключается в создании экземпляра делегата который создается так же, как экземпляр класса и реализуется с помощью оператора new
. Единственное различие состоит в том, что имя целевого метода передается делегату как аргумент. Затем вызывается делегат. В примере вызывается экземпляр aDelegate
с помощью вызова aDelegate("test");
.
Как в Java, как и в C#, класс является скелетом, который содержит методы, но не данные. Это структура потенциального объекта. Образование экземпляра класса создает объект на основе этой структуры. Существуют различные ключевые слова и концепции, связанные с классами, которые, были рассмотрены ранее. В этом разделе мы повторим эти ключевые слова и введем новые.
Как и в Java, модификаторы в C# используются для модификации объявлений типа и членов. Далее представлен список модификаторов C#. Более подробное определение значений отдельных идентификаторов дано в разделе о ключевых словах данного приложения. Однако некоторые из перечисленных модификаторов являются новыми и будут рассмотрены в ближайших разделах.
Модификатор класса |
Описание |
abstract |
Нельзя создавать экземпляры абстрактных классов. Производные классы, которые их расширяют, должны реализовать все абстрактные методы класса, и модификатор sealed нельзя применять к этим классам. |
sealed |
Используется для предотвращения случайного наследования, так как от класса, определенного как sealed , нельзя наследовать. |
Модификатор члена |
Цель |
Эквивалент в Java |
Описание |
virtual |
Методы, методы доступа |
недоступно |
Позволяет переопределять целевые члены классам-наследникам. |
static |
Все |
static |
Целевой член, помеченный как static , принадлежит классу, а не экземпляру этого класса. Поэтому не требуется создавать экземпляр класса, чтобы получить к нему доступ. |
event |
Поля, свойства |
недоступно |
Используемый для связывания клиентского кода с событиями класса, модификатор event позволяет определить делегата, который будет вызываться, когда в коде произойдет некоторое "событие". Отметим, что программист класса определяет, где и когда инициируется событие, а подписчик определяет, как его обработать. |
abstract |
Методы, методы доступа |
abstract |
Указывает, что целевой член является неявно виртуальным и не имеет кода реализации. Производный класс должен предоставить эту реализацию, при этом реализованный метод помечается как override . |
const |
Поля, локальные переменные |
final |
Указывает, что целевой член не может быть изменен. Java также имеет ключевое слово const , которое в данный момент является просто зарезервированным словом. |
readonly |
Поля |
недоступно |
Указывает, что целевому члену можно присвоить значение только при его объявлении или в конструкторе класса, содержащего этот член. |
extern |
Методы |
недоступно |
Указывает, что целевой член реализуется внешне. Этот модификатор обычно используется с атрибутом DllImport . |
override |
Методы |
недоступно |
Указывает, что целевой член предоставляет новую реализацию члена, унаследованного из базового класса. |
Модификатор доступа |
Цель |
Эквивалент в Java |
Описание |
По умолчанию |
public |
Все |
public |
Без ограничений. |
Члены enum и interface , а также пространства имен. |
private |
Все |
private |
Доступны только объявляющему классу. |
Члены class и struct . |
internal |
Все |
недоступно |
Доступны файлам в той же сборке. |
|
protected |
Все |
недоступно |
Доступны для объявляющего класса и любых его подклассов. В C# protected более ограничен, чем в Java. Закрытый ( protected ) доступ не позволит другим файлам в той же сборке иметь доступ к члену. |
|
protected internal |
Все |
protected |
Доступны для файлов сборки и подклассов объявляющего класса. |
|
Читать дальше