如果可以的话,我们应该总是通过ref返回吗?

时间:2018-05-03 14:18:45

标签: c# optimization ref c#-7.0 c#-7.2

现在使用C#7,我们可以使用return ref返回ref。根据我的收集,参考是32位或64位。现在,如果我的结构Coord带有long Xlong Y,那将是128位,因此更容易返回坐标,(以及通过它)参考以避免复制128位。

另一方面,如果我尝试return ref byte只有8位,对它的引用会比复制字节本身大得多,对吗?

所以,我的主要问题:如果我们想要返回的对象可以由ref返回(即,不是局部变量)并且其大小大于引用的大小,那么我们应该由ref返回?

修改:快速代码示例

// This size is 128 bytes, which is 2 or 4x larger than the size of a reference
public struct Coord                                 
{
    public long X, Y;
}

private Coord myCoord;

// This will return the Coord by value, meaning copying the full 128 bytes
public Coord GetCoordValue() => myCoord;          

// This will return the Coord by reference, meaning copying only 32 or 64 bytes
public ref readonly Coord GetCoordRef() => ref myCoord;      

此外,这个特殊的结构非常简单,并且按ref返回它已经小了2 / 4x。

编辑2:我制作了GetCoordRef() readonly,以便调用者无法保存并更改myCoord的值,从而保留了封装,尽管我想象一下,默认使用它仍然不会很聪明。

1 个答案:

答案 0 :(得分:10)

  

如果我们想要返回的对象可以通过ref返回(即,不是局部变量)并且其大小大于引用的大小,那么我们应该通过ref返回吗?

(1)否。

(2)仅适用于高级用户:是,正是在这些情况下,您的经验,准确的分析数据表明进行此更改会将您的程序从令用户失望的程序转变为令用户高兴的程序

市场中是否有程序的失败或成功可以追溯到几个纳秒的差异,复制几个额外的字节被交换为几秒纳秒后指针间接?我不知道有什么,但也许你编写的程序的用户预算非常紧张,他们希望你的API需要几纳秒。