C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
Part 1: We see array initializers for one-dimensional int arrays. The first 2 array initializers are equivalent.
Part 2: We create string arrays with initializers. For array 5, we create a 2D array with 2 columns and 2 rows.
2D ArrayPart 3: We print the arrays to the screen. We display ranks (the number of dimensions) of the arrays.
Important: Array initializers compile to the same instructions as direct assignments to populate arrays.
C# program that uses array initializers
using System;
class Program
{
static void Main()
{
// Part 1: declare arrays with curly brackets.
// ... It is allowed to omit the type.
int[] array1 = { 1, 2, 3 };
int[] array2 = new int[] { 1, 2, 3 };
// Part 2: use array initializations with strings.
// ... We can specify two-dimensional arrays.
// ... We can use empty arrays.
string[] array3 = { "dot", "net", "Codex" };
string[] array4 = new string[] { "DOT", "NET", "PERLS", null };
string[,] array5 = { { "dot", "Codex" },
{ "framework", "4.0" } };
string[] array6 = { };
// Part 3: print the length and ranks.
Console.WriteLine("array1: {0} length", array1.Length);
Console.WriteLine("array2: {0} length", array2.Length);
Console.WriteLine("array3: {0} length", array3.Length);
Console.WriteLine("array4: {0} length", array4.Length);
Console.WriteLine("array5: {0} length, {1} rank",
array5.Length, array5.Rank);
Console.WriteLine("array6: {0} length, {1} rank",
array6.Length, array6.Rank);
}
}
Output
array1: 3 length
array2: 3 length
array3: 3 length
array4: 4 length
array5: 4 length, 2 rank
array6: 0 length, 1 rank
Static: We use 2 static methods, which save no state, and which receive strongly-typed arrays. The values they initialize are hard-coded.
StaticTip: We can modify the methods to receive a second parameter, the value we want to initialize to. Extension methods could be used.
ExtensionC# program that initializes arrays
using System;
class Program
{
static void Main()
{
// Initialize an array of -1 integers.
int[] arr1 = new int[10];
InitIntArray(arr1);
foreach (int i in arr1)
{
Console.Write(i);
}
Console.WriteLine();
// Initialize an array of space chars.
char[] arr2 = new char[5];
InitCharArray(arr2);
foreach (char c in arr2)
{
Console.Write(c);
}
Console.WriteLine();
}
/// <summary>
/// Initialize array to -1
/// </summary>
static void InitIntArray(int[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
arr[i] = -1;
}
}
/// <summary>
/// Initialize array to ' '
/// </summary>
static void InitCharArray(char[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
arr[i] = ' ';
}
}
}
Output
-1-1-1-1-1-1-1-1-1-1
Tip: This style of code is often called list comprehension. We specify an entire array in a single declaration.
Style: Each style of code suits different developers and teams. I tend to use the more standard loop style with for.
C# program that uses Enumerable
using System;
using System.Linq;
class Program
{
static void Main()
{
// Initialize an array of -1 integers.
int[] arr1 = Enumerable.Repeat(-1, 10).ToArray();
foreach (int i in arr1)
{
Console.Write(i);
}
Console.WriteLine();
// Initialize an array of space chars.
char[] arr2 = Enumerable.Repeat(' ', 5).ToArray();
foreach (char c in arr2)
{
Console.Write(c);
}
Console.WriteLine();
}
}
Output
-1-1-1-1-1-1-1-1-1-1
C# program that uses Range
using System;
using System.Linq;
class Program
{
static void Main()
{
// Initialize array of 5 sequential integers.
int[] arr1 = Enumerable.Range(5, 5).ToArray();
foreach (int i in arr1)
{
Console.WriteLine(i);
}
}
}
Output
5
6
7
8
9
Version 1: This code creates a new int array with 100 elements, and then initializes each element with a for-loop.
Int ArrayVersion 2: Here we call Enumerable.Repeat and then convert to an array with the ToArray extension method.
ToArrayResult: We find Enumerable to be much slower than a for-loop and direct allocation. This could be relevant in a program.
C# program that benchmarks Enumerable.Repeat, ToArray
using System;
using System.Diagnostics;
using System.Linq;
class Program
{
const int _max = 1000000;
static void Main()
{
// Version 1: initialize with for-loop.
var s1 = Stopwatch.StartNew();
for (int i = 0; i < _max; i++)
{
int[] array = new int[100];
InitArray(array);
}
s1.Stop();
// Version 2: use Enumerable.Repeat.
var s2 = Stopwatch.StartNew();
for (int i = 0; i < _max; i++)
{
int[] array = Enumerable.Repeat(-1, 100).ToArray();
}
s2.Stop();
Console.WriteLine(((double)(s1.Elapsed.TotalMilliseconds * 1000000) /
_max).ToString("0.00 ns"));
Console.WriteLine(((double)(s2.Elapsed.TotalMilliseconds * 1000000) /
_max).ToString("0.00 ns"));
}
static void InitArray(int[] array)
{
// Use for-loop.
for (int i = 0; i < array.Length; i++)
{
array[i] = -1;
}
}
}
Output
64.97 ns for-loop
825.06 ns Enumerable.Repeat, ToArray
So: For this reason, performance of array initializers is equivalent in programs. The only difference is the source text.
Tip: Please see chapter 12 in The C# Programming Language Specification third edition.
Note: CreateInstance does not initialize the array to any special value (the default value is used). It only allocates (creates) the array.
Array.CreateInstance