首页 未命名正文

linux编程_C#中下限非零的数组剖析

云返利网 未命名 2020-05-26 09:06:45 12 0

谈到数组时,当被问及数组是从什么数最先时,估量大部门程序员都市直接说出数组固然是从0最先的。这个回覆固然没有错,现在我们就来领会一下C#中的下限非0的数组。
  首先看一下数组的相关先容:
      1.数组:是允许将多个数据项看成一个聚集来处置的机制。
      2.数组的分类:在CLR中,数组可分为一维数组,多维数组,交织数组。
      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的操作方式,至于其他类型,如字节,浮点型等类型的转化,修改相关参数即可,也可将参数类型举行对应的修改,这里就不做详细先容了。
    接下来我们详细来领会一下“下限非零数组”的相关知识:
      下限非零数组由于在性能上没有做更好的优化,因此在一样平常的使用中会较少,若是不计较性能损失或者需要跨语言移植,可以思量使用非零数组。“下限非零数组”的观点就不做先容,正如其名称所见。
      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); 
        }

  看到以上的代码,应该对非零基数组的建立有一个大致领会,接下来详细看一下Ensures()方式的底层代码:
1234 public static void Ensures(bool condition)
        {
            AssertMustUseRewriter(ContractFailureKind.Postcondition, "Ensures"); 
        }

1234567891011121314151617181920212223242526 [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'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;
        }

【关于云返利网】

云返利网是阿里云、腾讯云、华为云产品推广返利平台,在各个品牌云产品官网优惠活动之外,云返利网还提供返利。您可以无门槛获得阿里云、华为云、腾讯云所有产品返利,在官网下单后就可以领取,无论是自己用、公司用还是帮客户采购,您个人都可以获得返利。云返利网的目标是让返利更多、更快、更简单!详情咨询13121395187(微信同号)