C# 命名空间(Namespace)

news/2025/1/15 9:46:38/

文章目录

  • 前言
  • 一、命名空间的定义与使用基础
    • (一)定义语法与规则
    • (二)调用命名空间内元素
  • 二、using 关键字
  • 三、嵌套命名空间


前言

  命名空间(Namespace)在于提供一种清晰、高效的方式,将一组名称与其他名称进行分隔,确保在不同命名空间里即便声明了相同名称的类,也不会引发冲突,恰似计算机系统里的文件夹架构,同一文件夹中严禁同名文件存在,可不同文件夹下的文件即便重名也相安无事。
在这里插入图片描述

一、命名空间的定义与使用基础

在这里插入图片描述

(一)定义语法与规则

  命名空间的定义遵循一套简洁且规范的语法,以关键字 namespace 作为起始标识,紧随其后的便是所设定的命名空间名称,在这个被划定的 “代码疆域” 内,开发者可以自由地放置各类代码声明,诸如类、接口、结构体等诸多代码元素。示例如下:

namespace MyCustomNamespace
{// 在这里可以声明类、结构体、接口等,比如下面定义一个简单的类class MyClass{public void SomeMethod(){Console.WriteLine("This is a method in MyClass within MyCustomNamespace");}}
}

  上述代码清晰勾勒出一个名为 MyCustomNamespace 的命名空间,内部承载着 MyClass 这一自定义类,后续随着项目推进,只要处于该命名空间下,相关代码便能有条不紊地对 MyClass 及其成员展开调用与操作。

(二)调用命名空间内元素

  当需要调用存在于特定命名空间里支持命名空间版本的函数或者变量时,就需将命名空间名称前置,借助 “.” 运算符构建清晰的访问路径,形如 namespace_name.item_name。以下面的程序为例,能直观洞察这一调用规则在实践中的运作方式:

using System;
namespace first_space
{class namespace_cl{public void func(){Console.WriteLine("Inside first_space");}}
}
namespace second_space
{class namespace_cl{public void func(){Console.WriteLine("Inside second_space");}}
}
class TestClass
{static void Main(string[] args){first_space.namespace_cl fc = new first_space.namespace_cl();second_space.namespace_cl sc = new second_space.namespace_cl();fc.func();sc.func();Console.ReadKey();}
}

  在这段代码里,first_space 和 second_space 是两个独立的命名空间,各自拥有名为 namespace_cl 的类,且均定义了 func 方法。在 Main 方法中,通过 first_space.namespace_cl 和 second_space.namespace_cl 这般精准的命名空间限定方式,分别实例化对应类并调用 func 方法,最终按预期输出各自空间内设定的信息,淋漓尽致展现出命名空间对同名类的隔离与区分成效,编译执行后依次呈现:

Inside first_space
Inside second_space

二、using 关键字

  在日常 C# 编程进程中,频繁书写冗长的完全限定名称(即将命名空间名称与具体元素名称完整罗列)无疑会增添代码书写负担、拉低编码效率,而 using 关键字恰似一把 “魔法棒”,巧妙化解了这一难题。它清晰表明程序正使用给定命名空间中的名称,赋予开发者便捷引用的 “特权”。
就像在使用广泛的 System 命名空间时,其内部定义了诸如 Console 这般常用类,借助 using System; 指令预先声明后,我们便能在代码里简洁写下 Console.WriteLine(“Hello there”);,省略繁琐的 System.Console.WriteLine(“Hello there”);。
  更进一步,using 命名空间指令更是允许开发者在后续代码使用相关名称时,省却前置的命名空间名称,只需提前告知编译器所使用的指定命名空间,后续便能 “轻装上阵”。以下面重写后的实例为证:

using System;
using first_space;
using second_space;namespace first_space
{class abc{public void func(){Console.WriteLine("Inside first_space");}}
}
namespace second_space
{class efg{public void func(){Console.WriteLine("Inside second_space");}}
}
class TestClass
{static void Main(string[] args){abc fc = new abc();efg sc = new efg();fc.func();sc.func();Console.ReadKey();}
}

  在此例中,通过 using first_space; 和 using second_space; 声明,在 Main 方法里可直接以 abc 和 efg 之名实例化对应类并调用方法,如同它们就在眼前触手可及,无需再添命名空间前缀,编译执行后同样输出:

Inside first_space
Inside second_space

  不过值得留意的是,过度滥用 using 指令可能导致命名空间 “污染”,引发潜在的名称混淆,因此在大型项目里,需审慎权衡、精准运用,力求在便捷与清晰间寻得平衡。

三、嵌套命名空间

  为契合复杂项目里愈发精细化的代码组织诉求,C# 允许命名空间相互嵌套,形成类似 “套娃” 般的层次化结构,开发者得以在一个命名空间内部再定义另一个命名空间,持续拓展代码管理的深度与广度。语法呈现如下:

