【C#】using

news2024/12/26 22:42:17

文章目录

  • global 修饰符
  • using 别名
  • 结合“global 修饰符”和“using 别名”
  • static 修饰符
  • 来源

global 修饰符

向 using 指令添加 global 修饰符意味着 using 将应用于编译中的所有文件(通常是一个项目)。 global using 指令被添加到 C# 10 中。 其语法为:

global using <fully-qualified-namespace>;

其中 fully-qualified-namespace 是命名空间的完全限定名称,其类型可以在不指定命名空间的情况下引用。

global using 指令可以出现在任何源代码文件的开头。 单个文件中的所有 global using 指令必须出现在以下内容之前:

  • 没有 using 修饰符的所有 global 指令。
  • 文件中的所有命名空间和类型声明。

可以将 global using 指令添加到任何源文件中。 通常,你需要将它们保留在一个位置。 global using 指令的顺序并不重要,无论是在单个文件中,还是在文件之间。

global 修饰符可以与 static 修饰符合并。 global 修饰符可以应用于 using 别名指令。 在这两种情况下,指令的作用域都是当前编译中的所有文件。 以下示例允许在项目中的所有文件中使用 System.Math 中声明的所有方法:

global using static System.Math;

还可以通过将 <Using> 项添加到项目文件(例如 <Using Include="My.Awesome.Namespace" />)来全局包含命名空间。

using 别名

创建 using 别名指令,以便更易于将标识符限定为命名空间或类型。 在任何 using 指令中,都必须使用完全限定的命名空间或类型,而无需考虑它之前的 using 指令。 using 指令的声明中不能使用 using 别名。 例如,以下示例生成一个编译器错误:

using s = System.Text;
using s.RegularExpressions; // Generates a compiler error.

下面的示例显示如何为命名空间定义和使用 using 别名:

namespace PC
{
    // Define an alias for the nested namespace.
    using Project = PC.MyCompany.Project;
    class A
    {
        void M()
        {
            // Use the alias
            var mc = new Project.MyClass();
        }
    }
    namespace MyCompany
    {
        namespace Project
        {
            public class MyClass { }
        }
    }
}

using 别名指令的右侧不能有开放式泛型类型。 例如,不能为 List<T> 创建 using 别名,但可以为 List<int> 创建 using 别名。

下面的示例显示如何为类定义 using 指令和 using 别名:

using System;

// Using alias directive for a class.
using AliasToMyClass = NameSpace1.MyClass;

// Using alias directive for a generic class.
using UsingAlias = NameSpace2.MyClass<int>;

namespace NameSpace1
{
    public class MyClass
    {
        public override string ToString()
        {
            return "You are in NameSpace1.MyClass.";
        }
    }
}

namespace NameSpace2
{
    class MyClass<T>
    {
        public override string ToString()
        {
            return "You are in NameSpace2.MyClass.";
        }
    }
}

namespace NameSpace3
{
    class MainClass
    {
        static void Main()
        {
            var instance1 = new AliasToMyClass();
            Console.WriteLine(instance1);

            var instance2 = new UsingAlias();
            Console.WriteLine(instance2);
        }
    }
}
// Output:
//    You are in NameSpace1.MyClass.
//    You are in NameSpace2.MyClass.

从 C# 12 开始,可为以前受限的类型(包括元组类型、指针类型和其他不安全类型)创建别名。

结合“global 修饰符”和“using 别名”

global using dt = System.DateTime;

使用别名要小心,如果别名是一个已使用的名称,则容易造成错误:

global using DateTime = System.Text.Encoding;

在这里插入图片描述
但是,反过来想:如果上面的 Encoding 包含了 Now 的定义,是不是就可以替换掉现有的 DateTime.Now 实现呢?

新建一个 .cs 文件,在顶部使用 global using 设置 DateTime 为别名:

global using DateTime = ConsoleApp1.MyIODateTime;

在 MyIODateTime 中同样实现 Now 属性:

public static class MyIODateTime
{
    public static System.DateTime Now 
    { 
        get 
        {
            Console.WriteLine("Call from MyIODateTime");
            return new System.DateTime(2022, 1, 1); 
        } 
    }
}

