> 백엔드 개발 > C#.Net 튜토리얼 > C#에서 하한이 0이 아닌 배열 구문 분석

C#에서 하한이 0이 아닌 배열 구문 분석

高洛峰
풀어 주다: 2016-11-08 10:10:41
원래의
2136명이 탐색했습니다.

배열에 대해 이야기할 때, 배열이 몇 번째부터 시작하는지 물으면 대부분의 프로그래머들은 배열이 당연히 0부터 시작한다고 직접 대답할 것으로 추정됩니다. 물론 이 대답은 맞습니다. 이제 C#에서 하한이 0이 아닌 배열을 살펴보겠습니다.

먼저 배열에 대한 관련 소개를 살펴보겠습니다.

1. 배열: 여러 데이터 항목을 컬렉션으로 처리할 수 있는 메커니즘입니다.

2. 배열 분류: CLR에서 배열은 1차원 배열, 다차원 배열, 인터리브 배열로 나눌 수 있습니다.

3. 배열 유형: 모든 배열은 추상 유형인 System.Array를 상속하고 이 유형은 System.Object를 상속하므로 해당 배열이 참조 유형임을 의미합니다.

배열을 생성할 때 배열 요소 외에도 배열 객체가 차지하는 메모리 블록에는 유형 객체 포인터, 동기화된 인덱스 블록 및 추가 멤버도 포함됩니다. 위의 배열 분류에서는 CLR이 인터리브 배열을 지원하므로 C#에서 인터리브 배열을 구현할 수 있습니다. 인터리브 배열은 인터리브 배열의 요소에 액세스한다는 의미입니다. 또는 다중 배열 액세스.

배열에 관련된 작업 중에 배열이 실제 매개변수로 메서드에 전달되면 실제로 전달되는 것은 배열에 대한 참조이므로 호출된 메서드가 배열의 요소를 수정할 수 있습니다. (수정을 원하지 않는 경우 배열의 복사본을 생성하여 이 복사본을 메서드에 전달해야 합니다.)

다음은 배열을 DataTable로 변환하는 메서드입니다.

       /// <summary>
        /// 整数型二维数组转换成DataTable
        /// </summary>
        /// <param name="intDyadicArray"></param>
        /// <param name="messageOut"></param>
        /// <param name="dataTableColumnsName"></param>
        /// <returns></returns>
        public DataTable DyadicArrayToDataTable(int[,] intDyadicArray, out string messageOut,
            params object[] dataTableColumnsName)
        {
            var returnDataTable = new DataTable();
            //验证列与所传入的字符是否相符
            if (dataTableColumnsName.Length != intDyadicArray.GetLength(1))
            {
                messageOut = "DataTable列数与二维数组列数不符,请调整列数";
                return returnDataTable;
            }
            //添加列
            for (var dataTableColumnsCount = 0;
                dataTableColumnsCount < dataTableColumnsName.Length;
                dataTableColumnsCount++)
            {
                returnDataTable.Columns.Add(dataTableColumnsName[dataTableColumnsCount].ToString());
            }
            //添加行
            for (var dyadicArrayRow = 0; dyadicArrayRow < intDyadicArray.GetLength(0); dyadicArrayRow++)
            {
                var addDataRow = returnDataTable.NewRow();
                for (var dyadicArrayColumns = 0;
                    dyadicArrayColumns < intDyadicArray.GetLength(1);
                    dyadicArrayColumns++)
                {
                    addDataRow[dataTableColumnsName[dyadicArrayColumns].ToString()] =
                        intDyadicArray[dyadicArrayRow, dyadicArrayColumns];
                }
                returnDataTable.Rows.Add(addDataRow);
            }
            //返回提示与DataTable
            messageOut = "DataTable成功转换";
            return returnDataTable;
        }
로그인 후 복사

