свойствами).
Пространства имен
Цель данного изложения состоит в создании версии C# файлов исходного кода JavaFrame
и AddLib
и рассмотрении деталей процесса создания кода C#. Так как два эти класса используют пакеты и импортирование, необходимо обсудить их эквиваленты в C#.
Классы Java могут располагаться в логических подразделениях, называемых пакетами. Пакет определяется как сущность, которая группирует классы вместе. Пакеты могут облегчить импорт другого кода программиста и более важно определить ограничения доступа к переменным и методам.
Пространства имен в C# предоставляют аналогичный механизм для объединения управляемых классов, но являются значительно более мощными и гибкими. Здесь речь идет об управляемых классах, а не специальных классах C#, так как классы в пространстве имен могут быть из любого, соответствующего CLS, языка (вспомните, что CLS является независимым от языка). Пакеты и пространства имен, однако, существенно различаются своей реализацией. Класс Java, который необходимо, например, сделать частью пакета com.samples
, должен иметь в качестве первой строки кода в файле Package com.samples
. Это, конечно, исключает какие-либо комментарии. Любой код внутри этого файла автоматически становится частью указанного пакета. Имя пакета в Java также связывается с папкой, содержащей файл класса в том смысле, что они должны иметь одинаковые имена. Пакет com.samples
поэтому должен находиться в файле, который существует в папке comsamples. Давайте рассмотрим некоторые примеры того, как работают пакеты.
// package_samples.java
package samples.on; // отображает прямо в папку, где находится файл класса
public class Packaging {
int x;
public class Internal {
// находится автоматически в том же пакете
}
public static void main(String args[]) {
}
}
class Internal {
// находится автоматически в том же пакете
}
Примеры того, как этот код может выполняться, приведены ниже. Это, конечно, предполагает, что файл класса был сделан доступным для JRE:
□ Из командной строки:
java samples.on.Packaging
□ Как непосредственная ссылка в коде:
// Referencer.java
public class Referencer {
samples.on.Packaging pack = new samples.on.two.three.Packaging();
□ Используя директиву import
, можно опустить полностью квалифицированные имена пакетов, поэтому Referencer
запишется как:
// Referencer.java
import samples.on.*;
public class Referencer{
Packaging pack = new Packaging();
}
Помещение класса в пространство имен достигается в C# с помощью ключевого слова namespace
с идентификатором и заключением целевого класса в скобки. Вот пример:
// namespace_samples.cs
namespace Samples.On {
using System;
public class Example {
public Example() {
}
}
}
Преимущество использования скобок для явного ограничения пространства имен состоит в том, что это задает определенный пользователем тип в реальном классе, определенном в файле, а не в самом файле. В Java файлы и папки косвенно представляют структуры языка, так как они аналогичны классам и пакетам, содержащим эти классы. В C# файлы не связаны принудительно с чем-либо, поэтому они становятся местом, где располагается определение класса, а не частью какой-либо структуры языка. Пространства имен также не связаны с папками. Следовательно, в одном файле можно ввести несколько пространств имен без всяких ограничений. Можно, например, добавить определение нового класса и поместить его в новое пространство имен в том же файле и по-прежнему оставаться в границах языка:
// namespace_samples.cs
namespace Samples.On {
using System;
public class Example {
public Example() {
}
}
}
namespace Com.Cslib {
using System;
using System.Collections;
public class AddLib {
public AddLib() {
}
public int operationAdd(int a, int b) {
return a + b;
}
}
}
Пространства имен вводятся с помощью директивы using <namespace name>
, где <namespace name>
является именем пространства имен. В C# не требуется использовать *
, так как директива using
неявно импортирует все элементы указанного пространства имен. Другим преимуществом является то, что пространства имен могут быть добавлены исключительно в конкретный класс. Хотя классы Example
и AddLib
выше определены в файле namespace_samples.cs
. Example
не имеет доступа к пространству имен System.Collections
, несмотря на то, что AddLib
его имеет. Однако инструкция import
из Java не является специфической для класса. Она импортирует указанные элементы в файл. Вновь обратимся к х.java
.
// х.java
public class x {