如题:下面这样写是否规矩?public class StringBuilderTest
    {
        private
        int Capacity;
        int Length;
            int MaxCapacity;
    protected
        static  string CapacityField = "Capacity";
            static  int DefaultCapacity = 16;
            static  string MaxCapacityField = "m_MaxCapacity";
            static  int MaxChunkSize = 8000;
            static  string StringValueField = "m_StringValue";
            static  string ThreadIDField = "m_currentThread";

        char []m_ChunkChars;
        int m_ChunkLength;
        int m_ChunkOffset;
        System.Text.StringBuilder m_ChunkPrevious;
        int m_MaxCapacity;
            public void StringBuilderTest()
        {
                this.Capacity = DefaultCapacity;
                this.Length = 0;
                this.MaxCapacity = MaxCapacity;


        foreach(int x in m_ChunkChars)
        {
        this.m_ChunkChars[x] = '\0';
        }
        this.m_ChunkLength = 0;
        this.m_ChunkOffset = 0;
        this.m_ChunkPrevious = null;
                this.m_MaxCapacity = 0x7FFFFFFF;
        }
        //StringBuilder(int capacity):base
        //{

        //}
        //StringBuilder(string value);
        //StringBuilder(int capacity,int maxCapacity);
        //StringBuilder(string value,int capacity);
        //StringBuilder(string value,int starIndex,int length,int capacity);
    }