在 ConsoleApp1 中执行 Console.WriteLine(DateTime.Now);,可以发现 DateTime.Now 确实被替换了:

在这里插入图片描述

static 修饰符

using static 指令命名了一种类型,无需指定类型名称即可访问其静态成员和嵌套类型。 其语法为:

using static <fully-qualified-type-name>;

<fully-qualified-type-name> 是无需指定类型名称即可访问其静态成员和嵌套类型的类型名称。 如果不提供完全限定的类型名称(完整的命名空间名称以及类型名称),则 C# 将生成编译器错误 CS0246:“无法找到类型或命名空间名称‘type/namespace’(是否缺少 using 指令或程序集引用?)”。

using static 指令适用于任何具有静态成员(或嵌套类型)的类型,即使该类型还具有实例成员。 但是,只能通过类型实例来调用实例成员。

你可以访问类型的静态成员,而无需限定使用类型名称进行访问:

using static System.Console;
using static System.Math;
class Program
{
    static void Main()
    {
        WriteLine(Sqrt(3*3 + 4*4));
    }
}

通常,调用某个静态成员时,即会提供类型名称以及成员名称。 重复输入相同的类型名称来调用该类型的成员将生成详细的晦涩代码。 例如,Circle 类的以下定义引用 Math 类的许多成员。

using System;

public class Circle
{
   public Circle(double radius)
   {
      Radius = radius;
   }

   public double Radius { get; set; }

   public double Diameter
   {
      get { return 2 * Radius; }
   }

   public double Circumference
   {
      get { return 2 * Radius * Math.PI; }
   }

   public double Area
   {
      get { return Math.PI * Math.Pow(Radius, 2); }
   }
}

通过消除每次引用成员时,显式引用 Math 类的需求,using static 指令将生成更简洁的代码:

using System;
using static System.Math;

public class Circle
{
   public Circle(double radius)
   {
      Radius = radius;
   }

   public double Radius { get; set; }

   public double Diameter
   {
      get { return 2 * Radius; }
   }

   public double Circumference
   {
      get { return 2 * Radius * PI; }
   }

   public double Area
   {
      get { return PI * Pow(Radius, 2); }
   }
}

using static 仅导入可访问的静态成员和指定类型中声明的嵌套类型。 不导入继承的成员。 可以从任何带 using static 指令的已命名类型导入,包括 Visual Basic 模块。 如果 F# 顶级函数在元数据中显示为一个已命名类型(其名称是有效的 C# 标识符)的静态成员,则可以导入该 F# 函数。

using static 使指定类型中声明的扩展方法可用于扩展方法查找。 但是,扩展方法的名称不导入到代码中非限定引用的作用域中。

同一编译单元或命名空间中通过不同 using static 命令从不同类型导入的具有相同名称的方法组成一个方法组。 这些方法组内的重载解决方法遵循一般 C# 规则。

以下示例使用 using static 指令来提供 Console、Math 和 String 类的静态成员,而无需指定其类型名称。

using System;
using static System.Console;
using static System.Math;
using static System.String;

class Program
{
   static void Main()
   {
      Write("Enter a circle's radius: ");
      var input = ReadLine();
      if (!IsNullOrEmpty(input) && double.TryParse(input, out var radius)) {
         var c = new Circle(radius);

         string s = "\nInformation about the circle:\n";
         s = s + Format("   Radius: {0:N2}\n", c.Radius);
         s = s + Format("   Diameter: {0:N2}\n", c.Diameter);
         s = s + Format("   Circumference: {0:N2}\n", c.Circumference);
         s = s + Format("   Area: {0:N2}\n", c.Area);
         WriteLine(s);
      }
      else {
         WriteLine("Invalid input...");
      }
   }
}

public class Circle
{
   public Circle(double radius)
   {
      Radius = radius;
   }

   public double Radius { get; set; }

   public double Diameter
   {
      get { return 2 * Radius; }
   }

   public double Circumference
   {
      get { return 2 * Radius * PI; }
   }

   public double Area
   {
      get { return PI * Pow(Radius, 2); }
   }
}
// The example displays the following output:
//       Enter a circle's radius: 12.45
//
//       Information about the circle:
//          Radius: 12.45
//          Diameter: 24.90
//          Circumference: 78.23
//          Area: 486.95

