[解決済み] 非同期メソッドにおけるrefとoutの引数
質問
どなたか、なぜ
async
メソッドに
ref
と
out
の引数?少し調べてみたのですが、スタックのアンロールと関係があるとしかわかりませんでした。
どのように解決するのですか?
非同期メソッドがrefとoutの引数を持つことができない理由を知っている人はいますか?
もちろんです。考えてみてください、非同期メソッドは通常
を返します。
をほぼ即座に返します。実際のロジックのほとんどが実行されるずっと前に...それは非同期で行われます。そのため
out
パラメータは最初の
await
式の前に割り当てる必要があります。
ref
の後に使われないようにするために、 パラメータに何らかの制限が必要かもしれません。
await
式の後に使われないようにするためです。
を持つ非同期メソッドを呼び出すことを考えます。
out
と
ref
パラメータで、引数にローカル変数を使用します。
int x;
int y = 10;
FooAsync(out x, ref y);
その後
FooAsync
が戻った後、メソッド自体が戻る可能性があります - したがって、それらのローカル変数はもはや論理的に存在しません... しかし、非同期メソッドはまだ効果的にその継続の中でそれらを使用することができます。大きな問題です。コンパイラはラムダ式と同じ方法で変数を捕捉する新しいクラスを作成することができますが、それは他の問題を引き起こします...他のことはさておき、あなたは
ローカル
変数がメソッド中の任意の場所で変化してしまう可能性があります。控えめに言っても、奇妙です。
基本的に、これは
out
と
ref
のパラメータは
async
メソッドに渡すパラメータは、タイミングを考慮すると 代わりに、関心のあるすべてのデータを含む戻り値の型を使用してください。
にしか興味がないのであれば
out
と
ref
の前に変化するパラメータは、最初の
await
式の前にパラメータが変化している場合は、常にメソッドを二つに分割することができます。
public Task<string> FooAsync(out int x, ref int y)
{
// Assign a value to x here, maybe change y
return FooAsyncImpl(x, y);
}
private async Task<string> FooAsyncImpl(int x, int y) // Not ref or out!
{
}
編集:実現可能でしょう。
out
パラメータを
Task<T>
を使用して、戻り値のようにメソッド内で直接値を代入することができます。しかし、それは少し奇妙なことであり、それは
ref
パラメータには使えません。
関連
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] C#がforeachで変数を再利用するのは理由があるのか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] キーワード「ref」と「out」の違いは何ですか?
-
[解決済み] Entity Framework 5 レコードを更新する
-
[解決済み] 非同期Task<T>メソッドを同期的に実行するにはどうしたらいいですか?
-
[解決済み] なぜC#は汎用属性型を禁止しているのですか?
-
[解決済み】IEnumerable vs List - What to Use? どのように動作するのでしょうか?
最新
-
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#
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み】非同期メソッドをアウトパラメータで書くには?