private UIVertex[] GetArray(List verts)
{
var aryF = typeof(List).GetField("_items", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
return aryF.GetValue(verts) as UIVertex[];
}
private void SetSize(List list, int size)
{
sizeF = typeof(List).GetField("_size",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
}
static List verts
static UIVertex[] ary;
//...
ary = GetArray(verts);
< /code>
В моем случае я могу повторно использовать «Verts», но когда изменение Verts Count. Моему нужно снова получить снова (и это вызововое отражение), < /p>
Стоимость отражения слишком высота, могу ли я просто сохранить ссылку? Как это сделать? String.memcpy () < /code>, это слишком медленно, поэтому я хочу напрямую использовать массив. Я могу просто сохранить это, чтобы быть быстрым. < /P>
ps 2.static List Orgin = new List(128);
void DO() // *it call a lot of times.*
{
GetListByAPI(Orgin);// here is API , So it must insert List.
int Size = Orgin.Count() * 5; // size is unchanged in here.
if(Orgin.Capacity < Size)
{
Orgin.Capacity = Size;
}
for(int i = Orgin.Count() ; i < Size ;i++)
{
T t
Orgin.Add(t);// I need "Oring.Count() * 5 " Size Array for my logic.
//...
}
}
< /code>
Здесь изменяется после: < /p>
static List Orgin = new List(128);
static T[] StaticAry;
void DO() // *it call a lot of times.*
{
bool LastOringCapacity = Orgin.Capacity;
GetListByAPI(Orgin);// here is API , So it must insert List.
bool arrayRefChanged = Orgin.Capacity > LastOringCapacity ; // I Can know it. and get array again.
int Size = Orgin.Count() * 5; // size is unchanged in here.
SetSize(Oring, Size);//here set array legth of list by refection
StaticAry = GetArray(Orgin);//here I get array of list by reflection
for(int i = 0 ; i < size; i++)
{
T t = StaticAry[i];//just use it , avoid to use List.Add api.
//....
}
}
< /code>
Этот статический оргин повторно используется, поэтому oring.capacity может не измениться. Таким образом, массив Оргина тоже не изменяется. И я хочу получить массив. напрямую используйте его.
, но сейчас. Мне нужно использовать отражение, чтобы получить массив в каждом отдельном do (). < /P>
Место сложности - это то, что
List.Capacity
& Array.Length и List.Count() — это три разных значения.
По причинам производительности я хочу получить массив List непосредственно в C# https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list. cs,2765070d40f47b98 Мой код здесь: [code]private UIVertex[] GetArray(List verts) { var aryF = typeof(List).GetField("_items", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); return aryF.GetValue(verts) as UIVertex[]; }
static List verts static UIVertex[] ary; //... ary = GetArray(verts); < /code> В моем случае я могу повторно использовать «Verts», но когда изменение Verts Count. Моему нужно снова получить снова (и это вызововое отражение), < /p> Стоимость отражения слишком высота, могу ли я просто сохранить ссылку? Как это сделать? String.memcpy () < /code>, это слишком медленно, поэтому я хочу напрямую использовать массив. Я могу просто сохранить это, чтобы быть быстрым. < /P> ps 2.static List Orgin = new List(128); void DO() // *it call a lot of times.* { GetListByAPI(Orgin);// here is API , So it must insert List. int Size = Orgin.Count() * 5; // size is unchanged in here. if(Orgin.Capacity < Size) { Orgin.Capacity = Size; } for(int i = Orgin.Count() ; i < Size ;i++) { T t Orgin.Add(t);// I need "Oring.Count() * 5 " Size Array for my logic. //... } } < /code> Здесь изменяется после: < /p> static List Orgin = new List(128); static T[] StaticAry; void DO() // *it call a lot of times.* { bool LastOringCapacity = Orgin.Capacity; GetListByAPI(Orgin);// here is API , So it must insert List.
bool arrayRefChanged = Orgin.Capacity > LastOringCapacity ; // I Can know it. and get array again.
int Size = Orgin.Count() * 5; // size is unchanged in here. SetSize(Oring, Size);//here set array legth of list by refection StaticAry = GetArray(Orgin);//here I get array of list by reflection
for(int i = 0 ; i < size; i++) { T t = StaticAry[i];//just use it , avoid to use List.Add api. //.... } } < /code> Этот статический оргин повторно используется, поэтому oring.capacity может не измениться. Таким образом, массив Оргина тоже не изменяется. И я хочу получить массив. напрямую используйте его. , но сейчас. Мне нужно использовать отражение, чтобы получить массив в каждом отдельном do (). < /P> Место сложности - это то, что List.Capacity[/code] & Array.Length и List.Count() — это три разных значения.