【问题标题】:C# Class get returning two dimensional arrayC#类获取返回二维数组
【发布时间】:2015-05-03 03:54:49
【问题描述】:

我在理解如何使用 get 从我的类中获取二维数组时遇到了一些麻烦。

这是我的班级目前的样子:

class Something
{
  private int[,] xArray;

  public Something()
  {
    xArray = new int[var1, var2];

    for (int row = 0; row < xArray.Getlength(0); row++)
      for (int col = 0; col < xArray.GetLength(1); col++)
        xArray[row, col] = someInt;
  }

  public int[,] XArray
  {
    get { return (int[,])xArray.Clone(); }
  }
}


class Main
{
  Something some;

  public void writeOut()¨
  {
    some = new Something();

    for (int row = 0; row < some.XArray.GetLength(0); row++)
      for (int col = 0; col < some.XArray.GetLength(1); col++)
        Console.Write(some.XArray[row, col].ToString());
  }
}

当我使用调试器检查时,xArray 具有Something 类中应有的所有值,但它在Main 类中没有值,它只获取数组的大小。我做错了什么?

【问题讨论】:

  • 这一行中var1, var2 的值是多少xArray = new int[var1, var2]; 你是否使用调试器单步执行代码...?
  • 您似乎在 Console.Write 语句中缺少some.,但我怀疑这是您的问题,因为您的代码不应该在编译时出现该错误。也许您应该将此示例充实到一个完整的程序中,以便我们可以准确地重现您的错误。另请注意,您正在克隆数组 2 + var1 * var2 次,因为每次在 writeOut 方法中调用 XArray 属性时都会克隆它。
  • 旁注:返回数组的副本对于预期用途来说是错误的......
  • 我试图为您的问题创建fiddle。我看不出有什么问题。 (虽然我使用的是实际值)
  • @Rockyy 很高兴。是的,正如人们在这里提到的那样,每次调用XArray 时,您都在创建一个克隆。考虑将数组存储到局部变量中。

标签: c# arrays oop


【解决方案1】:

C# Copy Array by Value

据我了解,数组上的克隆副本不会应用于您的元素。您必须手动完成。它建议做一个克隆的扩展,让你管理深拷贝。

【讨论】:

  • 可能是我听错了,没完全理解你说的内容,但是这不是比应该的难吗?我只想从另一个类的二维数组中访问数字。不知道要不要用复制哈哈
【解决方案2】:

想出了这个片段,它在控制台中写出一百个“1”,这意味着测试人员(您的“主要”)确实看到了正确的值。

老实说,我不知道您的问题是什么,因为我们没有看到您的整个代码。除非您发布整个解决方案,否则您必须弄清楚自己。您发布的代码确实按照您所说的方式工作。

长话短说:我添加了运行所需的部分,它不仅可以运行,而且没有显示任何错误。您可能希望将您的代码与下面的代码进行比较。

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        tester.writeOut();
    }
}


class Something
{
    private int firstDimensionLenght = 10;
    private int secondDimensionLenght = 10;

    private int[,] xArray;

    public Something()
    {
        xArray = new int[firstDimensionLenght, secondDimensionLenght];

        for (int row = 0; row < xArray.GetLength(0); row++)
            for (int col = 0; col < xArray.GetLength(1); col++)
                xArray[row, col] = 1;
    }

    //Add some intellisence information stating you clone the initial array
    public int[,] XArrayCopy
    {
        get { return (int[,])xArray.Clone(); }
    }
}

class tester
{
    static Something some;

    //We dont want to initialize "some" every time, do we? This constructor
    //is called implicitly the first time you call a method or property in tester
    static tester(){
        some = new Something()
    }

    //This code is painfuly long to execute compared to what it does
    public static void writeOut()
    {
        for (int row = 0; row < some.XArrayCopy.GetLength(0); row++)
            for (int col = 0; col < some.XArrayCopy.GetLength(1); col++)
                Console.Write(some.XArrayCopy[row, col].ToString());
    }

    //This code should be much smoother
    public static void wayMoreEfficientWriteOut()
    {
        int[,] localArray = some.XArrayCopy();

        for (int row = 0; row < localArray.GetLength(0); row++)
            for (int col = 0; col < localArray.GetLength(1); col++)
                Console.Write(localArray[row, col].ToString());
    }

}


}

【讨论】:

  • 是的,正确,谢谢!我在分配变量时犯了一个错误,但我也想知道这是否是我想要的正确方法。
  • 告诉我们“Something”类必须做什么,然后我们可能会给你一条路径。您很可能不想克隆阵列,但只要我们不知道您的基本意图,就很难判断您应该做什么。我会确保我阅读了对您问题的任何编辑。只要确保你不要同时问两个问题,“哲学”问题可能应该发布在“程序员”或“代码审查”上,具体取决于问题的性质。
  • 哦,好的。我只想访问“Something”中二维数组中的变量。仅此而已。
  • 如果您不关心谁可以修改这些值,您可能想试一试:get { return xArray; }。它会返回一个指向你的数组的指针,这是做你想做的最直接的方法。
  • 是的,我不在乎。但如果我这样做了,Clone() 会是正确的方法吗?
猜你喜欢
  • 2012-04-12
  • 1970-01-01
  • 2021-12-24
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多