C# 如何以只读方式传递字节数组?

C# 如何以只读方式传递字节数组?,c#,bytearray,readonly,readonly-collection,C#,Bytearray,Readonly,Readonly Collection,想想下面的代码: static int Main() { byte[] data = File.ReadAllBytes("anyfile"); SomeMethod(data); ... } static void SomeMethod(byte[] data) { data[0] = anybytevalue; // this line should not be possible!!! byte b = data[0]; //

想想下面的代码:

static int Main() {
     byte[] data = File.ReadAllBytes("anyfile");
     SomeMethod(data);
     ...
}
static void SomeMethod(byte[] data) {
     data[0] = anybytevalue; // this line should not be possible!!!
     byte b = data[0];       // only reading should be allowed
     ...
}
是否有一种在C#中只读传递字节[]的方法?复制不是解决办法。我不想浪费内存(因为文件可能会变得很大)。请记住你的表现

您可以通过a,如下所示:

static int Main() {
     byte[] data = File.ReadAllBytes("anyfile");
     SomeMethod(new ReadOnlyCollection<byte>(data));
     ...
}
static void SomeMethod(ReadOnlyCollection<byte> data) {
     byte b = data[0];       // only reading is allowed
     ...
}

我建议您使用层次结构中尽可能高的对象来完成这项工作。在您的情况下,这将是
IEnumerable

static int Main()
{
byte[]data=File.ReadAllBytes(“anyfile”);
方法(数据);
}
静态方法(IEnumerable数据)
{
字节b=数据元素(0);
//请注意,ElementAt扩展方法具有足够的智能性
//在这种情况下使用索引器而不是创建枚举器
}

我想这可能就是你想要的

编译下面的代码,您将得到以下编译错误:属性或索引器'Stack2.MyReadOnlyBytes。此[int]'无法分配给--它是只读的

public class MyReadOnlyBytes
{
   private byte[] myData;

   public MyReadOnlyBytes(byte[] data)
   {
      myData = data;
   }

   public byte this[int i]
   {
      get
      {
         return myData[i];
      }
   }
}

class Program
{
   static void Main(string[] args)
   {
      var b = File.ReadAllBytes(@"C:\Windows\explorer.exe");
      var myb = new MyReadOnlyBytes(b);

      Test(myb);

      Console.ReadLine();
   }

   private static void Test(MyReadOnlyBytes myb)
   {
      Console.WriteLine(myb[0]);
      myb[0] = myb[1];
      Console.WriteLine(myb[0]);
   }
}

((字节[])数据)[0]=anybytevalue@Slaks,当然是铸造,但无论你尝试什么,总会有办法绕过这一点。例如反射。因此,即使使用
ReadOnlyCollection
,用户也能够修改原始字节结构(尽管他需要编写比简单强制转换多一点的代码)。我假设OP在这里寻找的是编译时安全性,而不是运行时安全性。没有办法通过投射或反射来规避这一点。不过,我不推荐使用它。当使用ReadOnlyCollection而不是数组时,是否存在性能差异?@youllknow:不可测量
ReadOnlyCollection
IList
的一个薄包装器@youllknow:正如SLaks提到的,ReadOnlyCollection实际上是IList的一个包装器。因此,访问项是一个方法调用和一个接口调用。与访问阵列中单个字节的成本相比,这是非常昂贵的(大约贵20倍)。如果您的阵列很大,请务必对此进行分析@妮基,我做了一些测试,平均速度慢了3.5倍,不是20倍…@托马斯:你测试了什么?我测试了在循环中对1.000.000字节数组求和。数组:0.6ms,只读集合:20ms。这比标记中已有的因子3.5C要多得多。请不要在标题中重复这一点。我认为这是最好的解决方案。塔克斯。
static int Main() 
{
     byte[] data = File.ReadAllBytes("anyfile");
     SomeMethod(data);
}

static void SomeMethod(IEnumerable<byte> data)
{
    byte b = data.ElementAt(0); 
    // Notice that the ElementAt extension method is sufficiently intelligent
    // to use the indexer in this case instead of creating an enumerator
}
public class MyReadOnlyBytes
{
   private byte[] myData;

   public MyReadOnlyBytes(byte[] data)
   {
      myData = data;
   }

   public byte this[int i]
   {
      get
      {
         return myData[i];
      }
   }
}

class Program
{
   static void Main(string[] args)
   {
      var b = File.ReadAllBytes(@"C:\Windows\explorer.exe");
      var myb = new MyReadOnlyBytes(b);

      Test(myb);

      Console.ReadLine();
   }

   private static void Test(MyReadOnlyBytes myb)
   {
      Console.WriteLine(myb[0]);
      myb[0] = myb[1];
      Console.WriteLine(myb[0]);
   }
}