이번에는 C#에서 열을 부분적으로 참조하는 법을 알아봅시다.


ArraySegment 를 이용하면 편리합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class TestClass
{
    /* 배열 참조하기 위한 정보가 들어있는 구조체이다.
     * 구조체 내부에는 
     * Array  : 버퍼를 참조하는 배열 변수.(제네릭으로 전달한 타입의 배열)
     * Offset : 그 배열의 참조 시작 위치를 알리는 int 형 변수
     * Count  : 몇개의 index를 참조하는지를 나타내는 int 형 변수.
    */
    ArraySegment<byte> _arraySegment;
    
    
    public void SetArray (byte[] inBuffer, int inOffset, int inCount)
    {
        _arraySegment = new ArraySegment<byte>(inBuffer, inOffset, inCount);
    }
 
    public void SetValue()
    {
        byte value = 0;
 
        // 참조한 배열의 시작 위치부터 참조의 끝까지 값을 세팅합니다.
        for (int i = _arraySegment.Offset; i < _arraySegment.Offset + _arraySegment.Count; ++i, ++value)
        {
            _arraySegment.Array[i] = value;
        }
    }
 
    public void ParintVluae()
    {
        // 참조한 배열의 시작 위치부터 참조의 끝까지 값을 출력합니다.
        for (int i = _arraySegment.Offset; i < _arraySegment.Offset + _arraySegment.Count; ++i)
        {
            Console.WriteLine(_arraySegment.Array[i]);
        }
    }
}
 
class Program
{
  
    static void Main(string[] args)
    {
        TestClass testClass = new TestClass();
        
        // 원본 버퍼를 생성한다.
        byte[] array = new byte[100];
 
        // 이렇게 할 경우 TestClass. _arraySegment는 array[50] 부터 10개만큼 참조한다.
        testClass.SetArray(array, 5010);
 
        testClass.SetValue();
 
        testClass.ParintVluae();
    }
 
cs


방법은 굉장히 간단합니다.


참조할려는 배열과 참조 시작 위치, 참조할 index의 갯수를 ArraySegment에 넘기면 됩니다.


사용할 때는 ArraySegment에 Offset과 Count를 활용해야합니다. 

*(TestClass. SetValue와 TestClass. PrintValue 참조)*


Offset : 참조 시작 위치.

Count : 참조 시작 위치 부터 몇개의 인덱스를 참조 할 것인가. 


*주의 할 점*

Offset과 Count를 잘 확인해서 배열의 참조한 부분보다 더 많은 부분을 접근하지 않도록 해야합니다.. 


만약 위 사항을 주의하지않고 다른 부분의 접근해버리면 다음과 같은 문제가 생깁니다.


1. 만약 배열의 크기가 넉넉하지 않고 잘못 접근한 부분이 배열의 할당된 것보다 크면 메모리 예외가 던져집니다. (따로 예외 처리를 안했을 경우 프로그램이 터져 버릴 수도 있습니다.)


2. 배열의 크기가 넉넉하더라고 만약 바로 잘못 접근한 부분을 다른 곳에서 참조하고있으면 그 부분의 원래 데이터가 회손될 수 있습니다.





'programing > C# Programming' 카테고리의 다른 글

C#Programming - Delegate  (0) 2019.10.07
C#Programming - C#의 예외처리(exception)  (0) 2019.09.23
C# Programming - C#에서의 배열 복사  (0) 2019.09.20

+ Recent posts