在此示例中,using static 指令也已经应用于 Double 类型。 添加该指令使得在未指定类型名称情况下调用 TryParse(String, Double) 方法成为可能。 但是,使用没有类型名称的 TryParse 创建的代码可读性较差,因为有必要检查 using static 指令,以确定所调用的数值类型的 TryParse 方法。

using static 也适用于 enum 类型。 通过在枚举中添加 using static,该类型不再需要使用枚举成员。

using static Color;

enum Color
{
    Red,
    Green,
    Blue
}

class Program
{
    public static void Main()
    {
        Color color = Green;
    }
}

来源

using 指令
global using 的另类用法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么快速定位bug?怎么编写测试用例?

目录 01定位问题的重要性 02问题定位技巧 03初次怎么写用例 作为一名测试人员如果连常见的系统问题都不知道如何分析&#xff0c;频繁将前端人员问题指派给后端人员&#xff0c;后端人员问题指派给前端人员&#xff0c;那么在团队里你在开发中的地位显而易见 &#xff0c;口碑…

什么?按Home键SingleInstance Activity销毁了???

前段时间&#xff0c;突然有朋友询问&#xff0c;自己写的SingleInstance Activity在按home键的时候被销毁了&#xff0c;刚听到这个问题的时候&#xff0c;我直觉怀疑是Activity在onPause或者onStop中发生了Crash导致闪退了&#xff0c;但是安装apk查看现象&#xff0c;没有发…

摸索graphQL在前端vue中使用过程(四)

请求网址https://hasura.io/learn/graphql&#xff0c;他这个Authorization好像每天就会一次变化&#xff0c;需要注意。 之前用到了一种类型ID&#xff0c;也就是说&#xff0c;在GraphQL的查询标量的过程中。 标量:就是被查询的字段名称。 这里再补充一点知识&#xff0c;统…

Android 包体积资源优化实践

1 插件优化 插件优化资源在得物App最新版本上收益12MB。插件优化的日志在包体积平台有具体的展示&#xff0c;也是为了提供一个资源问题追溯的能力。 1.1 插件环境配置 插件首先会初始化环境配置&#xff0c;如果机器上未安装运行环境则会去oss下载对应的可执行文件。 1.2 图…

Windows 在VMware16.x安装Win11系统详细教程

文章目录 一、准备二、创建虚拟机1. 创建新的虚拟机2. 选择虚拟机硬件兼容性3. 安装客户机操作系统4. 选择客户机操作系统5. 命名虚拟机6. 固件类型7. 处理器配置8. 此虚拟机内存9. 网络类型10. 选择I/O控制器类型11. 选择磁盘类型12. 选择磁盘13. 指定磁盘容量14. 指定磁盘文件…

【深度学习】日常笔记15

训练集和测试集并不来⾃同⼀个分布。这就是所谓的分布偏移。 真实⻛险是从真实分布中抽取的所有数据的总体损失的预期&#xff0c;然⽽&#xff0c;这个数据总体通常是⽆法获得的。计算真实风险公式如下&#xff1a; 为概率密度函数 经验⻛险是训练数据的平均损失&#xff0c;⽤…

python机器学习(四)线性代数回顾、多元线性回归、多项式回归、标准方程法求解、线性回归案例

回顾线性代数 矩阵 矩阵可以理解为二维数组的另一种表现形式。A矩阵为三行两列的矩阵&#xff0c;B矩阵为两行三列的矩阵&#xff0c;可以通过下标来获取矩阵的元素&#xff0c;下标默认都是从0开始的。 A i j : A_{ij}: Aij​:表示第 i i i行&#xff0c;第 j j j列的元素。…

N位分频器的实现

N位分频器的实现 一、 目的 使用verilog实现n位的分频器&#xff0c;可以是偶数&#xff0c;也可以是奇数 二、 原理 FPGA中n位分频器的工作原理可以简要概括为: 分频器的作用是将输入时钟频率分频,输出低于输入时钟频率的时钟信号。n位分频器可以将输入时钟频率分频2^n倍…

linux进阶-I.MX 6ULL

