代码之家  ›  专栏  ›  技术社区  ›  Bri Bri

在C中,处理包含受保护嵌套类型的长模板类型名称的好方法是什么?

c#
  •  0
  • Bri Bri  · 技术社区  · 7 年前

    我有一个C类,其中的方法获取和返回的类型如下:

    Dictionary<ClassWithLongNameA, Dictionary<ClassWithLongNameB, ClassWithLongNameB.ProtectedStructType> >
    

    或者:

    Dictionary<ClassWithLongNameB, ClassWithLongNameB.ProtectedStructType>
    

    这就导致了一些冗长且难以阅读的方法定义。如果这是C++,我会通过使用一个TyPueFF使我的代码更可读,但在C语言中是不可用的。

    我知道我可以用 using 以类似于 typedef 在C++中 from reading this question 但是它对我来说不起作用有两个原因:

    1. 它只适用于一个源文件,我需要它来处理使用我的类和/或继承它的所有源文件。

    2. 如果模板参数之一是受保护或私有嵌套类型,则无法使用它(因为 使用 声明)我就是这样

    在这个问题上,我没有看到任何其他的答案,特别是对于我的问题来说,这似乎是一个很好的解决方案。

    还有什么其他的好方法可以解决这个问题?

    编辑:此问题不是的副本 this question 正如这条线索中的每一个答案都表明 使用 声明,我已经解释了为什么这不是我问题的适当答案。

    2 回复  |  直到 7 年前
        1
  •  3
  •   E. Moffat    7 年前

    正如我在评论中所建议的,您可以创建一个别名类,该类派生自非常复杂的类型名,这可以解决您的问题 using 别名仅应用于单个源文件。

    public class LongTypeAlias : Dictionary<ClassWithLongNameA, Dictionary<ClassWithLongNameB, ClassWithLongNameB.ProtectedStructType>>
    {
    }
    

    我将尝试介绍一些优点/缺点,但这些列表并不全面。

    效益:

    1. 解决眼前的问题:类型名现在变短了!(因为它是另一种类型)
    2. 应用于项目中的每个源文件(与 使用 别名)
    3. 允许您在声明中指定类型,而不是使用 var (如果这是您首选的编码样式)

    缺点:

    1. 如果你依靠思考,它可能不会像预期的那样起作用。
      • Alias类具有不同的 System.Type 比它实现的类型更重要,如果您曾经与 系统类型 物体
      • 潜在解决方案:避免直接与 系统类型 对象,并避免将它们用作字典中的键
    2. 代码可读性可能会受到影响
      • 根据您要覆盖的类型,您可能会丢失一些重要/有用的信息,这些信息指示类实际上是什么。
      • 潜在修复:全面/简洁地命名别名类型
    3. 由于表示同一对象的两种类型,项目可能无法维护。
      • 根据项目的编码标准,您可能会遇到名称空间污染、太多源文件或“为什么会出现这种情况”的一般混淆。
      • 潜在的修复方法:将别名类型放在单独的命名空间中,和/或将它们定义在与别名类相同的文件中。

    当然,这些都不包括 为什么? 首先,这些类型太长了。我鼓励您尝试重构您能够-resharper(甚至VS2017我认为)提供了许多优秀的工具,使重命名、提取类等非常容易。

        2
  •  2
  •   John Wu    7 年前

    用较短的名称对字典进行子类划分。你甚至不需要一具尸体。

    class ShortName : Dictionary<ClassWithLongNameB, ClassWithLongNameB.ProtectedStructType> {}
    

    然后可以用该类声明方法。

    public ShortName GetDictionary()
    {
        var dict = new ShortName();
        dict.Add
        (
            new ClassWithLongNameB(), 
            new ClassWithLongNameB.ProtectedStructType() 
        };
        return dict;
    }