a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
49 lines
4.1 KiB
XML
49 lines
4.1 KiB
XML
<?xml version="1.0"?>
|
|
<clause number="8.12" title="Namespaces and assemblies" informative="true">
|
|
<paragraph>The programs presented so far have stood on their own except for dependence on a few system-provided classes such as System.Console. It is far more common, however, for real-world applications to consist of several different pieces, each compiled separately. For example, a corporate application might depend on several different components, including some developed internally and some purchased from independent software vendors. </paragraph>
|
|
<paragraph>Namespaces and assemblies enable this component-based system. Namespaces provide a logical organizational system. Namespaces are used both as an "internal" organization system for a program, and as an "external" organization system-a way of presenting program elements that are exposed to other programs. </paragraph>
|
|
<paragraph>Assemblies are used for physical packaging and deployment. An assembly may contain types, the executable code used to implement these types, and references to other assemblies. </paragraph>
|
|
<paragraph>To demonstrate the use of namespaces and assemblies, this section revisits the "hello, world" program presented earlier, and splits it into two pieces: a class library that provides messages and a console application that displays them. </paragraph>
|
|
<paragraph>The class library will contain a single class named HelloMessage. The example <code_example><![CDATA[
|
|
// HelloLibrary.cs
|
|
namespace CSharp.Introduction
|
|
{
|
|
public class HelloMessage
|
|
{
|
|
public string Message {
|
|
get {
|
|
return "hello, world";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]]></code_example>shows the HelloMessage class in a namespace named CSharp.Introduction. The HelloMessage class provides a read-only property named Message. Namespaces can nest, and the declaration <code_example><![CDATA[
|
|
namespace CSharp.Introduction
|
|
{...}
|
|
]]></code_example>is shorthand for two levels of namespace nesting: <code_example><![CDATA[
|
|
namespace CSharp
|
|
{
|
|
namespace Introduction
|
|
{...}
|
|
}
|
|
]]></code_example></paragraph>
|
|
<paragraph>The next step in the componentization of "hello, world" is to write a console application that uses the HelloMessage class. The fully qualified name for the class-CSharp.Introduction.HelloMessage-could be used, but this name is quite long and unwieldy. An easier way is to use a using namespace directive, which makes it possible to use all of the types in a namespace without qualification. The example <code_example><![CDATA[
|
|
// HelloApp.cs
|
|
using CSharp.Introduction;
|
|
class HelloApp
|
|
{
|
|
static void Main() {
|
|
HelloMessage m = new HelloMessage();
|
|
System.Console.WriteLine(m.Message);
|
|
}
|
|
}
|
|
]]></code_example>shows a using namespace directive that refers to the CSharp.Introduction namespace. The occurrences of HelloMessage are shorthand for CSharp.Introduction.HelloMessage. </paragraph>
|
|
<paragraph>C# also enables the definition and use of aliases. A using alias directive defines an alias for a type. Such aliases can be useful in situation in which name collisions occur between two class libraries, or when a small number of types from a much larger namespace are being used. The example <code_example><![CDATA[
|
|
using MessageSource = CSharp.Introduction.HelloMessage;
|
|
]]></code_example>shows a using alias directive that defines MessageSource as an alias for the HelloMessage class. </paragraph>
|
|
<paragraph>The code we have written can be compiled into a class library containing the class HelloMessage and an application containing the class HelloApp. The details of this compilation step might differ based on the compiler or tool being used. A command-line compiler might enable compilation of a class library and an application that uses that library with the following command-line invocations: <code_example><![CDATA[
|
|
csc /target:library HelloLibrary.cs
|
|
csc /reference:HelloLibrary.dll HelloApp.cs
|
|
]]></code_example>which produce a class library named HelloLibrary.dll and an application named HelloApp.exe. </paragraph>
|
|
</clause>
|