通过引用传递没有ref关键字

jtz*_*ero 7 c# sockets byte reference-type pass-by-reference

我不是套接字编程的老手,所以在分析我在数据库API中找到的代码时,我遇到了这段代码

    public static void WriteInt(int i, NetworkStream bufOutputStream) 
    {
        byte[] buffer = new byte[IntSize];
        WriteInt(i, buffer, 0);
        bufOutputStream.Write(buffer, 0, buffer.Length);
    }

    public static void WriteInt(int i, byte[] byte_array, int pos)
    {

        byte_array[pos] =(byte)( 0xff & (i >> 24)); byte_array[pos+1] = (byte)(0xff & (i >> 16)); byte_array[pos+2] = (byte)(0xff & (i >> 8)); byte_array[pos+3] = (byte)(0xff & i);
    }
Run Code Online (Sandbox Code Playgroud)

我理解我不理解的位移是'缓冲'var如何在args中没有ref或者没有返回时继续得到值.位移是以某种方式编辑缓冲区的实际值?

Nol*_*rin 24

你的困惑很常见.关键点在于意识到"引用类型"和"通过引用"(ref键盘)是完全独立的.在这种特定情况下,由于byte[]是引用类型(与所有数组一样),这意味着在传递对象时不会复制该对象,因此您始终引用同一对象.

我强烈建议您阅读Jon Skeet关于C#中参数传递的优秀文章,所有这些都应该变得清晰......


Yur*_*ich 6

因为数组不是值类型,所以它是引用类型.对堆上位置的引用按值传递.

  • 这是不正确的.不要将引用类型与引用传递混淆......它们是完全独立的. (5认同)