刚开始学习c#,对于命名空间有些疑惑,在这里自己整理了一下,当做记录。
普通用法:
namespace space1 { class class1 { public class1() { Console.WriteLine("class1"); } } }
using space1;
class Program { public static void Main(string[] args) { Class1 c1 = new Class1(); Console.ReadKey(); } }或者是:namespace space1 { class class1 { public class1() { Console.WriteLine("class1"); } }class Program { public static void Main(string[] args) { Class1 c1 = new Class1(); Console.ReadKey(); } }}
如果在命名空间中又定义了另一个命名空间,访问时就要加上命名空间了
namespace ConsoleApplication20
{
namespace space1
{
class Class1
{
public Class1()
{
Console.WriteLine("class1");
}
}
}
class Program
{
public static void Main(string[] args)
{
space1.Class1 c1 = new space1.Class1();
Console.ReadKey();
}
}
}
或者:
namespace ConsoleApplication20
{
using space1;
namespace space1
{
class Class1
{
public Class1()
{
Console.WriteLine("class1");
}
}
}
class Program
{
public static void Main(string[] args)
{
Class1 c1 = new Class1();
Console.ReadKey();
}
}
}
这样子看着就有点奇怪了,在命名空间ConsoleApplication20中使用了space1,所以在ConsoleApplication20中的类Program中就可以使用空间space1中的类了。
那么又出现一个问题,如果space1和ConsoleApplication20中出现了同名的类怎么办呢?
namespace ConsoleApplication20
{
using space1;
namespace space1
{
public class Class1
{
public Class1()
{
Console.WriteLine("in space1");
}
}
}
class Program
{
public static void Main(string[] args)
{
Class1 c1 = new Class1();
Console.ReadKey();
}
}
public class Class1
{
public Class1()
{
Console.WriteLine("in space ConsoleApplication20");
}
}
}
结果是打印出 "in space ConsoleApplication20” ,这说明如果引用的命名空间和自己的命名空间冲突了,编译器还是会先选择自己命名空间中的类型的。
如果两个都不是自己命名空间中的类重名了,就需要在类前加上命名空间了,否则无法通过编译。
namespace ConsoleApplication20
{
using space3;
using space4;
class Program
{
public static void Main(string[] args)
{
Class1 c1 = new Class1();
Console.ReadKey();
}
}
}
namespace space3
{
class Class1
{
public Class1()
{
Console.WriteLine("space3");
}
}
}
namespace space4
{
class Class1
{
public Class1()
{
Console.WriteLine("space4");
}
}
}
这样编写的话,编译器会报错:“Class1引用不明确”,只能在Class1前加上space3或者space4才能通过编译。
另一种情况下:
namespace ConsoleApplication20
{
using space3;
class Program
{
public static void Main(string[] args)
{
space4.Class2 c1 = new space4.Class2();
Console.ReadKey();
}
}
}
namespace space3
{
class Class1
{
public Class1()
{
Console.WriteLine("space3");
}
}
namespace space4
{
class Class2
{
public Class2()
{
Console.WriteLine("space4");
}
}
}
}
编译器也无法找到space4,也会报错,可见space4并不是space3的一个子空间,而是完全独立的一个空间,只不过在space4中可以使用space3中的类罢了。
在被外部的调用中,space4仍然被看做是一个单独的空间。
那么,如果两次引用了同一个空间,是否会出现重复引用的问题呢。
namespace ConsoleApplication20
{
using space3;
using space4;
class Program
{
public static void Main(string[] args)
{
Class2 c1 = new Class2();
Console.ReadKey();
}
}
}
namespace space3
{
class Class1
{
public Class1()
{
Console.WriteLine("space3");
}
}
}
namespace space4
{
using space3;
class Class2
{
public Class2()
{
Class1 c1 = new Class1();
Console.WriteLine("space4");
}
}
}
using的本质是什么呢?它是如何工作的?我这周要把这个问题搞清楚,在下一篇文章中好好分析一下。