目录 启动模式&#xff08;8引脚设置启动模式&#xff09; 对应原理图 boot ROM程序 空偏移 映像向量表&#xff08;Image vector table&#xff0c;IVT&#xff09; IVT结构体 Boot data DCD&#xff08;外设寄存器配置信息&#xff0c;初始化关键外设&#xff09; NXP…

如何使用 After Effects 导出摄像机跟踪数据到 3ds Max

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 在本教程中&#xff0c;我将展示如何在After Effects中跟踪实景场景&#xff0c;然后将相机数据导出到3ds Max。 1. 项目设置 步骤 1 打开“后效”。 打开后效果 步骤 2 转到合成>新合成以创建新合…

Docker Compose(九)

一、背景&#xff1a; 对于现代应用来说&#xff0c;大多数都是通过很多的微服务互相协同组成一个完整的应用。例如&#xff0c;订单管理、用户管理、品类管理、缓存服务、数据库服务等&#xff0c;他们构成了一个电商平台的应用。而部署和管理大量的服务容器是一件非常繁琐的事…

【图像处理】使用自动编码器进行图像降噪(改进版)

阿里雷扎凯沙瓦尔兹 一、说明 自动编码器是一种学习压缩和重建输入数据的神经网络。它由一个将数据压缩为低维表示的编码器和一个从压缩表示中重建原始数据的解码器组成。该模型使用无监督学习进行训练&#xff0c;旨在最小化输入和重建输出之间的差异。自动编码器可用于降维、…

宋浩线性代数笔记(二)矩阵及其性质

更新线性代数第二章——矩阵&#xff0c;本章为线代学科最核心的一章&#xff0c;知识点多而杂碎&#xff0c;务必仔细学习。 重难点在于&#xff1a; 1.矩阵的乘法运算 2.逆矩阵、伴随矩阵的求解 3.矩阵的初等变换 4.矩阵的秩 &#xff08;去年写的字&#xff0c;属实有点ugl…

Android 之 Canvas API 详解 (Part 2) 剪切方法合集

本节引言&#xff1a; 本节继续带来Android绘图系列详解之Canvas API详解(Part 2)&#xff0c;今天要讲解的是Canvas 中的ClipXxx方法族&#xff01;我们可以看到文档中给我们提供的Clip方法有三种类型&#xff1a; clipPath( )&#xff0c;clipRect( )&#xff0c;clipRegion(…

Mybatis的基本操作--增删改查

目录 查看数据 无参数 一个参数 多个参数 添加数据 修改数据 删除数据 查看数据 分三种情况&#xff1a;无参&#xff0c;有一个参数&#xff0c;有多个参数的情况。 &#xff08;这里的详细操作步骤是博主的上一篇博客写的&#xff1a;初识Mybatis&#xff0c;并创建第…

2023年VSCode插件最新推荐(54款)

本文介绍前端开发领域常用的一些VSCode插件&#xff0c;插件是VSCode最重要的组成部分之一&#xff0c;本文列出了我自己在以往工作经验中积累的54款插件&#xff0c;个人觉得这些插件是有用或有趣的&#xff0c;根据它们的作用&#xff0c;我粗略的把它们分成了代码管理、文本…

css实现纹理条纹,波点背景效果

css实现纹理条纹&#xff0c;波点背景效果 本文目录 css实现纹理条纹&#xff0c;波点背景效果效果一&#xff1a;水平条纹效果二&#xff1a;竖向条纹效果三&#xff1a;斜条纹效果四&#xff1a;网格效果五&#xff1a;象棋盘1效果六&#xff1a;象棋盘2效果七&#xff1a;红…

代码重构的时机与方法

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;2022年度博客之星前端领域TOP 2&#xff0c;前端领域优质作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步…

机器人制作开源方案 | 智能垃圾桶

1. 功能说明 智能垃圾桶是一种利用物联网技术和智能感知能力的智能设备&#xff0c;旨在提高垃圾分类和处理的效率。通常具备以下特点和功能&#xff1a; ① 智能感知&#xff1a;智能垃圾桶配备各种传感器&#xff0c;如压力传感器、红外线传感器等&#xff0c;可以实时感知…