C# 命名空间与程序集

13.1 命名空间作用

命名空间用于组织代码,避免命名冲突。

1
2
3
4
5
6
7
namespace Company.Project.Module
{
public class UserService
{
// 类内容
}
}

使用命名空间

1
2
3
4
5
6
7
8
// 引入命名空间
using Company.Project.Module;

// 直接使用
var service = new UserService();

// 完整限定名
var service = new Company.Project.Module.UserService();

13.2 嵌套命名空间

传统写法

1
2
3
4
5
6
7
8
9
10
namespace Company
{
namespace Project
{
namespace Module
{
public class MyClass { }
}
}
}

C# 10+ 简化写法

1
2
3
namespace Company.Project.Module;

public class MyClass { }

13.3 using 别名

解决命名冲突

1
2
3
4
5
using IO = System.IO;
using WinForms = System.Windows.Forms;

IO.File.WriteAllText("test.txt", "Hello");
WinForms.MessageBox.Show("Hello");

类型别名

1
2
3
4
5
using StringList = System.Collections.Generic.List<string>;
using IntDict = System.Collections.Generic.Dictionary<int, string>;

var names = new StringList();
var dict = new IntDict();

13.4 全局 using(C# 10+)

全局引入

1
2
3
4
5
// GlobalUsings.cs(自动应用到所有文件)
global using System;
global using System.Collections.Generic;
global using System.Linq;
global using System.IO;

隐式 using

1
2
3
4
<!-- .csproj 文件中 -->
<PropertyGroup>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

13.5 程序集概念

什么是程序集

  • 编译输出的 .dll.exe 文件
  • 包含 IL 代码、元数据、清单
  • 是部署和版本控制的基本单元

程序集类型

1
2
MyApp.exe          # 可执行程序集
MyLibrary.dll # 类库程序集

13.6 引用程序集

项目引用

1
2
3
4
<!-- .csproj 文件 -->
<ItemGroup>
<ProjectReference Include="..\MyLibrary\MyLibrary.csproj" />
</ItemGroup>

NuGet 包引用

1
2
3
4
5
6
7
8
# 命令行
dotnet add package Newtonsoft.Json
dotnet add package Microsoft.EntityFrameworkCore

# 手动编辑 .csproj
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>

程序集引用

1
2
3
<ItemGroup>
<Reference Include="System.Windows.Forms" />
</ItemGroup>

13.7 InternalsVisibleTo

内部可见性

1
2
3
4
5
6
7
8
9
10
11
12
// AssemblyInfo.cs
[assembly: InternalsVisibleTo("MyApp.Tests")]

// 内部类
internal class InternalHelper
{
internal void DoWork() { }
}

// 测试项目可以访问
var helper = new InternalHelper();
helper.DoWork();

13.8 程序集信息

设置程序集属性

1
2
3
4
5
6
7
8
// AssemblyInfo.cs
[assembly: AssemblyTitle("My Application")]
[assembly: AssemblyDescription("Description")]
[assembly: AssemblyCompany("Company Name")]
[assembly: AssemblyProduct("Product Name")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

.csproj 方式

1
2
3
4
5
6
<PropertyGroup>
<Title>My Application</Title>
<Description>Description</Description>
<Company>Company Name</Company>
<Version>1.0.0</Version>
</PropertyGroup>

13.9 本章小结

  • 命名空间组织代码,避免冲突
  • using 引入命名空间,支持别名
  • C# 10+ 支持文件范围命名空间和全局 using
  • 程序集是 .dll.exe 文件
  • 通过项目引用、NuGet 引用其他程序集
  • InternalsVisibleTo 允许友元程序集访问 internal

练习题

  1. 创建嵌套命名空间并定义类
  2. 使用 using 别名解决命名冲突
  3. 添加 NuGet 包并使用
  4. 以下代码能否编译?
    1
    2
    3
    4
    namespace A.B;
    class C { }
    namespace A.B;
    class D { }
ByteFisher
分享编程技术 · 记录钓鱼乐趣
扫码关注
▸ 扫码关注 ◂
C#基础教程 系列
第 13/20 篇
分享: