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

Aus*_*yan 8 c# optimization ref c#-7.0 c#-7.2

现在有了C#7,我们可以通过ref返回return ref.根据我的收集,参考是32位或64位.现在,如果我有一个结构Coordlong Xlong Y,这将是128位,所以它会更容易通过参考返回坐标,(以及通过它),以避免复制的128位.

另一方面,如果我尝试return refa 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;      
Run Code Online (Sandbox Code Playgroud)

此外,这个特殊的结构非常简单,它的返回量已经缩小了2/4x ref.

编辑2:GetCoordRef() readonly这样做是为了让调用者无法保存和更改其值myCoord,从而保留了封装,尽管我认为默认使用它仍然不会很聪明.

Eri*_*ert 10

如果我们想返回对象可通过REF(即,不是局部变量)返回其大小比参考的大小,我们应该回到由裁判?

(1)不.

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

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