【问题标题】:Accessor of array elements in C# errorC# 错误中数组元素的访问器
【发布时间】:2013-01-25 22:12:16
【问题描述】:

我的班级中有两个数组,并尝试通过以下方式访问它们。第一个适用于 theta,但第二个无法为 delta_theta 编译。不使用这个做第二个数组的正确方法是什么?

错误表示:错误 1 ​​错误的数组声明符:要声明托管数组,排名说明符位于变量标识符之前。要声明一个固定大小的缓冲区字段,请在字段类型之前使用 fixed 关键字。

protected double[] theta = null;
protected double[] delta_theta = null;
public double this[int index] {
        get { return theta[index]; }
        set { theta[index] = value; }
}
public double Delta_Theta[int index]
{
        get { return delta_theta[index]; }
        set { delta_theta[index] = value; }
}

【问题讨论】:

  • 您能告诉我们编译器会抛出什么错误吗?

标签: c# arrays accessor


【解决方案1】:

您不能在纯 C# 代码中为索引器指定名称,也不能创建多个具有相同参数类型的索引器并通过名称区分它们。

您可以通过DefaultMemberAttribute 为要使用的其他 语言(支持命名索引器)指定一个名称,但您不能自己使用该名称。 (COM 组件除外,然后仅在 C# 4 及更高版本中。)

相反,您必须公开某种类型的属性,该类型本身会公开相关的索引器。现在,如果您想要获取和设置,您可以将数组公开为只读属性,可能是IList<double>

// Names changed to be more conventional
public IList<double> DeltaTheta
{
    get { return deltaTheta; }
}

那么客户端仍然可以使用:

foo.DeltaTheta[10] = 5.5;

例如。

对于只读版本,您可以公开ReadOnlyCollection&lt;double&gt;

public ReadOnlyCollection<double> DeltaTheta
{
    get { return new ReadOnlyCollection<double>(deltaTheta); }
}

或者为了避免每次都这样做,您可以为包装器设置一个字段:在构造函数中对其进行初始化,然后每次都返回相同的包装器引用。

【讨论】:

  • 那么设置和获取 delta_theta 中每个单独元素的值的正确方法是什么?
【解决方案2】:

你可以创建一个包装索引器:

protected double[] theta = null;
protected double[] delta_theta = null;

public double this[int index] {
        get { return theta[index]; }
        set { theta[index] = value; }
}

public Indexer DeltaTheta { 
      // can be optimized according to delta_theta lifecycle
      get {return new Indexer(delta_theta);} 
}

// internal indexere wrapper
public class Indexer{
      double [] _data;
      public DoubleIndexer(double[] data ){   
          _data = data;
      }

      public double this[int index] {
            get { return _data[index]; }
            set { _data[index] = value; }
      }
}

并像这样使用:

obj[2]               // -> theta[2]
obj.DeltaTheta[5]    // -> delta_theta[5]

【讨论】:

    【解决方案3】:

    在同一个类中无法做到这一点 - 索引器必须采用 this(arguments) 形式,因此您不能有 2 个使用相同类型的索引。

    您可以做的是创建内部类,以将索引重定向到您的数组并使Delta_Theta 返回此类。

    public IndexRedirector Delta_Theta 
    { 
      get { return new IndexRedirector { RedirectedArray:delta_theta }; 
    }
    
    class IndexRedirector
    { 
      public double[] RedirectedArray;
      public double this[int index] {
        get { return RedirectedArray[index]; }
        set { RedirectedArray[index] = value; }
      }
    }
    

    【讨论】:

    • .net 4 中的新功能吗?编译器在 Array:delta_theta 上报告错误
    • @Yang,不...只是我这边的名字选择不好-更新...仍然没有尝试编译...你得到了乔恩的答案-可以忽略这个一个:)。
    猜你喜欢
    • 2016-10-01
    • 1970-01-01
    • 2015-01-09
    • 2012-11-26
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多