今天看了一道微軟認證MCTS的樣題,考的是StringBuilder容量(Capacity屬性)的變化,暈……連這種題都有啊,呵呵,不過挺有意思的,為此我研究了一下一些常見的有Capacity屬性的容器,也就是題目上說的那三個,另外還有個ArrayList,不過它和List<T>工作原理一樣,就沒把他放在標題上。
下面是我的電腦測試結果:
(32位,WinXP SP2家庭版,.NET Framework 3.5 SP1)
StringBuilder
16 32 64 128 256 512 1024
List<T>
0 4 8 16 32 64 128 256 512 1024
ArrayList
0 4 8 16 32 64 128 256 512 1024
MemoryStream
0 256 512 1024
測試代碼
using System;
using System.Text;
using System.Collections.Generic;
using System.Reflection;
namespace Mgen.TTC
{
class Program
{
static int count = 1000;
static void Main()
{
test(typeof(StringBuilder), "Append", 'c');
test(typeof(List<int>), "Add", 1);
test(typeof(System.Collections.ArrayList), "Add", 2);
test(typeof(System.IO.MemoryStream), "WriteByte", (byte)3);
}
static void test(Type type, string addMethod, object addObj)
{
var instance = Activator.CreateInstance(type);
Console.Write("{0}: ", type.Name);
int capacity = GetCapacity(instance);
Console.Write(" {0}", capacity);
for (int i = 0; i < count; i++)
{
CallAdd(instance, addMethod, addObj);
int chk = GetCapacity(instance);
if (chk != capacity)
Console.Write(" {0}", capacity = chk);
}
Console.WriteLine();
}
static void CallAdd(object instance, string method, object arg)
{
instance.GetType().GetMethod(method, new Type[] { arg.GetType() }).Invoke(instance, new object[] { arg });
}
static int GetCapacity(object obj)
{
return (int)obj.GetType().GetProperty("Capacity").GetValue(obj, null);
}
}
}