C# では、非プリミティブ変数は参照によって渡され、プリミティブ値は値によって渡されると常に思っていました。
したがって、メソッドに非プリミティブ オブジェクトを渡す場合、メソッド内でオブジェクトに対して行われたすべての操作は、渡されるオブジェクトに影響します。(C# 101 の内容)
しかし、System.Drawing.Image オブジェクトを渡すと、そうではないようです。system.drawing.image オブジェクトを別のメソッドに渡し、そのオブジェクトにイメージをロードしてから、そのメソッドをスコープ外にして呼び出し元のメソッドに戻した場合、そのイメージは元のオブジェクトにロードされませんか?
どうしてこれなの?
ベストアンサー1
オブジェクトはまったく渡されません。デフォルトでは、引数が評価され、その値が、呼び出しているメソッドのパラメータの初期値として値渡しされます。ここで重要な点は、値が参照型に対する参照、つまりオブジェクト (または null) を取得する方法であるということです。そのオブジェクトへの変更は、呼び出し元から確認できます。ただし、すべての型のデフォルトである値渡しを使用している場合、パラメータの値を別のオブジェクトを参照するように変更しても、確認できません。
参照渡しを使用する場合は、パラメータの型が値型か参照型かに関係なく、または を使用する必要があります。その場合、実質的には変数自体が参照渡しされるため、パラメータは引数と同じ格納場所を使用し、パラメータ自体の変更は呼び出し元に表示されます。out
ref
それで:
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(...);
}
を持っていますこの記事でさらに詳しく説明します基本的に、「参照渡し」はあなたが考えている意味とは異なります。