[Unity中文课堂教程] C#中级编程 - 10 - 命名空间/using

命名空间

  • 类似C语言中的库、Python中的包/模块,概念。
  • 使用关键字using导入“命名空间”,使用关键字namespace创建“命名空间”

对于不加命名空间,直接暴露的代码,且称为处于根空间内吧。

脚本①

namespace Exercise_4_21			// 命名空间一
{
	public class MyClass
	{
		public MyClass()
		{
			Debug.Log("Exercise_4_21;");
		}
	}
}

脚本②

namespace Exercise_4_22			// 命名空间二
{
	public class MyClass
	{
		public MyClass()
		{
			Debug.Log("Exercise_4_22;");
		}
	}
	
	namespace Exercise_4_22_ 	// 支持嵌套
	{
		public class MyClass
		{
			public MyClass()
			{
				Debug.Log("Exercise_4_22_;");
			}
		}
	}
}

脚本③

/*					// 不使用命名空间,如果去掉注释,上面脚本中带命名空间的重名类会被隐藏。
public class MyClass		// 如果与命名空间内容重名,则会调用优先调用没有命名空间的。
{
	public MyClass()
	{
		Debug.Log("Exercise_4_23;");
	}
}
*/

脚本④

// using Exercise_4_21;		// 如果两个都写,且两个命名空间有重名内容,会编译报错。
// using Exercise_4_22;		// 嵌套的重名也会
using Exercise_4_22.Exercise_4_22_;		// 点分割嵌套

public class Exercise_4_24 : MonoBehaviour
{
    void Start()
    {
        MyClass myclass_3 = new MyClass();	// 根据导入的命名空间不同而调用不同的内容。
        
        Exercise_4_22.MyClass myclass_2 = new Exercise_4_22.MyClass();	// 精准指定调用
        Exercise_4_21.MyClass myclass_1 = new Exercise_4_21.MyClass();
        Exercise_4_22.Exercise_4_22_.MyClass myclass_0 = 				// 可以写注释
		new Exercise_4_22.Exercise_4_22_.MyClass();
		// c#支持换行输入,不需要斜杆\,斜杆\反而会报错
    }
}
  • 总结特性
  1. 关键字namespace相当于给作用域内的命名加个前缀,用于分割代码块,避免定义重名之类的问题。
  2. 前缀加命名太长了,所以可以使用关键字using导入命名空间。

简单理解就是,又 把代码块的内容拷贝了一份

如果两份拷贝内容有重名,编译报错。如果拷贝内容和原有内容有重名,不拷贝。

  1. 支持嵌套创建命名空间,使用方法一样。

导入静态类

  • 静态类也可以使用using static关键字组合导入,导入后静态类的内容就可以不用加前缀类名使用。类似导入命名空间。

脚本③

public static class MyClass_s			// 静态类
{
	static MyClass_s()					// 静态构造函数,不能写访问修饰符
	{
		Debug.Log("Exercise_4_23;");
	}
	
	public static int num = 423;		// 静态属性
}

脚本④:(添加内容)

using static MyClass_s;		// 直接访问静态类的内容,如果有命名空间加前缀。
							// 这不算访问静态类,不调用构造函数。
/* ... */
Debug.Log("Exercise_4_24;"+num);	// 直接访问静态类属性,同时第一次访问静态类,调用构造函数。
  • 总结特点:注意,一开始导入时不会调用构造函数的。

起别名

  • using还支持给命名空间、类、静态类,起别名。不能给类中的属性方法起别名,编译报错。

脚本④:(添加+修改)

using MyClass_0 = Exercise_4_22.Exercise_4_22_;			// 起别名,给命名空间起别名
using MyClass_1 = Exercise_4_22.Exercise_4_22_.MyClass;	// 起别名,给命名空间的类起别名
using MyClass_2 = MyClass_s;							// 给静态类起别名,如果有命名空间可加
/* ... */
MyClass_0.MyClass myclass_0 = new MyClass_0.MyClass();	// 访问命名空间的类
MyClass_1 myclass_1 = new MyClass_1();					// 同上,直接访问类
Debug.Log("Exercise_4_24;"+MyClass_2.num);				// 使用静态类的别名访问
  • 总结特点:如上注释为所求。

using语句:将实例与代码绑定

在菜鸟教程看到的,没遇见过,暂时忽略稀有用法。