1

我写了一个结构和函数,我尝试通过引用传递结构(即结构值可以在函数内部修改)。

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 关键字?

4

4 回答 4

3

简单的经验法则:

不要使用指针。

指针用于晦涩的互操作或迟钝的优化。
一般来说,您不应该使用不安全的代码。

于 2012-04-19T13:42:43.053 回答
1

指针被认为是不安全的。

如果您在不安全的上下文中编码,例如通过指向函数的指针传递引用,则有人可以将您的指针更改为其他地方的指针,并且您会得到垃圾数据。

如果你使用 ref 关键字,上下文是“安全的”,你不能改变房间指向的地方,只能改变像numbertakecategory这样的数据。

于 2012-04-19T13:45:16.623 回答
1

指针是 C# 语言的有用部分。使用指针并不困难,但应谨慎使用,因为它可能会导致难以诊断的错误。使用指针会干扰垃圾收集器的功能,尤其是当我们在程序中使用许多指针时。因此,在使用指针之前,我们应该考虑它,并可能尝试找到其他方法。有关详细信息,请参阅:
http
://www.c-sharpcorner.com/UploadFile/gregory_popek/WritingUnsafeCode11102005040251AM/WritingUnsafeCode.aspx和
使用 C# 中的指针

于 2012-04-19T13:53:08.443 回答
0

在 .net 中,当某些东西经过 时ref,被调用的函数会收到一个指针,除非在某些非常有限的情况下,否则禁止复制该指针;除非将指针提供给unsafe代码,否则在被调用函数执行期间生成的指针的任何副本都保证在被调用函数返回之前被销毁。如果所讨论的指针指向堆对象的一部分,则与调用站点关联的元数据将使垃圾收集器知道在哪里可以找到对该对象的引用,以便它知道不要打扰它。

由函数或非托管代码创建或传递给它们的指针unsafe是不同的。如果一个不安全的函数或非托管代码有一个指向某个东西的指针,它可能会以一种比函数调用更长寿的方式存储它,并且垃圾收集器不知道这种方式。存在可以明确告诉垃圾收集器不要干扰堆对象的方法,但使用此类技术充满危险。

用于ref通过引用传递参数,除非有非常强烈的理由使用指针。在两种技术都能正常工作的情况下,它往往与传递指针一样快。

于 2012-04-19T21:19:38.980 回答