Start by enlisting the hierarchy...
First of all, there is a simple object. You can use it for any task. Like the one below,
object obj = new Object();
Then, there is a list of them, an array. What does it do? It holds a number of objects in it, right? Like the one below?
object[] objArray = { new Object(), "Strings allowed", 1234, 53.78 };
That is more like an array, where you might want to store a number of values. That is the user of arrays. Like the array of students, array of marks obtained and so on. So, where would you want to use a 2D array? A 2D array is used to store an array of array of objects.
object[,] objArrayofArray =
{
{ "Afzaal Ahmad Zeeshan", 20, 5.9 },
{ "Daniyal Ahmad Rizwan", 15, 5.4 },
{ "John Doe", 50, 6.0 }
};
What is that used for? To hold an array of array. The array is simply of the structure, to hold the name, age and height of the users. You can then access the values, like this,
class User {
public string Name { get; set; }
public int Age { get; set; }
public double Height { get; set; }
}
var users = new List<user>();
</user>
But where would you use 3D arrays is totally pointless. It would be just more painful, than being useful to you. So, in my opinion, you should consider leaving the arrays of fixed size and consider using the generic
List<>
[
^] objects. You can create List of List and so on. It also provides you with good performance and you can skip creating new arrays to store more objects as it can grow in size.
Reference articles for more on this:
Multidimenstional Arrays in C#[
^]
Dynamic Three Dimensional Arrays in C\C++\C#\Java[
^]