【问题标题】:Code snippet: create an "alias" for something else代码片段:为其他东西创建一个“别名”
【发布时间】:2013-09-03 12:35:12
【问题描述】:

我一直在寻找一种类似的方法来为使用预处理器在 C 中可能的其他东西创建别名(this 问题有点相似,在那里找不到任何有用的东西)。

这就是问题所在:我有一个接收数组的方法,但是数组的每个位置都有特定的含义,就像它们具有特定名称的不同参数一样。我想要做的是通过使用这些特定名称使我的代码更易于阅读(和编写),但另一方面,我不想创建另一个方法调用(如示例 1 中)或分配数组位置到新变量(示例 2),因为性能至关重要。

示例 1:

    void OriginalMethodSignature(Type[] values)
    {
        SimplifiedMethod(values[0], values[1], ... values[n]);
    }

    void SimplifiedMethod(Type specificName1, Type specificName2, ... Type specificNameN)
    {
        // simple implementation using specific names instead of values[n]
    }

示例 2:

    void OriginalMethodSignature(Type[] values)
    {
        Type specificName1 = values[0];
        Type specificName2 = values[1];
        ...
        Type specificNameN = values[n];
        // simple implementation using specific names instead of values[n]
    }

我无法更改方法签名,因为它在委托中使用,Type 是固定的。

下一个例子稍微好一点,但仍然不是最佳的:

    void OriginalMethodSignature(Type[] values)
    {
        // implementation using values[specificName1] ... values [specificNameN]
    }
    const int specificName1 = 0;
    const int specificName2 = 1;
    ...
    const int specificNameN = n-1;

有没有办法为此目的创建一个 sn-p?如果有,会怎样?

【问题讨论】:

  • 能否为每个索引创建一个私有枚举,然后说values[(int)MyEnum.FirstValue]
  • 是的,这总比没有好,我也想出了这个,就像我刚刚发布的编辑一样。
  • 不开始争论,但Enums 就像goto。适用于非常特定的用例,但通常是代码气味。
  • 我建议您从易于阅读的方法开始,运行分析器,并专注于改进整个代码中最慢的部分(不仅仅是阅读您的 Type[] 的代码)。

标签: c# code-snippets


【解决方案1】:

没有任何内置的方法可以做你不想做的事情,因为你根本不应该这样做。您应该使用具有属性的对象而不是数组。

无论如何,你可以制作一个封装数组的对象,让属性使用数组作为存储:

public class NamedObject {

  private Type[] _values;

  public NamedObject(Type[] values) {
    _values = values;
  }

  public SpecificName1 { get { return _values[0]; } set { _values[0] = value; } }
  public SpecificName2 { get { return _values[1]; } set { _values[1] = value; } }
  public SpecificName3 { get { return _values[2]; } set { _values[2] = value; } }
  public SpecificName4 { get { return _values[3]; } set { _values[3] = value; } }
  public SpecificName5 { get { return _values[4]; } set { _values[4] = value; } }
  public SpecificName6 { get { return _values[5]; } set { _values[5] = value; } }

}

现在你可以使用对象来访问数组了:

void OriginalMethodSignature(Type[] values) {
  NamedObject obj = new NamedObject(values);
  // get a value
  Type x = obj.SpecificName4;
  // set a value
  obj.SpecificName2 = x;
}

【讨论】:

  • 好吧,不要解决我的问题,但正如它所说的“没有任何内置方法可以做你想做的事” - 这是正确的答案
【解决方案2】:

创建一个专用的classstruct,并将数组解析到其中。

public class MyClassOfStuff
{
    Type SpecificName1 {get;set;}

    Type SpecificName2 {get;set;}

    public static MyClassOfStuff Parse(Type[] value)
    {
        Type specificName1 = values[0];
        Type specificName2 = values[1];
        ...
        Type specificNameN = values[n];
    }
}

 void OriginalMethodSignature(Type[] values)
{
    var mystuff = MyClassOfStuff.Parse(values);
}

【讨论】:

  • 当然可以,但会影响性能,这就是我要避免的...我正在寻找一些处理器时间重命名(我不知道我是否足够清楚,而不是我的母语)
  • 当你在 .NET 中编码时,你的大脑需要停止思考 C —— 它已经足够快了 :)
  • 我部分同意@STW,我通常假设,当我只需要清晰易读的代码时,但在这种特定情况下性能非常关键,这是一种优化数值方法,我想我会使用枚举或常量定义,它会更快,而且读起来还是有点好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 2018-10-28
  • 2018-02-12
  • 1970-01-01
相关资源
最近更新 更多