Computer >> 컴퓨터 >  >> 프로그램 작성 >> C#

배열은 C#에서 어떻게 작동합니까?

<시간/>

배열은 주어진 유형의 고정된 수의 요소를 나타냅니다. 요소는 연속적인 메모리 블록에 저장되며 요소의 인덱스를 알고 있는 한 요소에 매우 효율적으로 액세스할 수 있습니다.

배열을 선언하고 초기화하는 C# 구문은 다음과 같습니다 -

// create a string array to hold 5 languages
string[] languages = new string[3];

배열이 선언되면 배열의 제곱 표기법을 사용하여 배열의 항목을 채울 수 있습니다.

languages[0] = "csharp";
languages[1] = "visual basic";
languages[2] = "f#";

그러나 위의 두 단계를 단일 단계로 결합하는 간결한 대체 구문이 있습니다.

string[] languages = new string[] { "csharp", "visual basic", "f#" };

C#에서 암시적으로 유형이 지정된 변수를 사용하면 변수 이름의 왼쪽에 있는 유형을 제거하고 var만 사용할 수 있습니다.

var languages = new string[] { "csharp", "visual basic", "f#" };

동일한 제곱 표기법을 사용하여 배열의 모든 요소에 액세스할 수 있습니다.

string language = languages[0];
Console.WriteLine(language); // prints csharp

배열의 Length 속성은 해당 배열에 몇 개의 항목이 있는지 알려줍니다.

int count = languages.Length;
Console.WriteLine(count); // 3

배열이 생성되면 배열의 길이를 변경할 수 없다는 것을 기억하는 것이 중요합니다. 배열 범위 밖의 요소에 액세스하려고 하면 예외가 발생합니다.

string lang = languages[3]; // throws System.IndexOutOfRangeException

배열을 반복하려면 해당 언어에서 제공하는 for 또는 foreach 루프를 사용하세요.

// for loop
for (int i = 0; i < languages.Length; i++){
   string l = languages[i];
   Console.WriteLine(l); // prints the names of languages in sequence
}
// foreach loop
foreach (string l in languages){
   Console.WriteLine(l); // prints the names of languages in sequence
}

기본값

배열을 만들 때 C# 컴파일러는 요소를 기본값으로 초기화합니다. 예를 들어, 정수 배열을 생성하면 각 요소의 값이 0으로 설정됩니다.

var numbers = new int[3];
foreach (int num in numbers){
   Console.WriteLine(num); // prints 000
}

요소가 값 유형에 속할 때 유형의 각 구성원은 기본값으로 할당됩니다.

Point[] a = new Point[4];
int x = a[2].X;
Console.WriteLine(x); // prints 0
public struct Point { public int X, Y; }

그러나 참조 유형의 경우 컴파일러는 단순히 각 항목에 대해 null 참조를 생성합니다.

User[] u = new User[4];
int y = u[2].Y; // NullReference exception
public class User { public int X, Y; }

오류를 방지하려면 다음과 같이 각 항목을 명시적으로 초기화해야 합니다.

User[] users = new User[5];
for (int i = 0; i < users.Length; i++) // Iterate i from 0 to 999
users[i] = new User();

예시

using System;
class Program{
   static void Main(){
      string[] languages = new string[3]; // create a string array to hold 5 languages
      languages[0] = "csharp";
      languages[1] = "visual basic";
      languages[2] = "f#";
      string[] langugages_two = new string[] { "csharp", "visual basic", "f#" };
      var languages_three = new string[] { "csharp", "visual basic", "f#" };
      string language = languages[0];
      Console.WriteLine(language); // prints csharp
      int count = languages.Length; // 3
      Console.WriteLine(count);
      //string lang = languages[3]; // throws System.IndexOutOfRangeException
      // for loop
      for (int i = 0; i < languages.Length; i++){
         string l = languages[i];
         Console.WriteLine(l); // prints the names of languages in sequence
      }
      // foreach loop
      foreach (string l in languages){
         Console.WriteLine(l); // prints the names of languages in sequence
      }
      var numbers = new int[3];
      foreach (int num in numbers){
         Console.WriteLine(num); // prints 000
      }
      Point[] a = new Point[4];
      int x = a[2].X;
      Console.WriteLine(x); // prints 0
      User[] u = new User[4];
      //int y = u[2].Y; // NullReference exception
      User[] users = new User[5];
      for (int i = 0; i <users.Length; i++) // Iterate i from 0 to 999
      users[i] = new User();
   }
}
public struct Point { public int X, Y; }
public class User { public int X, Y; }

출력

csharp
3
csharp
visual basic
f#
csharp
visual basic
f#
0
0
0
0