C# using关键字解析
1. 基础命名空间导入
当使用泛型集合List时,必须导入System.Collections.Generic
命名空间:
using System.Collections.Generic;
using UnityEngine;
public class UsingTest : MonoBehaviour
{
void Start()
{
List<int> intList = new List<int>(); // 正确使用需要前置导入
}
}
注意事项:
- 所有using指令应放在文件顶部,命名空间声明之前
- Visual Studio中可通过快捷键
Ctrl + .
自动添加缺失的命名空间
2. 静态导入(Static Import)
使用using static
导入类后可直接使用静态方法:
using UnityEngine;
using static UnityEngine.Mathf; // 静态导入
public class UsingTest : MonoBehaviour
{
void Start()
{
int a = 10, b = 20;
int c = Max(a, b); // 直接调用静态方法
// 当存在同名方法时的处理方案
c = System.Math.Max(a, b); // 全限定名解决冲突
}
}
最佳实践:
- 适用于频繁使用的工具类(如Mathf、Vector3)
- 避免在大型项目中过度使用,防止方法名冲突
3. 全局引用(Global Using)
C# 10+ 支持全局导入(需修改项目配置):
// GlobalUsings.cs
global using System.Collections;
global using UnityEngine;
global using static UnityEngine.Mathf;
配置方法:
- 修改.csproj文件添加:
<PropertyGroup>
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>preview</LangVersion>
</PropertyGroup>
- 创建单独文件管理全局using
优势:
- 减少重复代码
- 统一管理公共依赖
4. 命名空间别名
解决命名冲突或简化长命名空间:
using sys = System;
using UnityMath = UnityEngine.Mathf;
public class UsingTest : MonoBehaviour
{
void Start()
{
var dt = sys.DateTime.Now;
float val = UnityMath.Sqrt(16);
}
}
应用场景:
- 不同库中存在同名类型时
- 简化长命名空间(如
using UE = UnityEngine;
)
5. 资源自动管理
using语句确保非托管资源及时释放:
void ProcessFile(string path)
{
using var fileStream = new FileStream(path, FileMode.Open);
using var reader = new StreamReader(fileStream);
string content = reader.ReadToEnd();
// 自动调用Dispose()释放资源
}
关键点:
- 适用于实现
IDisposable
接口的对象 - C# 8.0+支持using声明(无需代码块)
- 等价于try-finally代码块
// 传统写法
using (var obj = new Resource())
{
// 使用资源
}
版本兼容表:
功能 | 最低C#版本 | 适用场景 |
---|---|---|
基础using | 1.0 | 常规类型引用 |
static using | 6.0 | 静态方法/常量访问 |
global using | 10.0 | 项目级统一引用 |
using声明式 | 8.0 | 简化资源管理代码 |
常见问题:
-
Q:为什么我的global using不生效?
A:检查项目是否启用<LangVersion>preview</LangVersion>
,并确保文件位置正确 -
Q:using语句真的能防止内存泄漏吗?
A:可确保及时释放非托管资源,但不能解决托管资源的内存管理问题 -
Q:如何批量管理using指令?
A:使用VS的"Remove and Sort Usings"功能(Ctrl+R, Ctrl+G)