【问题标题】:Implicit assembly-wide using directive隐式程序集范围的 using 指令
【发布时间】:2020-08-31 22:34:48
【问题描述】:

我们有一个核心库 (CoreLibrary),将其包含在每个程序集中确实很有意义。 目前有很多扩展方法,在每个文件中我必须通过

包含命名空间
using CoreLibrary;

是否有可能在每个程序集中隐式包含 using CoreLibrary,这样我就不必像 mscorlib 那样自己编写它了?原因不仅是为了节省输入,对于不知道存在扩展方法的用户也是如此。

原因如下。我有一个

interface IArray
{
  int Size { get;}

  // Returns data with a newly created array.
  T[] GetData<T>();

  // Returns data in an already existing array.
  void GetData<T>(T[] data);
}

在实现 IArray 的每个类都必须实现这两种方法之前(我有其中的一些......)

class Array1D : IArray
{
  public int Size { get;}


  // Returns data with a newly created array.
  T[] GetData<T>()
  {
    var data = new T[Size];
    GetData(data);
    return data;
  }

  // Returns data in an already existing array.
  void GetData<T>(T[] data)
  {
    // Produce data
  }
}

现在我认为我可以在接口中使用默认实现,这样我就可以为实现 IArray 的每个类摆脱每个完全相同的 GetData 实现。

  interface IArray
    {
      int Size { get;}

      // Returns data with a newly created array.
      T[] GetData<T>()
      {
        var data = new T[Size];
        GetData(data);
        return data;
      }

      // Returns data in an already existing array.
      void GetData<T>(T[] data);
    }

到目前为止一切都很好,但我知道我总是需要强制转换为 IArray 才能访问不可行的默认实现,而且似乎使用默认实现现在还有其他方法。于是萌生了使用扩展方法的想法

public static class ArrayExtensions : IArray
{
  public int Size { get;}


  // Returns data with a newly created array.
  public static T[] GetData<T>(this IArray array)
  {
    var data = new T[array.Size];
    array.GetData(data);
    return data;
  }    
}

效果很好,但是现在我必须包含命名空间,这主要是可以的,但是在您可以通过 Intellisense 直接查看您有什么方法之前,现在您不知道扩展方法如果你以前没用过。

【问题讨论】:

  • 我无法想象这是可能的。使用最基本的 .Net 命名空间(例如“System”)甚至是不可能的,它需要在每个源文件中使用。除此之外,“隐式使用”对我来说不是一个好主意。这使您的命名空间与仅存在语言自己的类型的“上帝命名空间”相提并论,例如“int”或“bool”。
  • “像 mscorlib 一样” - 什么意思?甚至 using System; 也不是隐含的——它需要是每个文件的;你能举例说明你的意思吗?但不,在常规 C# 中,隐式 using 指令不是一回事;你可以在剃须刀(cshtml)中做到这一点
  • @Sinatr 这是一个 using 指令 ​​alias;不同的场景,虽然答案仍然是“不,它是每个文件/命名空间”
  • @msedi 重新编辑:考虑 LINQ - 一级语言功能(如果您使用 from x in foo 语法等) - 通常基于扩展方法: 仍然需要你有正确的using 指令。这似乎是一个文档问题,最重要的是......

标签: c#


【解决方案1】:

是否有可能在每个程序集中隐式包含 using CoreLibrary,这样我就不必像 mscorlib 那样自己编写它了?

K,我们需要在这里梳理 3 个不同的东西,但最终我相信答案是“不”,但是...

  1. “在每个程序集中”-using 指令是最宽的每个文件(它们也可以是每个文件内的每个namespace 范围)-不是每个程序集(甚至每个类型,感谢partial);它不能在全球范围内应用
  2. 程序集 级别,您需要一个引用,而不是 using 指令 - 可能是包引用;这可以全局应用的东西,通过将&lt;PackageReference&gt;(或类似的)放在构建树中更高目录中的Directory.Build.props文件中(注意:引用不会改变对每个文件using 指令的需求;它是“必要但不充分”)
  3. “像 mscorlib 一样吗?” - mscorlib 没有这样的事情

【讨论】:

    猜你喜欢
    • 2012-09-13
    • 2011-02-02
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    相关资源
    最近更新 更多