[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#支持换行输入,不需要斜杆\,斜杆\反而会报错
}
}
- 总结特性:
- 关键字
namespace
相当于给作用域内的命名加个前缀,用于分割代码块,避免定义重名之类的问题。 - 前缀加命名太长了,所以可以使用关键字
using
导入命名空间。
简单理解就是,又 把代码块的内容拷贝了一份。如果两份拷贝内容有重名,编译报错。如果拷贝内容和原有内容有重名,不拷贝。
- 支持嵌套创建命名空间,使用方法一样。
导入静态类
- 静态类也可以使用
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语句:将实例与代码绑定
在菜鸟教程看到的,没遇见过,暂时忽略稀有用法。