C#中下限非零的數組解析

來源:互聯網
上載者:User
談到數組時,當被問及數組是從什麼數開始時,估計大部分程式員都會直接說出數組當然是從0開始的。這個回答當然沒有錯,現在我們就來瞭解一下C#中的下限非0的數組。

首先看一下數組的相關介紹:

1.數組:是允許將多個資料項目當作一個集合來處理的機制。

2.數組的分類:在CLR中,數組可分為一維數組,多維陣列,交錯數組。

3.數組的類型:由於所有的數組都是繼承自System.Array這個抽象類別型,而這個類型又是繼承自System.Object,這就說明數組是參考型別。

在建立數組時,除了有數組元素,數組對象佔據的記憶體塊還包含一個類型對象指標,一個同步索引塊和一個額外的成員。上面對數組的分類中提到“交錯數組”,由於CLR支援交錯數組,所以在C#中可以實現交錯數組,交錯數組即由數組構成的數組,在訪問交錯數組的元素意味著必須進行兩次或多次數組訪問。

在對數組進行相關操作的過程中,數組作為實參傳給一個方法時,實際傳遞的是對該數組的引用,因此被調用的方法能夠修改數組中的元素。(如果不想被修改,必鬚生成數組的一個拷貝,並將這個拷貝傳給方法。)

下面介紹一種將數組轉化為DataTable的方法:

       ///         /// 整數型二維數群組轉換成DataTable        ///         ///         ///         ///         ///         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() != null);            Contract.Ensures(Contract.Result().Length == length);             Contract.Ensures(Contract.Result().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()方法的底層代碼:

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

有關非零基數組的建立方法就不做深入的介紹,如果需要使用,可以根據提供的方法重載選擇對應的版本實現。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.