解决方案 »

  1.   

    StringBuilder好象是用数组实现的,用Reflector反编MS的StringBuilder就知道了。之前在GOOGLE上搜索到自定义的StringBuilder,也是这么写的,可惜当时没有收藏。
      

  2.   

    /******************************************************************************/
    /******************************************************************************/
    /******************************************************************************/
    /******************************************************************************/
    /******************************************************************************/
    //Microsoft StringBuilder class 只是声明了函数接口,看不到源文件:using System;
    using System.Reflection;
    using System.Runtime;
    using System.Runtime.InteropServices;
    using System.Runtime.Serialization;
    using System.Security;namespace System.Text
    {
        [Serializable]
        [ComVisible(true)]
        public sealed class StringBuilder : ISerializable
        {
            public StringBuilder();
            public StringBuilder(int capacity);
            public StringBuilder(string value);
            public StringBuilder(int capacity, int maxCapacity);
            public StringBuilder(string value, int capacity);
            public StringBuilder(string value, int startIndex, int length, int capacity);
            public int Capacity { get; set; }
            public int Length { get; set; }
            public int MaxCapacity { get; }
            public char this[int index] { get; set; }
            public StringBuilder Append(bool value);
            public StringBuilder Append(byte value);
            public StringBuilder Append(char value);
            public StringBuilder Append(char[] value);
            public StringBuilder Append(decimal value);
            public StringBuilder Append(double value);
            public StringBuilder Append(float value);
            public StringBuilder Append(int value);
            public StringBuilder Append(long value);
            public StringBuilder Append(object value);
            public StringBuilder Append(sbyte value);
            public StringBuilder Append(short value);
            public StringBuilder Append(string value);
            public StringBuilder Append(uint value);
            public StringBuilder Append(ulong value);
            public StringBuilder Append(ushort value);
            public StringBuilder Append(char value, int repeatCount);
            public StringBuilder Append(char[] value, int startIndex, int charCount);
            public StringBuilder Append(string value, int startIndex, int count);
            public StringBuilder AppendFormat(string format, object arg0);
            public StringBuilder AppendFormat(string format, params object[] args);
            public StringBuilder AppendFormat(IFormatProvider provider, string format, params object[] args);
            public StringBuilder AppendFormat(string format, object arg0, object arg1);
            public StringBuilder AppendFormat(string format, object arg0, object arg1, object arg2);
            public StringBuilder AppendLine();
            public StringBuilder AppendLine(string value);
            public StringBuilder Clear();
            public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count);
            public int EnsureCapacity(int capacity);
            public bool Equals(StringBuilder sb);
            public StringBuilder Insert(int index, bool value);
            public StringBuilder Insert(int index, byte value);
            public StringBuilder Insert(int index, char value);
            public StringBuilder Insert(int index, char[] value);
            public StringBuilder Insert(int index, decimal value);
            public StringBuilder Insert(int index, double value);
            public StringBuilder Insert(int index, float value);
            public StringBuilder Insert(int index, int value);
            public StringBuilder Insert(int index, long value);
            public StringBuilder Insert(int index, object value);
            public StringBuilder Insert(int index, sbyte value);
            public StringBuilder Insert(int index, short value);
            public StringBuilder Insert(int index, string value);
            public StringBuilder Insert(int index, uint value);
            public StringBuilder Insert(int index, ulong value);
            public StringBuilder Insert(int index, ushort value);
            public StringBuilder Insert(int index, string value, int count);
            public StringBuilder Insert(int index, char[] value, int startIndex, int charCount);
            public StringBuilder Remove(int startIndex, int length);
            public StringBuilder Replace(char oldChar, char newChar);
            public StringBuilder Replace(string oldValue, string newValue);
            public StringBuilder Replace(char oldChar, char newChar, int startIndex, int count);
            public StringBuilder Replace(string oldValue, string newValue, int startIndex, int count);
            public override string ToString();
            public string ToString(int startIndex, int length);
        }
    }
      

  3.   


    /******************************************************************************/
    /******************************************************************************/
    /******************************************************************************/
    /******************************************************************************/
    /******************************************************************************///Reflector StringBuilder class 有接口和接口的定义.
    public sealed class StringBuilder : ISerializable
    {
            // Fields
            private const string CapacityField = "Capacity";
            internal const int DefaultCapacity = 0x10;
            internal char[] m_ChunkChars;
            internal int m_ChunkLength;
            internal int m_ChunkOffset;
            internal StringBuilder m_ChunkPrevious;
            internal int m_MaxCapacity;
            private const string MaxCapacityField = "m_MaxCapacity";
            internal const int MaxChunkSize = 0x1f40;
            private const string StringValueField = "m_StringValue";
            private const string ThreadIDField = "m_currentThread";
            
    // Methods
            public StringBuilder();
            public StringBuilder(int capacity);
            public StringBuilder(string value);
            private StringBuilder(StringBuilder from);
            public StringBuilder(int capacity, int maxCapacity);
            private StringBuilder(SerializationInfo info, StreamingContext context);
            public StringBuilder(string value, int capacity);
            private StringBuilder(int size, int maxCapacity, StringBuilder previousBlock);
            public StringBuilder(string value, int startIndex, int length, int capacity);
            public StringBuilder Append(char[] value);
            public StringBuilder Append(bool value);
            public StringBuilder Append(byte value);
            public StringBuilder Append(char value);
            public StringBuilder Append(decimal value);
            public StringBuilder Append(double value);
            public StringBuilder Append(short value);
            public StringBuilder Append(int value);
            public StringBuilder Append(long value);
            public StringBuilder Append(object value);
            public StringBuilder Append(sbyte value);
            public StringBuilder Append(float value);
            public StringBuilder Append(string value);
            public StringBuilder Append(ushort value);
            public StringBuilder Append(uint value);
            public StringBuilder Append(ulong value);
            internal unsafe StringBuilder Append(char* value, int valueCount);
            public StringBuilder Append(char value, int repeatCount);
            public StringBuilder Append(string value, int startIndex, int count);
            public StringBuilder Append(char[] value, int startIndex, int charCount);
            public StringBuilder AppendFormat(string format, params object[] args);
            public StringBuilder AppendFormat(string format, object arg0);
            public StringBuilder AppendFormat(IFormatProvider provider, string format, params object[] args);
            public StringBuilder AppendFormat(string format, object arg0, object arg1);
            public StringBuilder AppendFormat(string format, object arg0, object arg1, object arg2);
            private void AppendHelper(string value);
            public StringBuilder AppendLine();
            public StringBuilder AppendLine(string value);
            public StringBuilder Clear();
            public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count);
            public int EnsureCapacity(int capacity);
            public bool Equals(StringBuilder sb);
            private void ExpandByABlock(int minBlockCharCount);
            private StringBuilder FindChunkForByte(int byteIndex);
            private StringBuilder FindChunkForIndex(int index);
            private static void FormatError();
            public StringBuilder Insert(int index, byte value);
            public StringBuilder Insert(int index, char[] value);
            public StringBuilder Insert(int index, bool value);
            public StringBuilder Insert(int index, char value);
            public StringBuilder Insert(int index, decimal value);
            public StringBuilder Insert(int index, double value);
            public StringBuilder Insert(int index, short value);
            public StringBuilder Insert(int index, int value);
            public StringBuilder Insert(int index, long value);
            public StringBuilder Insert(int index, object value);
            public StringBuilder Insert(int index, sbyte value);
            public StringBuilder Insert(int index, float value);
            public StringBuilder Insert(int index, string value);
            public StringBuilder Insert(int index, ushort value);
            public StringBuilder Insert(int index, uint value);
            public StringBuilder Insert(int index, ulong value);
            public StringBuilder Insert(int index, string value, int count);
            private unsafe void Insert(int index, char* value, int valueCount);
            public StringBuilder Insert(int index, char[] value, int startIndex, int charCount);
            internal void InternalCopy(IntPtr dest, int len);
            private void MakeRoom(int index, int count, out StringBuilder chunk, out int indexInChunk, bool doneMoveFollowingChars);
            private StringBuilder Next(StringBuilder chunk);
            public StringBuilder Remove(int startIndex, int length);
            private void Remove(int startIndex, int count, out StringBuilder chunk, out int indexInChunk);
            public StringBuilder Replace(char oldChar, char newChar);
            public StringBuilder Replace(string oldValue, string newValue);
            public StringBuilder Replace(char oldChar, char newChar, int startIndex, int count);
            public StringBuilder Replace(string oldValue, string newValue, int startIndex, int count);
            private void ReplaceAllInChunk(int[] replacements, int replacementsCount, StringBuilder sourceChunk, int removeCount, string value);
            internal extern unsafe void ReplaceBufferAnsiInternal(sbyte* newBuffer, int newLength);
            internal extern unsafe void ReplaceBufferInternal(char* newBuffer, int newLength);
            private unsafe void ReplaceInPlaceAtChunk(ref StringBuilder chunk, ref int indexInChunk, char* value, int count);
            private bool StartsWith(StringBuilder chunk, int indexInChunk, int count, string value);
            void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context);
            private static unsafe void ThreadSafeCopy(char* sourcePtr, char[] destination, int destinationIndex, int count);
            private static void ThreadSafeCopy(char[] source, int sourceIndex, char[] destination, int destinationIndex, int count);
            public override string ToString();
            public string ToString(int startIndex, int length);
            private void VerifyClassInvariant();        // Properties
            public int Capacity { [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] get; set; }
            public char this[int index] { get; set; }
            public int Length { [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] get; [SecuritySafeCritical] set; }
            public int MaxCapacity { get; }
    }
      

  4.   

    /******************************************************************************/
    /******************************************************************************/
    /******************************************************************************/
    /******************************************************************************/
    /******************************************************************************/
    //Reflector StringBuilder class 关于StringBuilder Append(string value)的定义[SecuritySafeCritical]
    public unsafe StringBuilder Append(string value)
    {
            if (value != null)
            {
                    char[] chunkChars = this.m_ChunkChars;
                    int chunkLength = this.m_ChunkLength;
                    int length = value.Length;
                    int num3 = chunkLength + length;
                    if (num3 < chunkChars.Length)
                    {
                            if (length <= 2)
                            {
                                    if (length > 0)
                                    {
                                            chunkChars[chunkLength] = value[0];
                                    }
                                    if (length > 1)
                                    {
                                            chunkChars[chunkLength + 1] = value[1];
                                    }
                            }
                            else
                            {
                                    fixed (char* str = ((char*) value))
                                    {
                                            char* smem = str;
                                            fixed (char* chRef = &(chunkChars[chunkLength]))
                                            {
                                                    string.wstrcpy(chRef, smem, length);
                                            }
                                    }
                            }
                            this.m_ChunkLength = num3;
                    }
                    else
                    {
                            this.AppendHelper(value);
                    }
            }
            return this;
    }
    /******************************************************************************/
    /******************************************************************************/
    mono关于StringBuilder Append(string value)方法的定义public StringBuilder Append (string value) 
    {
    if (value == null)
    return this;

    if (_length == 0 && value.Length < _maxCapacity && value.Length > _str.Length) {
    _length = value.Length;
    _str = _cached_str = value;
    return this;
    } int needed_cap = _length + value.Length;
    if (null != _cached_str || _str.Length < needed_cap)
    InternalEnsureCapacity (needed_cap); String.CharCopy (_str, _length, value, 0, value.Length);
    _length = needed_cap;
    return this;
    }问题1:Reflector的定义不可能是从微软.NET架构里面的一堆DLL Reflect来的吧!
    问题2:.exe文件能被Reflector翻出里头的接口原型有点玄,不懂,,难道.NET架构下生成的是一种类似解释型的中间代码?
    问题3:mono的类属于"非正规军"的东西也好用,是否可以说.NET架构下面底层的东西也不是我们想象中的那么难,只有MS那些大牛可以搞?问的问题很幼稚,还望大牛们别见笑.