[解決済み】C#でオブジェクトを参照または値で渡す
質問
C#では、非プリミティブ変数は参照渡し、プリミティブ値は値渡しと考えてきました。
つまり、メソッドに非プリミティブなオブジェクトを渡すと、メソッド内でそのオブジェクトに対して行われたことは、渡されたオブジェクトに影響を与えるということです。(C# 101的な話)
しかし、System.Drawing.Imageオブジェクトを渡すと、そうではないような気がするのですが?System.Drawing.Image オブジェクトを別のメソッドに渡して、そのオブジェクトに画像をロードし、そのメソッドをスコープ外に出して呼び出し元のメソッドに戻した場合、その画像は元のオブジェクトにロードされないのでしょうか?
これはなぜですか?
解決方法は?
対象物 は全く渡されません。デフォルトでは、引数は評価され、その 値 は、呼び出すメソッドのパラメータの初期値として、値で渡されます。ここで重要なのは、valueは参照型のための参照、つまりオブジェクト(または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(...);
}
私は の記事で、もっと詳しく説明しています。 . 基本的に、quot; pass by reference"は、あなたが考えているような意味ではないのです。
関連
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み] [Solved] アセンブリ System.Web.Extensions dll はどこにありますか?
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み] 投げる」と「投げる元」は違うのですか?
-
[解決済み] 変数を参照渡しする方法を教えてください。
-
[解決済み] ディープクローンオブジェクト
-
[解決済み] C#でenumからint値を取得する
-
[解決済み】Rubyの受け渡しは参照渡しなのか値渡しなのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み] 関数を終了するには?
-
[解決済み】WebResource.axdとは何ですか?