如题:下面这样写是否规矩?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);
}
{
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);
}
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
//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);
}
}
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/******************************************************************************///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; }
}
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
//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那些大牛可以搞?问的问题很幼稚,还望大牛们别见笑.