对象 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 并移至外部代码 明白(不像int
和string
等内在类型),类实例需要用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# 的二维数组的主要内容,如果未能解决你的问题,请参考以下文章