zoukankan      html  css  js  c++  java
  • System.Array与string[], int[]的区别及用途

    经常用string[], int[]这些数组, 今天偶然发现还有一个System.Array类, 它的声明如下:

    public abstract class Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable

    看来它是一个抽象类.

    查一下msdn, 发现它的用途如下:

    "提供创建、操作、搜索和排序数组的方法,因而在公共语言运行时中用作所有数组的基类。"
    "Array 类是支持数组的语言实现的基类。但是,只有系统和编译器能够从 Array 类显式派生。用户应当使用由语言提供的数组构造。"

    自己写代码试了一下, 确实如上所述, 不能继承Array这个抽象类,

    Array的使用方法举例:

                Array abc = Array.CreateInstance(typeof(string), 3);
                abc.SetValue("lzd1", 0);
                abc.SetValue("lzd2", 1);
                abc.SetValue("lzd3", 2);
                for (int i = 0; i < abc.Length; i++)
                {
                    Console.WriteLine(abc.GetValue(i));
                }

    看这代码,觉得和string[], int[]的本质是一样的,就是繁琐些,难怪msdn说它是所有数组的基类,但是用refactor翻译一段string[],int[]的代码,发现编译后并不翻译成Array,不知道内部它们之间是怎么转换的,先不管这也罢,反正最重要的思考一下Array的作用和用途在哪里?毕竟直接定义的数组比Array.CreateInstance()要简单得多。

    试一下就可以明白,直接定义的数组不支持排序等操作,如果定义了string[], int[],想要排序,就可以用Array抽象类中的Sort方法了,我想,这是它很有用的一点了。

                string[] def = new string[] { "lzd7", "lzd5", "lzd6" };
                for (int i = 0; i < def.Length; i++)
                {
                    Console.WriteLine(def[i]);
                }
                Array.Sort(def);
                for (int i = 0; i < def.Length; i++)
                {
                    Console.WriteLine(def[i]);
                }

    推荐资料:
    1.C#:System.Array简单使用。
    http://hi.baidu.com/yehaizi_2008/blog/item/dd57aada9a8ff4d7b6fd4880.html
    2.Array 类

    http://msdn.microsoft.com/zh-cn/library/system.array.aspx

    3.用refactor得到Array类的源代码如下, 方法都折叠未展开: 

    [Serializable, ComVisible(true)]
    public abstract class Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable
    {
        // Methods
        internal Array();
        public static ReadOnlyCollection<T> AsReadOnly<T>(T[] array);
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        public static int BinarySearch<T>(T[] array, T value);
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        public static int BinarySearch(Array array, object value);
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        public static int BinarySearch(Array array, object value, IComparer comparer);
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        public static int BinarySearch<T>(T[] array, T value, IComparer<T> comparer);
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        public static int BinarySearch(Array array, int index, int length, object value);
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        public static int BinarySearch<T>(T[] array, int index, int length, T value);
        [SecuritySafeCritical, ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        public static int BinarySearch<T>(T[] array, int index, int length, T value, IComparer<T> comparer);
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail), SecuritySafeCritical]
        public static int BinarySearch(Array array, int index, int length, object value, IComparer comparer);
        [MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical, ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        public static extern void Clear(Array array, int index, int length);
        [SecuritySafeCritical]
        public object Clone();
        internal static int CombineHashCodes(int h1, int h2);
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), SecuritySafeCritical]
        public static void ConstrainedCopy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length);
        public static TOutput[] ConvertAll<TInput, TOutput>(TInput[] array, Converter<TInput, TOutput> converter);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail), SecuritySafeCritical]
        public static void Copy(Array sourceArray, Array destinationArray, int length);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Copy(Array sourceArray, Array destinationArray, long length);
        [SecuritySafeCritical, ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Copy(Array sourceArray, long sourceIndex, Array destinationArray, long destinationIndex, long length);
        [MethodImpl(MethodImplOptions.InternalCall), SecurityCritical, ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        internal static extern void Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length, bool reliable);
        public void CopyTo(Array array, int index);
        [ComVisible(false)]
        public void CopyTo(Array array, long index);
        [SecuritySafeCritical]
        public static Array CreateInstance(Type elementType, int length);
        public static Array CreateInstance(Type elementType, params long[] lengths);
        [SecuritySafeCritical]
        public static Array CreateInstance(Type elementType, params int[] lengths);
        [SecuritySafeCritical]
        public static Array CreateInstance(Type elementType, int length1, int length2);
        [SecuritySafeCritical]
        public static Array CreateInstance(Type elementType, int[] lengths, int[] lowerBounds);
        [SecuritySafeCritical]
        public static Array CreateInstance(Type elementType, int length1, int length2, int length3);
        public static bool Exists<T>(T[] array, Predicate<T> match);
        public static T Find<T>(T[] array, Predicate<T> match);
        public static T[] FindAll<T>(T[] array, Predicate<T> match);
        public static int FindIndex<T>(T[] array, Predicate<T> match);
        public static int FindIndex<T>(T[] array, int startIndex, Predicate<T> match);
        public static int FindIndex<T>(T[] array, int startIndex, int count, Predicate<T> match);
        public static T FindLast<T>(T[] array, Predicate<T> match);
        public static int FindLastIndex<T>(T[] array, Predicate<T> match);
        public static int FindLastIndex<T>(T[] array, int startIndex, Predicate<T> match);
        public static int FindLastIndex<T>(T[] array, int startIndex, int count, Predicate<T> match);
        public static void ForEach<T>(T[] array, Action<T> action);
        [MethodImpl(MethodImplOptions.InternalCall), SecurityCritical, ForceTokenStabilization, ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        internal extern int GetDataPtrOffsetInternal();
        public IEnumerator GetEnumerator();
        [MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical]
        public extern int GetLength(int dimension);
        [ComVisible(false)]
        public long GetLongLength(int dimension);
        [MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), SecuritySafeCritical]
        public extern int GetLowerBound(int dimension);
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        private static int GetMedian(int low, int hi);
        [MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), SecuritySafeCritical]
        public extern int GetUpperBound(int dimension);
        [SecuritySafeCritical]
        public object GetValue(int index);
        [SecuritySafeCritical]
        public object GetValue(params int[] indices);
        [ComVisible(false)]
        public object GetValue(long index);
        [ComVisible(false)]
        public object GetValue(params long[] indices);
        [SecuritySafeCritical]
        public object GetValue(int index1, int index2);
        [ComVisible(false)]
        public object GetValue(long index1, long index2);
        [SecuritySafeCritical]
        public object GetValue(int index1, int index2, int index3);
        [ComVisible(false)]
        public object GetValue(long index1, long index2, long index3);
        public static int IndexOf<T>(T[] array, T value);
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        public static int IndexOf(Array array, object value);
        public static int IndexOf<T>(T[] array, T value, int startIndex);
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        public static int IndexOf(Array array, object value, int startIndex);
        public static int IndexOf<T>(T[] array, T value, int startIndex, int count);
        [SecuritySafeCritical, ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        public static int IndexOf(Array array, object value, int startIndex, int count);
        [MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical]
        public extern void Initialize();
        [MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]
        private static extern unsafe Array InternalCreate(void* elementType, int rank, int* pLengths, int* pLowerBounds);
        [MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]
        private extern unsafe void InternalGetReference(void* elemRef, int rank, int* pIndices);
        [MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]
        private static extern unsafe void InternalSetValue(void* target, object value);
        public static int LastIndexOf<T>(T[] array, T value);
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        public static int LastIndexOf(Array array, object value);
        public static int LastIndexOf<T>(T[] array, T value, int startIndex);
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        public static int LastIndexOf(Array array, object value, int startIndex);
        [SecuritySafeCritical, ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        public static int LastIndexOf(Array array, object value, int startIndex, int count);
        public static int LastIndexOf<T>(T[] array, T value, int startIndex, int count);
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        public static void Resize<T>(ref T[] array, int newSize);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Reverse(Array array);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail), SecuritySafeCritical]
        public static void Reverse(Array array, int index, int length);
        [SecuritySafeCritical]
        public void SetValue(object value, params int[] indices);
        [SecuritySafeCritical]
        public void SetValue(object value, int index);
        [ComVisible(false)]
        public void SetValue(object value, long index);
        [ComVisible(false)]
        public void SetValue(object value, params long[] indices);
        [SecuritySafeCritical]
        public void SetValue(object value, int index1, int index2);
        [ComVisible(false)]
        public void SetValue(object value, long index1, long index2);
        [SecuritySafeCritical]
        public void SetValue(object value, int index1, int index2, int index3);
        [ComVisible(false)]
        public void SetValue(object value, long index1, long index2, long index3);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Sort<T>(T[] array);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Sort(Array array);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Sort(Array keys, Array items);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Sort<T>(T[] array, IComparer<T> comparer);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Sort(Array array, IComparer comparer);
        public static void Sort<T>(T[] array, Comparison<T> comparison);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Sort<TKey, TValue>(TKey[] keys, TValue[] items);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Sort<T>(T[] array, int index, int length);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Sort(Array array, int index, int length);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Sort<TKey, TValue>(TKey[] keys, TValue[] items, IComparer<TKey> comparer);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Sort(Array keys, Array items, IComparer comparer);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail), SecuritySafeCritical]
        public static void Sort<T>(T[] array, int index, int length, IComparer<T> comparer);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Sort(Array keys, Array items, int index, int length);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Sort<TKey, TValue>(TKey[] keys, TValue[] items, int index, int length);
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Sort(Array array, int index, int length, IComparer comparer);
        [SecuritySafeCritical, ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Sort<TKey, TValue>(TKey[] keys, TValue[] items, int index, int length, IComparer<TKey> comparer);
        [SecuritySafeCritical, ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        public static void Sort(Array keys, Array items, int index, int length, IComparer comparer);
        int IList.Add(object value);
        void IList.Clear();
        bool IList.Contains(object value);
        int IList.IndexOf(object value);
        void IList.Insert(int index, object value);
        void IList.Remove(object value);
        void IList.RemoveAt(int index);
        int IStructuralComparable.CompareTo(object other, IComparer comparer);
        bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer);
        int IStructuralEquatable.GetHashCode(IEqualityComparer comparer);
        public static bool TrueForAll<T>(T[] array, Predicate<T> match);
        [MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail), SecurityCritical]
        private static extern bool TrySZBinarySearch(Array sourceArray, int sourceIndex, int count, object value, out int retVal);
        [MethodImpl(MethodImplOptions.InternalCall), SecurityCritical, ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        private static extern bool TrySZIndexOf(Array sourceArray, int sourceIndex, int count, object value, out int retVal);
        [MethodImpl(MethodImplOptions.InternalCall), SecurityCritical, ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        private static extern bool TrySZLastIndexOf(Array sourceArray, int sourceIndex, int count, object value, out int retVal);
        [MethodImpl(MethodImplOptions.InternalCall), SecurityCritical, ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        private static extern bool TrySZReverse(Array array, int index, int count);
        [MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail), SecurityCritical]
        private static extern bool TrySZSort(Array keys, Array items, int left, int right);
        [SecurityCritical, PermissionSet(SecurityAction.Assert, Unrestricted=true)]
        internal static Array UnsafeCreateInstance(Type elementType, params int[] lengths);
        [SecurityCritical, PermissionSet(SecurityAction.Assert, Unrestricted=true)]
        internal static Array UnsafeCreateInstance(Type elementType, int length);
        [SecurityCritical, PermissionSet(SecurityAction.Assert, Unrestricted=true)]
        internal static Array UnsafeCreateInstance(Type elementType, int[] lengths, int[] lowerBounds);
        [SecurityCritical, PermissionSet(SecurityAction.Assert, Unrestricted=true)]
        internal static Array UnsafeCreateInstance(Type elementType, int length1, int length2);

        // Properties
        public bool IsFixedSize { get; }
        public bool IsReadOnly { get; }
        public bool IsSynchronized { get; }
        public int Length { [MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), SecuritySafeCritical] get; }
        [ComVisible(false)]
        public long LongLength { [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] get; }
        public int Rank { [MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), SecuritySafeCritical] get; }
        public object SyncRoot { get; }
        int ICollection.Count { get; }
        object IList.this[int index] { get; set; }

        // Nested Types
        [Serializable]
        private sealed class ArrayEnumerator : IEnumerator, ICloneable
        {
            // Fields
            private bool _complete;
            private int[] _indices;
            private Array array;
            private int endIndex;
            private int index;
            private int startIndex;

            // Methods
            internal ArrayEnumerator(Array array, int index, int count);
            [SecuritySafeCritical]
            public object Clone();
            private void IncArray();
            public bool MoveNext();
            public void Reset();

            // Properties
            public object Current { get; }
        }

        internal sealed class FunctorComparer<T> : IComparer<T>
        {
            // Fields
            private Comparer<T> c;
            private Comparison<T> comparison;

            // Methods
            public FunctorComparer(Comparison<T> comparison);
            public int Compare(T x, T y);
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct SorterGenericArray
        {
            private Array keys;
            private Array items;
            private IComparer comparer;
            internal SorterGenericArray(Array keys, Array items, IComparer comparer);
            internal void SwapIfGreaterWithItems(int a, int b);
            internal void QuickSort(int left, int right);
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct SorterObjectArray
        {
            private object[] keys;
            private object[] items;
            private IComparer comparer;
            internal SorterObjectArray(object[] keys, object[] items, IComparer comparer);
            internal void SwapIfGreaterWithItems(int a, int b);
            internal void QuickSort(int left, int right);
        }

        [Serializable]
        private sealed class SZArrayEnumerator : IEnumerator, ICloneable
        {
            // Fields
            private Array _array;
            private int _endIndex;
            private int _index;

            // Methods
            internal SZArrayEnumerator(Array array);
            [SecuritySafeCritical]
            public object Clone();
            public bool MoveNext();
            public void Reset();

            // Properties
            public object Current { get; }
        }
    }

    4.其中Sort方法展开如下:

    [SecuritySafeCritical, ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
    public static void Sort(Array keys, Array items, int index, int length, IComparer comparer)
    {
        if (keys == null)
        {
            throw new ArgumentNullException("keys");
        }
        if ((keys.Rank != 1) || ((items != null) && (items.Rank != 1)))
        {
            throw new RankException(Environment.GetResourceString("Rank_MultiDimNotSupported"));
        }
        if ((items != null) && (keys.GetLowerBound(0) != items.GetLowerBound(0)))
        {
            throw new ArgumentException(Environment.GetResourceString("Arg_LowerBoundsMustMatch"));
        }
        if ((index < keys.GetLowerBound(0)) || (length < 0))
        {
            throw new ArgumentOutOfRangeException((length < 0) ? "length" : "index", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
        }
        if (((keys.Length - (index - keys.GetLowerBound(0))) < length) || ((items != null) && ((index - items.GetLowerBound(0)) > (items.Length - length))))
        {
            throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
        }
        if ((length > 1) && (((comparer != Comparer.Default) && (comparer != null)) || !TrySZSort(keys, items, index, (index + length) - 1)))
        {
            object[] objArray = keys as object[];
            object[] objArray2 = null;
            if (objArray != null)
            {
                objArray2 = items as object[];
            }
            if ((objArray != null) && ((items == null) || (objArray2 != null)))
            {
                new SorterObjectArray(objArray, objArray2, comparer).QuickSort(index, (index + length) - 1);
            }
            else
            {
                new SorterGenericArray(keys, items, comparer).QuickSort(index, (index + length) - 1);
            }
        }
    }

  • 相关阅读:
    学习Linux shell脚本中连接字符串的方法
    使用 ffmpeg 转换视频格式
    一点不懂到小白的linux系统运维经历分享
    linux利用scp远程上传下载文件/文件夹
    angular ui-select
    JavaScript sort()方法
    js性能优化
    layer弹出层
    JS复制对象
    某天修改了啥bat批处理
  • 原文地址:https://www.cnblogs.com/liuzhendong/p/2328647.html
Copyright © 2011-2022 走看看