質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

5932閲覧

C#の値型を参照したままにする方法

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/06/25 19:17

お世話になります。

Aというクラスのフィールド変数(値型)を
Bというクラスで参照を保持しておきたい場合は、
どのような方法がありますでしょうか?
※用途は色々あるので、用途は今回は考えず、
単に別のクラスのフィールド(値型)の参照を保持する方法でご返信頂けると幸いです。

C/C++であれば、ポインタで渡し、
そのクラスのメンバー変数がそのポインタを保持していれば良いのですが、
C#の場合ですと、ref等で値型を参照渡しできますが、
それを保持しておくにはどうすれば良いのかが分からず、質問させて頂きました。

以上、宜しくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2020/06/25 19:31

「用途は色々ある」の一例を教えて下さい。 フィールドを直接公開して別クラスからアクセス可能にしようとすること自体がどうなの?という疑問があります。 クラスAのインスタンス自体をクラスBが参照すれば問題は解決すると思いますが。
KOZ6.0

2020/06/25 23:40

やってやれないことはないですが 「C#でClass層にある変数へポインタ参照」 https://teratail.com/questions/261876 C# らしくないので、こんなことするなら C/C++ で書けばいいのでは?
退会済みユーザー

退会済みユーザー

2020/06/26 01:09

C#を使う環境なので、C/C++で書くことはできません。 また、今回はフィールドを保持するか、それともそのクラスを保持するか(結局はこの方法で対応します。ベストアンサーに対する方で返信しておりますのでご参照ください)の違いですので、C#らしくないというのは少し問題の意図とは違う気がします。
退会済みユーザー

退会済みユーザー

2020/06/26 01:35

> gentaroさん 個人的な活動でのプログラムですが、関わっているプログラマーが他にもいる為、 パッと思いつく事例がいくつかあるのですが共有できない形となります(それ以外で一例がパッと思いつけば良かったのですが・・・) フィールドを直接公開しの部分ですが、値型ではないモノを公開すれば全て同じような事になりますので、「別クラスからアクセス可能にしようとすること自体はどうなの?」というのは問題ないと思います。
Zuishin

2020/06/26 01:45

https://ufcpp.net/study/csharp/oo_conceal.html > メンバー変数はクラス外部から直接アクセス出来ないようにして、オブジェクトの状態の変更はすべてメソッドを通して行うべきだということです メンバー変数というのはフィールドのことです。特別な理由がない限り、フィールドを直接公開するのは避け、プロパティを公開します。
退会済みユーザー

退会済みユーザー

2020/06/26 02:11

フィールドはprivateでアクセッサ(プロパティ含む)を通してというのは同じ意見です。 ただし、アクセッサを通して参照型を返した場合は、結局のところ返答させて頂いた事になるかと思います。
Zuishin

2020/06/26 02:13

どの返答のことかわかりませんし、参照型が何を指しているかもわかりませんが、公開されていないフィールドを外からアクセスするのは無理です。
gentaro

2020/06/26 23:08

> フィールドを直接公開しの部分ですが、値型ではないモノを公開すれば全て同じような事になりますので、「別クラスからアクセス可能にしようとすること自体はどうなの?」というのは問題ないと思います。 > フィールドはprivateでアクセッサ(プロパティ含む)を通してというのは同じ意見です。 ただし、アクセッサを通して参照型を返した場合は、結局のところ返答させて頂いた事になるかと思います。 要するにカプセル化という考え方を否定するということですね。 なんか宗教が違うみたいなので、これ以上突っ込まないようにします。
guest

回答1

0

ベストアンサー

C#でポインタは当然使えません。

それに近しいことを行いたい場合は参照型であるAクラスのインスタンス自体をBクラスが持つように設計すれば良いと思います。(オブジェクト指向におけるコンポジション)

C#

