在.NET是有使用指针作为函数的参数或使用“REF”的关键字之间的任何差异?(In .NET is

2019-10-16 14:38发布

我已经写了结构和功能,其中我尝试通过引用传递的结构(即结构值可以在里面的功能被修改)。

enum RoomType { Economy, Buisness, Executive, Deluxe };

struct HotelRoom
{
    public int Number;
    public bool Taken;
    public RoomType Category;

    public void Print()
    {
        String status = Taken ? "Occupied" : "available";
        Console.WriteLine("Room {0} is of {1} class and is currently {2}", 
            Number, Category, status);
    }
}

现在通过引用传递这个结构,我发现有两种方式。

//Using Pointer
private unsafe static void Reserve(HotelRoom* room)
{
    if (room->Taken)
        Console.WriteLine("Cannot reserve room {0}", room->Number);
    else
        room->Taken = true;
}      

//Using ref keyword.
private static void Reserve(ref HotelRoom room)
{
    if (room.Taken)
         Console.WriteLine("Cannot reserve room {0}", room.Number);
    else
         room.Taken = true;
}    

有什么区别吗? 通常,当我应该使用指针,什么时候应该去ref关键字?

Answer 1:

指针被认为是不安全的。

如果您在不安全的上下文代码,例如通过指针传递一个参考作用,有人可以改变你的指针的指针其他地方,你会得到垃圾数据。

如果您使用的ref关键字,上下文是“安全”,并在房间指向,只有它的数据,如数量采取类别不能更改。



Answer 2:

拇指简单的规则:

不要使用指针。

指针都是为了模糊的互操作或钝优化。
在一般情况下,你不应该使用不安全的代码。



Answer 3:

指针是C#语言的有用的部分。 使用指针并不难,但要小心使用,因为它可能是难以诊断的错误的原因。 使用指针打扰垃圾收集功能尤其是当我们在程序中使用很多指针。 因此,使用指针,我们应该考虑它,也许之前试图找到一些其他的ways.For详情请见:
http://www.c-sharpcorner.com/UploadFile/gregory_popek/WritingUnsafeCode11102005040251AM/WritingUnsafeCode.aspx

在C#中工作的指针



Answer 4:

在.NET中,当某物被传递ref ,被调用的函数接收其所从复制禁止除了在某些非常有限的情况下的指针; 除非该指针是给unsafe代码,已被调用的函数的执行过程中所取得的指针的任何拷贝都保证被调用的函数返回之前被破坏。 如果指针在问题指向堆对象的一部分,与呼叫网站相关的元数据将让垃圾收集器知道在哪里可以找到对象的引用,这样它就会知道不要去打扰它。

通过创建,或者传递给指针, unsafe功能或托管代码是不同的。 如果不安全的功能或者非托管代码有一个指针的东西,它可以将其存储在其中会超越函数调用的方式,以及垃圾收集器不知道。 存在着手段,使垃圾收集器可以被明确告知不要打搅一个堆对象,但使用这种技术是充满了危险。

使用ref用于传递引用,除非有一个极其强烈的理由使用指针。 这是容易被一样快,因为传递指针的情况下,这两种技术将始终如一地正常工作。



文章来源: In .NET is there any difference between using pointers as function parameters or using the “ref” keyword?