C# 命名空间和程序集 小记

前言

本文只是为了复习,巩固,和方便查阅,一些知识点的详细知识会通过相关链接和文献标记出来。

命名空间

1.1 概念

  • 可以把命名空间看做字符串,他加在类名或类型名前面并且通过点进行分割
  • 既然看做是字符串,那么 【命名空间名.类名】称之为 完全限定名
  • 命名空间是共享命名空间名的一组类和类型

以上的文字很好理解,比如存在一个类和命名空间。那么它的命名空间名是 ControlLib.Helper  ,完全限定名是 ControlLib.Helper.AnimationHelper

using System;
using System.Windows;
using System.Windows.Media.Animation;

namespace ControlLib.Helper
{
    /// <summary>
    /// 包含一些常用的动画辅助方法
    /// </summary>
    public class AnimationHelper
    {
        /// <summary>
        /// 创建一个Thickness动画
        /// </summary>
        /// <param name="thickness"></param>
        /// <param name="milliseconds"></param>
        /// <returns></returns>
        public static ThicknessAnimation CreateAnimation(Thickness thickness = default(Thickness), double milliseconds = 200)
        {
            
        }

        /// <summary>
        /// 创建一个Double动画
        /// </summary>
        /// <param name="toValue"></param>
        /// <param name="milliseconds"></param>
        /// <returns></returns>
        public static DoubleAnimation CreateAnimation(double toValue, double milliseconds = 200)
        {
            
        }
    }
}

1.2 补充

  • 一个源文件可以具备多个命名空间,相同的命名空间也可以在多个源文件出现
  • 命名空间可以被嵌套(原文嵌套和分离声明,如下代码)
  • 命名空间之间是独立的
  • C#10之后,命名空间不需要大括号了,可以简写 namespace GenshinDailyTools;
namespace GenshinDailyTools
{
    /// <summary>
    /// 输出格式化
    /// </summary>
    public static class WriteLineUtil
    {
        public static void WriteLineLog(object? e)
        {
        }
    }

    namespace DebugTools
    {
        /// <summary>
        /// 输出格式化
        /// </summary>
        public static class DebugLineUtil
        {
            
        }
    }
}
namespace GenshinDailyTools
{
    /// <summary>
    /// 输出格式化
    /// </summary>
    public static class WriteLineUtil
    {
        public static void WriteLineLog(object? e)
        {
           
        }
    }

    
}
namespace GenshinDailyTools.DebugTools
{
    /// <summary>
    /// 输出格式化
    /// </summary>
    public static class DebugLineUtil
    {
        public static void WriteLineLog(object? e)
        {
            
        }
    }
}

using指令

这里的using,只讨论和命名空间相关

2.1 别名和static

大家都知道,在使用了using后,那么调用就不需要再使用完全限定名称,如 Console.WriteLine。如下代码就分别使用两种方式

  • 可以给命名空间取别名
  • 也可以给空间内的一个类型
using Syst = System;
using Sc = System.Console;
namespace GenshinDailyTools;
/// <summary>
/// 输出格式化
/// </summary>
public static class WriteLineUtil
{
    public static void WriteLineLog(object? e)
    {
        var time = Syst.DateTime.Now.ToString("HH:mm:ss");

        Sc.WriteLine($"[1.0.0.1][{time}]:{e}");
    }
}

当然我们还可以再简单一些,使用 using static System.Console;这样只需要使用 WriteLine($"[1.0.0.1][{time}]:{e}");即可

2.1 global using和ImplicitUsings

C#10 使用 global using,默认都会using该命名空间。一般做法是创建一个源文件,把所有需要的命名空间都放到一个文件内

至于ImplicitUsings,为隐式Usings。要使用它,需要在.csproj声明并使用它。作用是在虽然这个using不可见,但是全局范围内使用。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

比如使用了隐式Usings,代码简化为如下图所示。

如果需要寻找这个隐藏的GlobalUsings,它位于 obj/Debug/net6.0/[ProjectName].GlobalUsings.g.cs

// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

程序集

3.1 程序集结构

  • 清单(程序集名称标识符:名称、版本、文化和公钥【关于程序集信息,可以在VS里面属性查看】,程序集文件列表,指示程序集在哪里的地图或者说运行这个程序集需要的许可,引用其他程序集的信息)
  • 类型元数据包含程序集定义所有类型的信息
  • IL,公共中间语言代码
  • 资源部分

可以使用获取程序集集合 AppDomain.CurrentDomain.GetAssemblies();从应用程序结构来看如下图所示,因为涉及到反射相关,这里不做详细描述。

参考资料

C# 程序集Assembly

C# 中 using 关键字的使用技巧

《C#图解教程》

 

posted @ 2022-12-16 01:10  樱花落舞  阅读(108)  评论(0编辑  收藏  举报