C# でオブジェクトを参照または値で渡す 質問する

C# でオブジェクトを参照または値で渡す 質問する

C# では、非プリミティブ変数は参照によって渡され、プリミティブ値は値によって渡されると常に思っていました。

したがって、メソッドに非プリミティブ オブジェクトを渡す場合、メソッド内でオブジェクトに対して行われたすべての操作は、渡されるオブジェクトに影響します。(C# 101 の内容)

しかし、System.Drawing.Image オブジェクトを渡すと、そうではないようです。system.drawing.image オブジェクトを別のメソッドに渡し、そのオブジェクトにイメージをロードしてから、そのメソッドをスコープ外にして呼び出し元のメソッドに戻した場合、そのイメージは元のオブジェクトにロードされませんか?

どうしてこれなの?

ベストアンサー1

オブジェクトはまったく渡されません。デフォルトでは、引数が評価され、その値が、呼び出しているメソッドのパラメータの初期値として値渡しされます。ここで重要な点は、値が参照型に対する参照、つまりオブジェクト (または null) を取得する方法であるということです。そのオブジェクトへの変更は、呼び出し元から確認できます。ただし、すべての型のデフォルトである値渡しを使用している場合、パラメータの値を別のオブジェクトを参照するように変更しても、確認できません。

参照渡しを使用する場合は、パラメータの型が値型か参照型かに関係なく、または を使用する必要があります。その場合、実質的には変数自体が参照渡しされるため、パラメータは引数と同じ格納場所を使用し、パラメータ自体の変更は呼び出し元に表示されます。outref

それで:

public void Foo(Image image)
{
    // This change won't be seen by the caller: it's changing the value
    // of the parameter.
    image = Image.FromStream(...);
}

public void Foo(ref Image image)
{
    // This change *will* be seen by the caller: it's changing the value
    // of the parameter, but we're using pass by reference
    image = Image.FromStream(...);
}

public void Foo(Image image)
{
    // This change *will* be seen by the caller: it's changing the data
    // within the object that the parameter value refers to.
    image.RotateFlip(...);
}

を持っていますこの記事でさらに詳しく説明します基本的に、「参照渡し」はあなたが考えている意味とは異なります。

おすすめ記事