C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

【C#】using変数を関数に参照渡し?するには

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■100661 / inTopicNo.1)  【C#】using変数を関数に参照渡し?するには
  
□投稿者/ モモ (1回)-(2022/10/11(Tue) 22:36:31)

分類:[C#] 

このような
----------------------------
using (var db = new BookDbContext())
{
try
{
this.aaafunc(ref db);
db.SaveChanges();
}

}
----------------------------

private void aaafunc(BookDbContext ref pardb) {

// ※pardbに対する追加処理等

}
----------------------------
処理を実装したい場合にusing変数を別のローカル関数に参照渡しをしようとするとコンパイルエラー
「エラー CS1657 'db' は 'using 変数' であるため、ref 値または out 値として使用することはできません」
になります。
参照渡しにしなければdbにレコードが追加されないのでSaveChanges()で保存しても空のままです。
ローカル関数にしなければもちろん可能ですが、レコード追加処理の行数が多いのでできればこのように別に出していしまいたいです。
この場合はusingステートメントは諦めてfinallyで処理するしかないでしょうか?
よい記述方法があれば教えてください。
よろしくお願いいたします。
引用返信 編集キー/
■100664 / inTopicNo.2)  Re[1]: 【C#】using変数を関数に参照渡し?するには
□投稿者/ Azulean (1257回)-(2022/10/12(Wed) 07:21:53)
No100661 (モモ さん) に返信
> 参照渡しにしなければdbにレコードが追加されないのでSaveChanges()で保存しても空のままです。

こういった結果になると言うことは、BookDbContext は「構造体」(値型)ということですよね?
「クラス」(参照型)に変更することを検討したいところです。


> この場合はusingステートメントは諦めてfinallyで処理するしかないでしょうか?

そうするしかありませんが、ref で渡すと値を入れ替えできるので、呼び出し元からすると「不安でしかない」という状態です。
こういった事態を避ける意味でも、私ならクラスを選びます。


private void aaafunc(BookDbContext ref pardb) {
  // 誤ってこういったコードを書いてしまうと、呼び出し元でDisposeすべきだったBookDbContextは失われる
  paradb = new BookDbContext(); 
}

引用返信 編集キー/
■100665 / inTopicNo.3)  Re[2]: 【C#】using変数を関数に参照渡し?するには
□投稿者/ モモ (2回)-(2022/10/12(Wed) 08:20:02)
お返事ありがとうございます!

BooksDbContextの内容はこんな感じです。
------------------------------------
public class BooksDbContext : DbContext {

public BooksDbContext()
: base("name=BooksDbContext") {
}

public DbSet<Book> Books { get; set; }
}
------------------------------------
クラウドにあるSQLServerへの更新用です。

このコンテキスト内にあるBooks(テーブル)にデータを追加・更新・削除し
それをSaveChangesで保存したいです。
using内に直に書けばもちろん問題ありませんが、
別の関数に出してしまいたいのでお知恵をお借りできますと幸いです。

引用返信 編集キー/
■100666 / inTopicNo.4)  Re[3]: 【C#】using変数を関数に参照渡し?するには
□投稿者/ 伝説のカレー (44回)-(2022/10/12(Wed) 09:33:12)
No100665 (モモ さん) に返信
んんん??? 値渡しで更新できそうなものですけどね、なんでダメなんだろ

引用返信 編集キー/
■100667 / inTopicNo.5)  Re[1]: 【C#】using変数を関数に参照渡し?するには
□投稿者/ WebSurfer (2573回)-(2022/10/12(Wed) 09:41:58)
No100661 (モモ さん) に返信

> この場合はusingステートメントは諦めてfinallyで処理するしかないでしょうか?
> よい記述方法があれば教えてください。

何を何で作っているか書けませんか? 

BookDbContext を Dispose するのが問題なのだろうと想像してますが、であれば、
もし、ASP.NET MVC アプリを .NET Framework で作っているということならそれな
りのやり方がありますし、.NET Core / .NET で作っているなら DI を使うという
やり方があります。
引用返信 編集キー/
■100668 / inTopicNo.6)  Re[4]: 【C#】using変数を関数に参照渡し?するには
□投稿者/ モモ (3回)-(2022/10/12(Wed) 09:46:20)
ホントですね!
よく考えたらおかしいです。
だとするとここではなくトランザクションがうまくいっていない可能性あります!
確認します。
このたびはお騒がせしました、、。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