我需要一个不断增长的数组或列表(内置的数组就足够了)。此外,我需要能够使用指向该特定元素的指针来操作数组中的元素,例如以下代码
List<int> l1=new List<int>();
List<bool> l2=new List<bool>();
l1.Add(8);
l2.Add(true);
l1.Add(234);
l2.Add(true);
Console.WriteLine(l1[0]); //output=8
int* pointer = (int *) l1[0];
Console.WriteLine(*pointer); //Needs to output 8
Console.WriteLine(l2[0]); //output=true
bool* pointer2 = (bool *) l2[0];
Console.WriteLine(*pointer2); //Needs to output true
提前感谢您提供任何帮助
答案 0 :(得分:3)
我试图使用数组来存储数据包数据并将其传递给线程,这些theads需要能够修改数据而不会破坏数组
在这种情况下,我只是将List<T>
传递给线程例程,以及线程应该使用的起始和结束索引。
如果您始终按索引工作并且保持在界限范围内,那么“删除数组”应该没有任何问题。
答案 1 :(得分:2)
首先:您正在将C ++方法应用于在C#中以不同方式解决的问题。在C#中,你通常不想做涉及显式指针的事情,因为它们会使生活变得困难,特别是因为它与垃圾收集有关。
那就是说,如果你必须这样做,你想要做的就是将整个列表(可能还有索引)作为参数和偏移量传递给其他线程。您还需要确保在所有访问线程中适当地lock列表,以避免脏读/写。
正确的解决方案就是传递您实际想要处理的项目。引用类型是按值传递的,但这只是意味着为同一堆变量创建了一个新指针。它实际上并没有在堆上创建新值。
例如:
var myList = new List<MyClass> { someInstanceofMyClass1, someInstanceofMyClass2 };
var t = new Thread(()=> SomeMethod(myList[0])); // Assuming MyClass is a reference type, the value passed here is the same instance as the one in myList
t.Start();
...
答案 2 :(得分:1)
它已经按照您想要的方式运行参考类型。因此,一种可能的解决方案是创建一个类来将这些值作为引用类型进行封装。如果这些项目是通过索引相关的(我怀疑它们是),那么最好保留一个列表来保存一个既可以对两个值进行分组而又可以对两个列表进行分组的类型。跟着这个:
public Class MyClass
{
public int IntValue {get;set;}
public bool BoolValue {get;set;}
public MyClass(int intValue, bool boolValue)
{
IntValue = intValue;
boolValue = boolValue;
}
}
List<MyClass> l1 = new List<MyClass>();
l1.Add(new MyClass(8, true));
MyClass pointer = l1[0];
Console.WriteLine(pointer.IntValue); //writes 8
Console.WriteLine(pointer.BoolValue); //writes True
答案 3 :(得分:1)
如果您使用的是.NET 4,则可能需要查看System.Collections.Concurrent namespace中的类。它们提供了线程安全的数据结构,可以帮助您以更少的代码实现目标。
答案 4 :(得分:-1)
对于您要完成的任务(网络数据包),听起来您可以从System.IO.BinaryWriter而不是列表中受益。 (你甚至可以将NetworkStream传递给BinaryWriter)
它支持搜索,因此您可以返回并重新编写,并且您不能删除数组,因为它会自动增长。
性能方面,我认为BinaryWriter比List更快,因为它写入底层Stream并且MemoryStream比List<byte>
更快