ref 参数的内联变量声明解决方法

Inline variable declaration workaround for ref parameter

提问人:Jazzer008 提问时间:3/22/2023 最后编辑:Jazzer008 更新时间:3/22/2023 访问量:178

问:

这纯粹是出于兴趣。我特别想知道是否有一种更简洁的方法来传递 ref int 而无需创建变量。

我目前的解决方法:

ref stackalloc int[1] { 0 }[0]

以及上下文:

public struct MyStruct
{
   private float x;
   private float y;
   private bool alive;

   public MyStruct(byte[] data) : this(data, ref stackalloc int[1] { 0 }[0]) { }

   public MyStruct(byte[] data, ref int index)
   {
      x = BitConverter.ToSingle(data, index); index += sizeof(float);
      y = BitConverter.ToSingle(data, index); index += sizeof(float);
      alive = BitConverter.ToBoolean(data, index); index += sizeof(bool);
   }
}

构造函数使用上下文:

MyStruct DeserializeOneStruct(byte[] data)
{
   MyStruct struct = new MyStruct (data);
   return struct;
}

List<MyStruct> DeserializeMultipleStructs(byte[] data)
{
   List<MyStruct> structList = new List<MyStruct>();

   int index = 0;
   int structCount = data[index]; index += sizeof(byte); 

   for (int i = 0; i < structCount ; i++) 
      structList.Add(new MyStruct(data, ref index));

   return structList;
}
C# 构造函数 引用传递

评论

2赞 jdweng 3/22/2023
使用 REF,以便当方法更改值时,更改也在父项中。所以我不确定你为什么在这种情况下使用 REF。我不知道你为什么要传入值 1,然后将 1 更改为 2。
0赞 Jazzer008 3/22/2023
@jdweng 有时 byte[] 数据包含单个“MyStruct”,索引可以从 0 开始,有时需要引用它的倍数和索引进行反序列化。
0赞 Jazzer008 3/22/2023
@jdweng 我已经提交了问题的答案。添加内联变量声明和丢弃 ref 参数的提议表明,目前没有更好的方法来实现这一目标。
0赞 jdweng 3/22/2023
如果传递了一个类对象,则会自动传递 ByRef。
0赞 Matthew Whited 3/22/2023
引用的对象将按值传递。它不会通过引用。

答:

-1赞 Jazzer008 3/22/2023 #1

在添加内联 ref 参数声明之前,情况不太可能如此。已经为这样的事情提交了提案。

引用参数的内联变量声明和丢弃