[解決済み】オブジェクトを渡すときに'ref'キーワードを使用するのはなぜですか?
2022-03-26 02:44:44
質問
オブジェクトをメソッドに渡す場合、なぜ ref キーワードを使用しなければならないのですか?いずれにせよ、これはデフォルトの動作ではないのでしょうか?
例えば
class Program
{
static void Main(string[] args)
{
TestRef t = new TestRef();
t.Something = "Foo";
DoSomething(t);
Console.WriteLine(t.Something);
}
static public void DoSomething(TestRef t)
{
t.Something = "Bar";
}
}
public class TestRef
{
public string Something { get; set; }
}
出力は "Bar" で、これはオブジェクトが参照として渡されたことを意味します。
どのように解決するのですか?
を渡す。
ref
オブジェクトが何であるかを変更したい場合。
TestRef t = new TestRef();
t.Something = "Foo";
DoSomething(ref t);
void DoSomething(ref TestRef t)
{
t = new TestRef();
t.Something = "Not just a changed t, but a completely different TestRef object";
}
DoSomethingを呼び出した後。
t
は、元の
new TestRef
というように、全く別のオブジェクトを指しています。
この方法は、例えば、不変のオブジェクトの値を変更したい場合にも便利です。
string
. の値を変更することはできません。
string
は、一度作成された後、それが しかし
ref
のように、文字列を別の値に変更する関数を作成することができます。
を使用するのは
ref
が必要です。使用方法
ref
は、引数を他のものに変更する自由をメソッドに与えます。メソッドの呼び出し側は、この可能性を確実に処理するようにコード化する必要があります。
また、パラメータの型がオブジェクトである場合、オブジェクト変数は常にオブジェクトへの参照として動作します。つまり
ref
キーワードを使用すると、参照への参照を得たことになります。これにより、上記の例で説明したようなことができるようになります。しかし、パラメータの型がプリミティブな値である場合(例えば
int
) の場合、このパラメータをメソッド内で代入すると、メソッドが戻った後に渡された引数の値が変更されることになります。
int x = 1;
Change(ref x);
Debug.Assert(x == 5);
WillNotChange(x);
Debug.Assert(x == 5); // Note: x doesn't become 10
void Change(ref int x)
{
x = 5;
}
void WillNotChange(int x)
{
x = 10;
}
関連
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] EqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドすることが重要な理由は何ですか?
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] キーワード「ref」と「out」の違いは何ですか?
-
[解決済み] LINQで.Firstと.FirstOrDefaultを使用するタイミングは?
-
[解決済み】C#のyieldキーワードは何に使われるのか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】HRESULTからの例外:0x800A03ECエラー