404 Not Found

404 Not Found


nginx

命名空间与using

什么是命名空间

命名空间(namespace)是一种逻辑分组机制,用于组织代码、避免类型名称冲突。大型项目中不同模块可能定义同名类,命名空间为类型提供了限定路径。

namespace 定义

使用 namespace 关键字声明命名空间,类型放在花括号内。

示例

CSHARP
namespace MyApp.Models
{
    public class User
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

namespace MyApp.Services
{
    public class UserService
    {
        public string GetInfo()
        {
            return "UserService is ready";
        }
    }
}
▶ 试一试

命名空间嵌套

命名空间可以嵌套定义,内层命名空间是外层的子空间。点号访问等价于嵌套结构。

示例

CSHARP
namespace Company
{
    namespace Products
    {
        namespace Electronics
        {
            public class Phone
            {
                public string Model { get; set; }
            }
        }
    }
}

namespace Company.Products.Electronics
{
    public class Tablet
    {
        public string Model { get; set; }
    }
}
▶ 试一试

Company.Products.Electronics.PhoneCompany.Products.Electronics.Tablet 属于同一命名空间。

文件范围命名空间(C# 10)

C# 10 引入文件范围命名空间,使用分号结尾,整个文件自动位于该命名空间中,减少嵌套缩进。

示例

CSHARP
namespace MyApp.Services;

public class EmailService
{
    public void Send(string to)
    {
        System.Console.WriteLine($"Sending email to {to}");
    }
}
▶ 试一试
TEXT
Sending email to user@example.com

using 指令

using 指令引入命名空间后,可直接使用其中的类型而无需写完全限定名。

示例

CSHARP
using System;

namespace MyApp
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("No need for System.Console");
            Console.WriteLine(DateTime.Now.Year);
        }
    }
}
▶ 试一试
TEXT
No need for System.Console
2026

using 别名

当命名空间过长或存在同名类型冲突时,可用 using ... = ... 创建别名。

示例

CSHARP
using Dict = System.Collections.Generic.Dictionary<string, int>;
using StringBuilder = System.Text.StringBuilder;

namespace MyApp
{
    class Program
    {
        static void Main()
        {
            Dict scores = new Dict();
            scores.Add("Alice", 95);
            scores.Add("Bob", 87);

            StringBuilder sb = new StringBuilder();
            foreach (var pair in scores)
            {
                sb.AppendLine($"{pair.Key}: {pair.Value}");
            }
            System.Console.WriteLine(sb.ToString());
        }
    }
}
▶ 试一试
TEXT
Alice: 95
Bob: 87

using static(C# 6)

using static 引入类型的静态成员,调用时省略类型名。

示例

CSHARP
using static System.Console;
using static System.Math;

namespace MyApp
{
    class Program
    {
        static void Main()
        {
            WriteLine($"PI = {PI}");
            WriteLine($"Max = {Max(10, 20)}");
            WriteLine($"Sqrt(144) = {Sqrt(144)}");
        }
    }
}
▶ 试一试
TEXT
PI = 3.14159265358979
Max = 20
Sqrt(144) = 12

全局 using(C# 10)

global using 在一个文件中声明,整个项目所有文件都可使用该命名空间,无需重复 using

示例

CSHARP
global using System;
global using System.Collections.Generic;
global using System.Linq;
▶ 试一试

通常将全局 using 放在 GlobalUsings.cs 文件中集中管理。

隐式 using(C# 10)

在项目文件中启用 <ImplicitUsings>enable</ImplicitUsings>,SDK 风格项目会自动添加常用命名空间的 global using。

示例

XML
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>
</Project>
▶ 试一试

控制台项目自动包含的命名空间:SystemSystem.Collections.GenericSystem.IOSystem.LinqSystem.ThreadingSystem.Threading.Tasks 等。

using 与 IDisposable

using 语句用于确保 IDisposable 对象在使用后正确释放资源,C# 8 还支持 using 声明语法。

示例

CSHARP
using System;
using System.IO;

namespace MyApp
{
    class Program
    {
        static void Main()
        {
            using (var fs = new FileStream("test.txt", FileMode.Create))
            {
                byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello");
                fs.Write(data, 0, data.Length);
            }

            using var reader = new StreamReader("test.txt");
            Console.WriteLine(reader.ReadToEnd());
        }
    }
}
▶ 试一试
TEXT
Hello

花括号形式在作用域结束时释放,using var 在变量所在作用域结束时释放。

.NET 类库命名空间组织

.NET 类库按功能模块组织在 System 命名空间下的子空间中。

示例

CSHARP
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace MyApp
{
    class Program
    {
        static void Main()
        {
            ArrayList list = new ArrayList { 1, 2, 3 };
            List<string> names = new List<string> { "Alice", "Bob" };
            var upper = names.Select(n => n.ToUpper());
            StringBuilder sb = new StringBuilder("Count: ");
            sb.Append(names.Count);
            Console.WriteLine(sb.ToString());
        }
    }
}
▶ 试一试
TEXT
Count: 2
命名空间 用途
System 基础类型(Console、DateTime、Math 等)
System.IO 文件与流操作
System.Collections 非泛型集合(ArrayList、Hashtable)
System.Collections.Generic 泛型集合(List<T>、Dictionary<K,V>)
System.Linq LINQ 查询扩展
System.Text 字符串处理(StringBuilder、Encoding)
System.Threading 线程与同步
System.Threading.Tasks 异步编程(Task、Task<T>)

❓ 常见问题

Q 命名空间和程序集(DLL)是同一个概念吗?
A 不是。命名空间是逻辑组织,程序集是物理部署,一个程序集可包含多个命名空间,一个命名空间也可跨越多个程序集。
Q using 指令是否会增加程序体积?
A 不会。using 只是编译期简化写法的语法糖,不影响运行时或程序大小。
Q 文件范围命名空间能再嵌套子命名空间吗?
A 可以,在文件范围命名空间内用花括号定义子命名空间即可。
Q global using 和 ImplicitUsings 有什么区别?
A global using 是开发者手动声明的,ImplicitUsings 是 SDK 自动生成的 global using 集合,后者依赖前者机制。
Q using static 能引入实例成员吗?
A 不能,using static 只引入静态成员和嵌套类型,实例成员仍需通过对象调用。

📖 小节

📝 作业

  1. 创建一个包含两层嵌套命名空间 School.Teachers 的类 Teacher,并在 Main 中实例化它
  2. 使用 using 别名为 System.Collections.Generic.List<string> 创建简短别名,并用该别名创建列表添加元素后输出
  3. 使用 using static System.Math,直接调用 SqrtAbsRound 三个方法并输出结果
  4. 创建一个 GlobalUsings.cs 文件,在其中用 global using 声明 SystemSystem.IOSystem.Linq,然后在另一个文件中省略这些 using 验证可用
  5. 分别用花括号 using 语句和 using var 声明两种方式操作 StreamWriter 写入文件,体会两者区别
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