namespace OuterNamespace
{// 外层命名空间的常规代码声明,比如类、接口等定义namespace InnerNamespace{// 内层命名空间专属代码声明,可与外层相互独立又有所关联}
}

  面对这类嵌套架构,访问嵌套命名空间的成员时,借助点(.)运算符便能层层穿透、精准定位。以下实例可供参考:

using System;
using SomeNameSpace;
using SomeNameSpace.Nested;namespace SomeNameSpace
{public class MyClass{static void Main(){Console.WriteLine("In SomeNameSpace");Nested.NestedNameSpaceClass.SayHello();}}// 内嵌命名空间namespace Nested{public class NestedNameSpaceClass{public static void SayHello(){Console.WriteLine("In Nested");}}}
}

  在这段代码里,SomeNameSpace 作为外层命名空间,嵌套了 Nested 这一内层命名空间,后者包含 NestedNameSpaceClass 类及其 SayHello 静态方法。在 SomeNameSpace 的 MyClass 的 Main 方法中,通过 Nested.NestedNameSpaceClass.SayHello() 这般调用链路,借助点运算符依次穿透两层命名空间,顺利触发内层方法执行,编译执行后输出:

In SomeNameSpace
In Nested

  这种嵌套式设计,在大型软件项目里,能依据功能模块、业务领域等维度对代码进行条理清晰的分组与归置,仿若为代码搭建起一座规整的 “大厦”,各 “楼层”(命名空间层级)各司其职、协同运作,让代码维护、团队协作更为高效顺畅。
在这里插入图片描述


http://www.ppmy.cn/news/1552886.html

相关文章

群控系统服务端开发模式-应用开发-邮件工厂结构封装

首先在系统根目录下extend文件夹下创建邮件工厂文件夹并更名叫Mail。 一、邮件发送父类 在Mail目录下创建邮件发送父类并更名为MailSenderInterface.php&#xff0c;代码如下 <?php /*** 邮件发送父类* User: 龙哥三年风水* Date: 2024/12/5* Time: 14:22*/ namespace Ma…

LabVIEW密码保护与反编译的安全性分析

在LabVIEW中&#xff0c;密码保护是一种常见的源代码保护手段&#xff0c;但其安全性并不高&#xff0c;尤其是在面对专业反编译工具时。理论上&#xff0c;所有软件的反编译都是可能的&#xff0c;尽管反编译不一定恢复完全的源代码&#xff0c;但足以提取程序的核心功能和算法…

Groom Blender to UE5

Groom Blender to UE5 - Character & Animation - Epic Developer Community Forums Hello, 你好&#xff0c; While exporting my “groom” from blender to UE5, I notice that the curves have a minimal resolution in Unreal. However I would like to get the same …

如果模块把http改成了https请求,测试方案应该怎么制定

首先确定要测试的模块、接口、功能等&#xff0c;以及测试的目标&#xff0c;确保HTTPS请求能够正常进行、数据传输安全等。 1.功能测试 回归相应的功能模块以及业务逻辑&#xff0c;是否正常 2.兼容测试 测试不同浏览器和操作系统是否能够正常支持HTTPS连接。 验证模块在各种设…

HiveSQL 中判断字段是否包含某个值的多种方法详解

目录 一、数据准备 二、判断字段是否包含某值的方法 like 方法 locate 函数方法 instr 函数方法 regexp_extract 函数方法 strpos 方法&#xff08;Hive 不支持&#xff0c;其他技术支持&#xff09; 三、总结 在使用 HiveSQL 进行数据处理与分析时&#xff0c;常常会遇…

Sringboot项目实现文件上传至linux指定目录

本篇文章讲述一个springboot项目如何实现一个文件上传接口&#xff0c;涉及vsftpd服务、SSH协议以及对linux系统的一些配置。 一、springboot工程部分 本篇文章略过springboot创建过程&#xff0c;具体见之前发过的文章 1.1在pom.xml中添加SFTP&#xff08;SSH 文件传输协议…

Docker 安装和使用

#Docker 安装和使用 文章目录 1. 安装2. 干掉讨厌的 sudo3. 使用镜像源3.1. 使用 upstart 的系统3.2. 使用 systemd 的系统 4. 基本使用4.1. 容器操作4.2. 镜像操作 5. 网络模式说明5.1. bridge 模式5.2. host 模式5.3. container 模式5.4. none 模式 6. 查看 Docker run 启动参…

【二分查找】力扣 875. 爱吃香蕉的珂珂

一、题目 二、思路 速度 k&#xff08;单位&#xff1a;根/小时&#xff09;是存在一个取值范围的。 速度越大肯定在规定的时间之内一定会吃完全部的香蕉&#xff0c;但也是可以确定出一个上界的。由于只要保证一小时之内&#xff0c;可以吃完香蕉数目最多的那一堆的香蕉&…