对象 C# 的二维数组

Posted

技术标签:

【中文标题】对象 C# 的二维数组【英文标题】:2D array of object C# 【发布时间】:2019-04-13 03:19:41 【问题描述】:

我知道,这个问题似乎被问了很多,但我仍然无法使用人们提供的解决方案来解决它。因此,在尝试使用二维对象数组时,我也遇到了异常“System.NullReferenceException:'对象引用未设置为对象的实例。'”。所以这是不工作的代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace Console_multi_fonctionnelle_basique
    
        partial class Program
        
             public class SudokuSolver
             
                 //Initialisation code
                 public SudokuSolver()
                 
                     GridValue[,] SudokuGrid = new GridValue[9, 9];
                     SudokuDisplay(SudokuGrid);
                     Console.ReadKey();
                
                //Store values for every slot
                class GridValue
                
                    public bool CanBe1  get; set;  = false;
                    public bool CanBe2  get; set;  = false;
                    public bool CanBe3  get; set;  = false;
                    public bool CanBe4  get; set;  = false;
                    public bool CanBe5  get; set;  = false;
                    public bool CanBe6  get; set;  = false;
                    public bool CanBe7  get; set;  = false;
                    public bool CanBe8  get; set;  = false;
                    public bool CanBe9  get; set;  = false;
                    public bool AlreadySolved  get; set;  = false;
                    public int Value  get; set;  = 0;
                
                //Display the grid
                void SudokuDisplay(GridValue[,] Sudoku)
                
                    Sudoku[1, 1].Value = 1;
                    Sudoku[1, 2].Value = 2;
                    Console.WriteLine(Sudoku[0, 0].Value + Sudoku[1,0].Value);
                
                //To Do
                //Ask the values for every slot
                //Verify if the slot can contain a number
                //Choose the most appropriated number for the slot
                //End the program after user pressing an key
            
        
    

所以,如您所见,我想使用大小为 9x9 的“GridValue”类的 2D 数组,以便每个“Grid slot”都有自己的变量,以便以后解决数独问题。但是程序看起来不理解我的数组包含“GridValue”对象所以他似乎不理解每个数组值都包含多个变量......所以我想要的结果是我可以为其中一个对象定义变量数组没有异常。

【问题讨论】:

请添加外部代码,必须删除构造函数的 ll 2-3 并移至外部代码 明白(不像intstring等内在类型),类实例需要用new关键字初始化。 GridValue[,] SudokuGrid = new GridValue[9, 9]; 将简单地为您分配一个二维数组,其所有元素都将未初始化。您需要为网格的每个元素执行SudokuGrid[0, 0] = new GridValue() 之类的操作。 数组在 c# 中基于零。第一个元素是 Sudoku[0,0] 而不是 Sudoku[1,1]。您没有设置 [0,0],因此它仍然为空,但您在写入值时尝试访问它。 为了进一步阐明 dotNET 的答案:对于未初始化的值,使用默认值。 int 的默认值为 0,字符串的默认值为 null,任何类的默认值也是 null。=> 当您尝试访问 Sudoku[0,0].Value 处的未初始化值时,该值具有类的默认值 null,它返回一个 NullReferenceException。 GridValue[,] SudokuGrid = new GridValue[9, 9]; 初始化数组但不初始化数组的元素。因此,当您尝试访问数组的元素时,您会得到 null。您需要先初始化数组的元素,然后才能设置它们的属性。 【参考方案1】:

我希望这个例子可以帮助你理解 OOP。欢迎加入社区!

using System;

namespace ConsoleApp1

    internal class Program
    
        private static void Main(string[] args)
        
            Console.WriteLine("Hello World!");

            SudokuSolver sudokuSolver = new SudokuSolver(9, 9);

            sudokuSolver.DisplayGrid();

            Console.ReadKey();
        
     


    public class SudokuSolver
    
        //Store every values needed for every "slot"
        public class GridValue
        
            public bool CanBe1  get; set;  = false;
            public bool CanBe2  get; set;  = false;
            public bool CanBe3  get; set;  = false;
            public bool CanBe4  get; set;  = false;
            public bool CanBe5  get; set;  = false;
            public bool CanBe6  get; set;  = false;
            public bool CanBe7  get; set;  = false;
            public bool CanBe8  get; set;  = false;
            public bool CanBe9  get; set;  = false;
            public bool AlreadySolved  get; set;  = false;
            public int Value  get; set;  = 0;
        

        public GridValue[,] SudokuGrid  get; 

        //Code d'initialisation
        public SudokuSolver(int x, int y)
         
            // only initialize in the constructor, no calls
            SudokuGrid = new GridValue[x, y]; // the array exists now in mem, but each entry is pointing to null
            for (int i = 0; i < x; i++)
            
                for (int j = 0; j < y; j++)
                
                    SudokuGrid[i, j] = new GridValue();
                
            
        



        //Display the grid => then name it that way!
        public void DisplayGrid()
        
            SudokuGrid[1, 1].Value = 1;
            SudokuGrid[1, 2].Value = 2;
            Console.WriteLine(SudokuGrid[0, 0].Value + SudokuGrid[1, 0].Value);
        


     


【讨论】:

如果一切正常并且您认为这是正确的答案,请在 SO 中标记它【参考方案2】:

您已经创建了一个空数组,因此当您尝试访问一个元素时,会引发异常。 初始化数组的元素,你应该没问题。

public class SudokuSolver

    //Initialisation code
    public SudokuSolver()
    
        GridValue[,] SudokuGrid = new GridValue[9, 9];

    //###################

        for (int r=0; r < 9; r++) 
         
            for (int c = 0; c < 9; c++) 
             
                SudokuGrid[r, c] = new GridValue(); 
             
        

    //###################

        SudokuDisplay(SudokuGrid);
        Console.ReadKey();
    
    //Store values for every slot
    class GridValue
    
        public bool CanBe1  get; set;  = false;
        public bool CanBe2  get; set;  = false;
        public bool CanBe3  get; set;  = false;
        public bool CanBe4  get; set;  = false;
        public bool CanBe5  get; set;  = false;
        public bool CanBe6  get; set;  = false;
        public bool CanBe7  get; set;  = false;
        public bool CanBe8  get; set;  = false;
        public bool CanBe9  get; set;  = false;
        public bool AlreadySolved  get; set;  = false;
        public int Value  get; set;  = 0;
    
    //Display the grid
    void SudokuDisplay(GridValue[,] Sudoku)
    
        Sudoku[1, 1].Value = 1;
        Sudoku[1, 2].Value = 2;
        Console.WriteLine(Sudoku[0, 0].Value + Sudoku[1, 0].Value);
    
    //To Do
    //Ask the values for every slot
    //Verify if the slot can contain a number
    //Choose the most appropriated number for the slot
    //End the program after user pressing an key

【讨论】:

以上是关于对象 C# 的二维数组的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C# 中的二维对象数组中取回大小?

使用 C# 将对象映射到二维数组

在 Excel C# 范围内写入一个二维对象数组

如何在 C# 中为 Matrix 类初始化二维数组

使用 Class 对象创建通用二维数组

C#二维数组的介绍