1using System; 2 3public class Sword{ 4 public int PhysicalAttack { get; set; } 5} 6 7public class Fighter{ 8 public Sword PrimarySword { get; set; } 9} 10 11public class Program{ 12 public static void Main(){ 13 var sword = new Sword { PhysicalAttack = 10 }; 14 var fighter = new Fighter { PrimarySword = sword}; 15 Console.WriteLine(fighter.PrimarySword.PhysicalAttack); // 10 16 sword.PhysicalAttack = 25; 17 Console.WriteLine(fighter.PrimarySword.PhysicalAttack); // 25 18 } 19}

投稿2020/06/25 19:26

編集2020/06/26 02:55
BluOxy

総合スコア2663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/26 01:03

ご返信いただきましてありがとうございます。 やはり、そのようなやり方での対応となりますよね。 (同じ方法で対応はしておりまして、ただ他にやり方がもしかしたらあるかもしれないと質問を投稿させていただきました)。 同じ方法で今後も実装していきたいと思います。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2020/06/26 02:13

BluOxyさんのご返答頂いた部分の「C#でポインタは当然使えません。」のところに対しての補足説明ですね。 たしかにunsafeでポインタを使う事は可能ですね。
BluOxy

2020/06/26 19:54 編集

すみません。夜中で寝ぼけていたか、ポインタは使えないと断言していました。 ご指摘ありがとうございます。 IntPtrとunsafeキーワードを使ってポインタを利用することができますが、C#を使うメリットの1つであるガベージコレクションが働かず、Marshal.FreeHGlobalを明示的に呼び出す必要があるので、あんまりおすすめはしない方法です。(パフォーマンスを求めている場面であれば、C++/CLIのdllを生成し、C#で読みだすようにすれば良いと思います) ref ローカル変数は初めて知りました。勉強になります。 これはnew-summerさんの求めている機能に見えますが、いかがでしょうか。
退会済みユーザー

退会済みユーザー

2020/06/26 03:01

BluOxyさん、ご返信いただきましてありがとうございます。 refローカル変数は、C# 7.0以降の機能らしいので、今の環境ですと言語仕様的に使えない状況となります。 今後、C# 7.0以降を使用する場合は検討してみます。
Zuishin

2020/06/26 03:11

保守ならともかく作成中のプロジェクトでそんなに古い環境を使っているのは想像できないので、次に質問する時には質問に環境を明示するようおすすめします。新しいバージョンでのみ使用可能な機能は多くあります。
退会済みユーザー

退会済みユーザー

2020/06/26 03:27

保守かどうか等、また「そんなに古い環境」に言及するのは良くないかと。 それは人それぞれですし、最新を使わなければいけない事もありませんし、環境の縛りというのは必ずありますから。 そう書かれることによって、他の人達に対しても質問しづらい環境が生まれませんか(最低でも私はそう感じてますよ) ここは以上でクローズとします。
kenshirou

2020/06/26 03:36

多分、古い環境を軽蔑する意味ではなく、環境の縛りがポイントになる場合があるので、質問事項に環境の情報を出して欲しい、ということを言いたいのではないかと思います。 言葉の「アヤ」だと思った方がよいです。
Zuishin

2020/06/26 03:36

だから環境を最初から書けという意味ですが?
Zuishin

2020/06/26 03:37

kenshirou さんのおっしゃる通りです。
退会済みユーザー

退会済みユーザー

2020/06/26 04:34

kenshirouさん、ご返信いただきましてありがとうございます。 kenshirouさんの仰ってることはすごく理解出来ます。 1つ前の私の返信もそれを理解した上で敢えて書いておりまして 言葉のアヤだと思いますが、プログラム的な内容で返信頂けるのはすごく有り難いのですが、 「そんなに古い環境」やすぐ上にもありますが「最初から書け」等の言葉に良い感じを受け取れず、 質問しづらい環境を生む可能性があると思い、言及させていただきました。 また、現状、主旨と違う感じになってきておりますのでクローズ発言もさせていただきましたが、 再度これ以上は質問の本質とは違う書込になりますので返信をしない形となりますが宜しくお願いします。(kenshirouさん、お気遣いありがとうございます)
Zuishin

2020/06/26 04:38

質問するときは環境を書くという常識を教えてもらって言いがかりをつけるようなやつが質問しにくくなっても、メリットしかありません。
Zuishin

2020/06/26 04:40

要約すると「誰に向かって口をきいてるんだ?」ということなんでしょうが、そんなの知りません。地元じゃ偉いんでしょうけど。
退会済みユーザー

退会済みユーザー

2020/06/26 04:52

「誰に向かって口をきいてるんだ?」「地元じゃ偉いんでしょうけど。」と全く思っていませんのと、なぜそのように思ったのか本当に驚きましたし、そのような事を書かれた事に本当に残念です。 逆にそのように書くということ自体、おそらくZuishinさんが私に対して思っていることなのかと思います。 先程からお伝えさせて頂いておりますが、プログラム以外の事が主旨になっているのでクローズさせて頂きます。
Zuishin

2020/06/26 04:58

何度もクローズクローズと独自用語を使われても意味不明です。 それだけ無駄コメントできるなら質問しにくくなることもないでしょう。残念です。
Zuishin

2020/06/26 05:09 編集

「クローズ」が日本語で「黙ってろ」という意味なら、そのような高圧的なマウントをするような質問者は要りません。質問しにくくなってください。
退会済みユーザー

退会済みユーザー

2020/06/26 05:02

何度もご返信いただきましてありがとうございます。 以上でクローズさせていただきます。
Zuishin

2020/06/26 05:03

ではこれでクローズします。これ以上はチラシの裏にでもどうぞ。
Zuishin

2020/06/26 05:05

それと埋もれてるけど、質問するときに環境を書くのは常識なので、次はしっかりしてください。二度の注意が必要ないことを願っています。 以上でクローズします。
Zuishin

2020/06/26 05:11

あと、Unity で内輪だけでゲームを新しく作るのに環境整えられないのはお粗末なので、そこは頑張った方がいいと思います。 以上でクローズします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問