2

固定ブロックが必要な場合に少し混乱しています。以下に矛盾するシナリオを与える例があります。

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

へのポインタを取る関数を作成しましたHotelRoom

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

メインメソッドには次のものがあります。

unsafe static void Main(string[] args)
{
    HotelRoom[] myfloor = new HotelRoom[4];
    for (int i = 0; i < myfloor.Length; i++)
    {
        myfloor[i].Number = 501 + i;
        myfloor[i].Taken = false;
        myfloor[i].Category = (RoomType)i;
    }
    HotelRoom Room =  myfloor[1];
    Reserve(&Room);   //I am able to do this without fixed block.
    //Reserve(&myfloor[1]);  //Not able to do this so have to use fixed block below. 

    fixed (HotelRoom* pRoom = &myfloor[1])
    {
        Reserve(pRoom);
    }

    myfloor[1].Print();
    Room.Print();
}

私の混乱は、私にはできるができReserve(&Room)ないということReserve(&myfloor[1])です。彼らは同じことをしていると思います-HotelRoom構造体のメモリアドレスをReserve関数に渡します。なぜこれfixedを行う必要があるのですか?

4

2 に答える 2

1

Roomスタックに格納されるローカル変数ですがmyfloor、ヒープに格納されます。ガベージ コレクターは、ヒープ内のオブジェクトを移動して圧縮することができるため (アドレスは変更されます)、それらを「固定」する必要があります。だからこそ、fixed陳述書が必要です。

アップデート:

また、ヒープではなくスタックにメモリを割り当てる方法があります。

HotelRoom* fib = stackalloc HotelRoom[4];

この場合、申告は必要ありませんfixed

小さな免責事項:これができるからといって、もちろんそうすべきだというわけではありません。他の人が既に述べたように、これは .NET 以外のコードの書き方であるため、この質問は理論的なものだと考えています。

于 2012-04-19T12:05:20.080 に答える
1

これは単なる使い捨ての例ですか?

また...

C++ を C# に書き直そうとしていると思います。を使用する必要はほとんどありません。.NETunsafeの主なポイントは、それがマネージド フレームワークであることです。

ここで私が完全に間違っていない限り (すべてのコードがマネージ コードとして記述されている可能性があります)、アンマネージ コードとマネージ コードの違い、特に C++ のバックグラウンドから来た C# の記述方法を読む必要があります。

これらを見てください:

「マネージド」と「アンマネージド」の違いは何ですか?

マネージド コードとアンマネージド コードの違いは?

C++ 開発者向けの C#

.NET ブック ゼロ

( C# の書籍や C++ 開発者向けの Web サイトから編集[終了] )

于 2012-04-19T12:07:15.493 に答える