0

次のような Texture2D を保持するクラスがあります。

public class TextureData
{
    public Texture2D texture;
}

すべてのテクスチャをロードするときは、次のような方法で処理します。

public void LoadAllTextures()
{
    foreach(string s in texturesToBeLoaded)
    {
        TextureData data = new TextureData();
        LoadTexture(s, data.texture);
        // data.texture is still null.
    }
}
public void LoadTexture(string filename, Texture2D texture)
{
    texture = content.Load<Texture2D>(filename);
    // texture now holds the texture information but it doesn't
    // actually retain it when the method ends...why?
}

ここで何か不足していますか?私が変われば

public void LoadTexture(string filename, Texture2D texture)

public void LoadTexture(string filename, out Texture2D texture)

それは正常に動作します。


編集:わかりましたので、私が今それを理解する方法はこれです...

public void LoadAllTextures()
{
    foreach(string s in texturesToBeLoaded)
    {
        TextureData data = new TextureData();
        // here, data.texture's memory address == 0x0001
        LoadTexture(s, data.texture /*0x0001*/);
    }
}
public void LoadTexture(string filename, Texture2D texture /* this is now 0x0001 */)
{
    texture = content.Load<Texture2D>(filename);
    // now the PARAMETER is set to 0x0002, not data.texture itself.
}
4

4 に答える 4

3

C# は変数を値で渡します。参照のコピーが渡されますが、元の変数またはフィールドは変更されません。out(または) を追加refすると、参照渡しになり、元の変数/フィールドが更新されます。

于 2012-08-15T10:11:16.363 に答える
1

ルセロの答えは正しいです。実際に行う変更は、メソッドを次のように変更することです。

public void LoadAllTextures()
{
    foreach(string s in texturesToBeLoaded)
    {
        TextureData data = LoadTexture(s);
        // do something with data here
    }
}

public Texture2D LoadTexture(string filename)
{
    Texture2D texture = content.Load<Texture2D>(filename);
    return texture;
}
于 2012-08-15T10:15:00.810 に答える
1

これは、参照のコピーを変更しているためです。以前data.textureはメモリ位置を指していたと仮定します。パラメータ texture048を呼び出すと、値が保持されます。メソッドの最初の行では、新しいメモリの場所を割り当てているため、まったく新しいものを指していますが、. 変化が見られないのはそのためです。LoadTexture(s, data.texture);048LoadTexturetexture048

ただし、 のプロパティを更新するtextureと、元のデータも変更されます。

次のケースを検討してください。

public class TempClass
{
    public string MyProperty { get; set; }
}

あなたのMain方法では、次のことができます:

TempClass tc = new TempClass();
tc.MyProperty = "Some value";
SomeMethod(tc);

あなたの SomeMethod は次のとおりです。

public static void SomeMethod(TempClass temp)
{
    temp = null;
}

これで、オブジェクトtcTempClassnull に設定されなくなりました。

Jon Skeet によるこの記事を参照してください: C# でのパラメーターの受け渡し

于 2012-08-15T10:15:54.153 に答える
1

混乱はおそらく、参照渡しの意味から来ています。C# では、オブジェクトは参照によって渡されます。これは、関数内のオブジェクトのプロパティを変更すると、それらの変更が呼び出し元の関数に反映され、両方が同じオブジェクトへの参照を持つことを意味します。ただし、参照渡しとは、関数内の別のオブジェクトを参照するように変数を更新した場合 (たとえば、新しいオブジェクトを作成することによって)、呼び出し元の関数内の変数が同じオブジェクトを参照するように更新されるという意味ではありません。これが必要な動作である場合は、ref または out を使用する必要があります。

于 2012-08-15T10:17:24.277 に答える