csharp byte[] 和List<byte>的区别,详细说明,并举例
时间: 2023-05-15 22:06:12 浏览: 414
C#中的byte[]和List<byte>都可以用来存储字节数据,但它们有一些区别。
byte[]是一个固定长度的数组,它的长度在创建时就已经确定了,不能动态改变。而List<byte>是一个可变长度的列表,可以动态添加或删除元素。
举个例子,如果我们要存储一个长度为10的字节数组,可以这样定义一个byte[]:
byte[] byteArray = new byte[10];
这个数组的长度是10,不能再添加或删除元素。而如果我们使用List<byte>,可以这样定义:
List<byte> byteList = new List<byte>();
然后我们可以使用Add方法向列表中添加元素:
byteList.Add(1);
byteList.Add(2);
byteList.Add(3);
这样,byteList就包含了三个元素,可以继续添加或删除元素。
总之,byte[]适合存储固定长度的字节数组,而List<byte>适合存储可变长度的字节数组。
相关问题
csharp 详细说明byte[]与list<byte>的区别,并举例
Byte[]和List<byte>都是用于存储二进制数据的数据类型,但它们有以下两个重要的区别:
1. 存储方式不同
Byte[]是一个固定长度的数组,需要在定义时指定数组的长度。而List<byte>是一个动态数组,可以根据需要动态添加和删除元素。
2. 访问数据的方式不同
对于Byte[],我们是通过数组下标(例如:byte[0])来访问数组中的单个元素。而对于List<byte>,我们可以使用Add()添加元素,使用Insert()在指定位置插入一个元素,使用Remove()删除元素,使用Count获取元素总数等等。
以下是一个简单的例子,用于说明Byte[]和List<byte>的区别:
```csharp
// 使用Byte[]存储二进制数据
byte[] byteArray = new byte[4] { 0x01, 0x02, 0x03, 0x04 };
Console.WriteLine("Byte Array:");
for (int i = 0; i < byteArray.Length; i++)
{
Console.Write(byteArray[i] + " ");
}
Console.WriteLine();
// 使用List<byte>存储二进制数据
List<byte> byteList = new List<byte>();
byteList.Add(0x01);
byteList.Add(0x02);
byteList.Add(0x03);
byteList.Add(0x04);
Console.WriteLine("Byte List:");
for (int i = 0; i < byteList.Count; i++)
{
Console.Write(byteList[i] + " ");
}
Console.WriteLine();
```
输出结果为:
```
Byte Array:
1 2 3 4
Byte List:
1 2 3 4
```
可以看到,两个数据结构在存储二进制数据时,都能够正常工作,但访问数据的方式不同。所以在实际使用时,需要根据应用场景选择合适的数据结构。
.net core中,两个系统平台之间,进行数据传输,采用共享内存的方式,在生产数据中,生产的数据是一个List集合进行二进制转换,而在消费者中,获取到数据后,通过二进制进行解析。用代码举例
在.NET Core中,如果需要在两个系统平台之间通过共享内存进行数据传输,特别是当涉及到List集合和其他复杂类型时,可以使用`MemoryStream`和`BinaryFormatter`类来实现序列化和反序列化操作。`BinaryFormatter`是一个用于持久化.NET对象到字节流的工具。
以下是简化的代码示例:
**生产者(Producer)部分:**
```csharp
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
public class Producer
{
private static readonly byte[] SharedMemoryKey = new byte[4]; // 你可以自定义一个唯一的键
public void SerializeData(List<MyObject> data)
{
try
{
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream memoryStream = new MemoryStream())
{
formatter.Serialize(memoryStream, data);
memoryStream.Seek(0, SeekOrigin.Begin); // 将指针移到开始以便读取
Array.Copy(memoryStream.ToArray(), SharedMemoryKey, memoryStream.Length); // 写入共享内存
}
}
catch (Exception ex)
{
Console.WriteLine($"Error serializing data: {ex.Message}");
}
}
public void ReleaseMemory() => Array.Clear(SharedMemoryKey, 0, SharedMemoryKey.Length); // 清除键,释放资源
}
```
**消费者(Consumer)部分:**
```csharp
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
public class Consumer
{
public List<MyObject> DeserializeData()
{
try
{
if (!Array.Exists(SharedMemoryKey)) return null; // 检查键是否存在
byte[] dataFromMemory = new byte[SharedMemoryKey.Length];
Array.Copy(SharedMemoryKey, dataFromMemory, SharedMemoryKey.Length);
using (MemoryStream memoryStream = new MemoryStream(dataFromMemory))
{
BinaryFormatter formatter = new BinaryFormatter();
List<MyObject> deserializedData = (List<MyObject>)formatter.Deserialize(memoryStream);
return deserializedData;
}
}
catch (Exception ex)
{
Console.WriteLine($"Error deserializing data: {ex.Message}");
return null;
}
}
}
// 注意:MyObject需要实现ISerializable接口才能被BinaryFormatter序列化
public class MyObject : ISerializable
{
// ...
}
```
阅读全文