위 정수 배열을 DataTable로 변환하는 연산 방법입니다. 바이트, 부동 소수점 및 기타 유형의 변환은 해당 매개 변수 유형을 수정하면 됩니다. 따라서 여기서는 자세히 소개하지 않겠습니다.

다음으로 "하한이 아닌 배열"에 대한 관련 지식을 자세히 살펴보겠습니다.

하한이 아닌 배열은 성능 측면에서 더 잘 최적화되지 않았기 때문에 , 일반적인 용도로는 사용되지 않습니다. 성능 손실이 중요하지 않거나 언어 간 이식이 필요한 경우 0이 아닌 배열 사용을 고려할 수 있습니다. 이름에서 알 수 있듯이 "0이 아닌 하한 배열"이라는 개념은 도입되지 않습니다.

C#에서 생성하려면 Array의 CreateInstance() 메서드를 사용하세요. 이 메서드에는 배열 요소 유형, 배열 차원, 각 차원의 하한 및 각 차원의 요소 수를 지정할 수 있는 여러 오버로드가 있습니다.

CreateInstance()를 호출할 때 배열에 메모리를 할당하고 매개변수 정보를 배열 메모리의 오버헤드 부분에 저장한 다음 배열에 대한 참조를 반환합니다.

다음으로 이 메서드의 기본 구현 코드를 살펴보겠습니다.

[System.Security.SecuritySafeCritical]  // auto-generated 
        public unsafe static Array CreateInstance(Type elementType, int length)
        { 
            if ((object)elementType == null)
                throw new ArgumentNullException("elementType");
            if (length < 0)
                throw new ArgumentOutOfRangeException("length", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); 
            Contract.Ensures(Contract.Result<Array>() != null);
            Contract.Ensures(Contract.Result<Array>().Length == length); 
            Contract.Ensures(Contract.Result<Array>().Rank == 1); 
            Contract.EndContractBlock();
  
            RuntimeType t = elementType.UnderlyingSystemType as RuntimeType;
            if (t == null)
                throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"),"elementType");
            return InternalCreate((void*)t.TypeHandle.Value,1,&length,null); 
        }
로그인 후 복사

위 코드를 본 후에는 0이 아닌 염기 생성에 대한 일반적인 이해가 있어야 합니다. Enaches() 메소드의 기본 코드를 자세히 살펴보겠습니다.

public static void Ensures(bool condition)
        {
            AssertMustUseRewriter(ContractFailureKind.Postcondition, "Ensures"); 
        }
로그인 후 복사
[SecuritySafeCritical]
        static partial void AssertMustUseRewriter(ContractFailureKind kind, String contractKind) 
        {
            if (_assertingMustUseRewriter) 
                System.Diagnostics.Assert.Fail("Asserting that we must use the rewriter went reentrant.", "Didn&#39;t rewrite this mscorlib?"); 
            _assertingMustUseRewriter = true;
            Assembly thisAssembly = typeof(Contract).Assembly;  
            StackTrace stack = new StackTrace(); 
            Assembly probablyNotRewritten = null;
            for (int i = 0; i < stack.FrameCount; i++) 
            { 
                Assembly caller = stack.GetFrame(i).GetMethod().DeclaringType.Assembly;
                if (caller != thisAssembly) 
                {
                    probablyNotRewritten = caller;
                    break;
                } 
            }
  
            if (probablyNotRewritten == null) 
                probablyNotRewritten = thisAssembly;
            String simpleName = probablyNotRewritten.GetName().Name; 
            System.Runtime.CompilerServices.ContractHelper.TriggerFailure(kind, Environment.GetResourceString("MustUseCCRewrite", contractKind, simpleName), null, null, null);
 
            _assertingMustUseRewriter = false;
        }
로그인 후 복사

0이 아닌 기본 배열 생성 방법에 대한 자세한 소개는 없습니다. 이를 사용해야 하는 경우 제공된 메소드 오버로드에 따라 해당 버전을 선택할 수 있습니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