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);
    }
}

この構造体を参照渡しするには、2 つの方法を見つけました。

//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

ポインターは、C# 言語の便利な部分です。ポインターの使用は難しくありませんが、診断が困難なエラーの原因になる可能性があるため、慎重に使用する必要があります。ポインターを使用すると、特にプログラムで多くのポインターを使用する場合に、ガベージ コレクターの機能が妨げられます。したがって、ポインターを使用する前に、それを検討し、他の方法を見つけることを試みる必要があります


于 2012-04-19T13:53:08.443 に答える
1

ポインターは安全ではないと見なされます。

関数へのポインターによって参照を渡すなど、安全でないコンテキストでコーディングすると、誰かがポインターを別の場所のポインターに変更する可能性があり、ガベージ データが取得されます。

ref キーワードを使用すると、コンテキストは「安全」になりroomが指している場所を変更することはできませ

于 2012-04-19T13:45:16.623 に答える
0

.net では、何かが によって渡されるrefと、呼び出された関数は、特定の非常に限られた状況を除き、コピーが禁止されているポインターを受け取ります。コードにポインターが与えられない限り、unsafe呼び出された関数の実行中に作成されたポインターのコピーは、呼び出された関数が戻る前に破棄されることが保証されます。問題のポインターがヒープ オブジェクトの一部を指している場合、呼び出しサイトに関連付けられたメタデータにより、ガベージ コレクターはそのオブジェクトへの参照を見つける場所を知ることができるため、オブジェクトを妨害しないことがわかります。

unsafe関数またはアンマネージ コードによって作成または渡されるポインターは異なります。安全でない関数またはアンマネージ コードが何かへのポインターを持っている場合、関数呼び出しより長く存続し、ガベージ コレクターが認識しない方法でそれを格納する可能性があります。ガベージ コレクターがヒープ オブジェクトを妨害しないように明示的に指示できる手段は存在しますが、そのような手法の使用には危険が伴います。

ポインターを使用refする圧倒的に強い理由がない限り、参照によってパラメーターを渡すために使用します。両方の手法が一貫して正しく機能する場合は、ポインターを渡すのと同じくらい高速になる傾向があります。

于 2012-04-19T21:19:38.980 に答える