- ベストアンサー
C#で同じインスタンスを何度もnewしてよいでしょうか?
すもあん(@ryoyama)の回答
- すもあん(@ryoyama)
- ベストアンサー率56% (45/80)
1: A a = new A(); 2: a = new A(); 1で作成されたインスタンスはaという変数で参照することができます。 2で新たなインスタンスを作ってaという変数で参照することができるようになります。1で作成されたインスタンスを参照できる変数はなくなりますので、いずれガベージコレクタによって破棄されます。 1: A a = new A(); 2: A a = new A(); 同じメソッド内に同じ変数名を再度宣言することはできませんよ。「ローカル変数 'a' はこのスコープで既に定義されています。」というコンパイルエラーが出るはずです。 同じ変数で違うインスタンスを参照させることについては問題ありません。ただ、変数の使い回しがコードのメンテナンス性、可読性の面でいいかというと、「???」です。ご質問とは別の問題ですが、気をつけたほうがいいと思います。
関連するQ&A
- C#のインスタンスを参照渡ししたい
メインのクラスAにウェブブラウザAがあります。 クラス A { メソッドA(){ ウェブブラウザA.Navigate(URL); } メソッドC(){ MessageBox.Show("これは成功"); } } クラス B { メソッドB(ウェブブラウザA){ ウェブブラウザA.Navigate(URL);//成功 } A a = new A(); a.メソッドA();//失敗 a.メソッドC();//成功 } このようなプログラムを作っています。 クラスBをインスタンスして実行すると クラスBのメソッドBは成功しますが、クラスAの方で宣言しているa.メソッドAは失敗します しかし、a.メソッドC();は成功します。 これは、a.メソッドAは、その上のA a = new A();でつくられた新しいインスタンスのなかで処理がされていて起動時につくられたクラスAのインスタンスとは別のものになっているからだと思うのですが、まちがいないでしょうか? この処理を成功させたい場合、起動時に作られたクラスAのインスタンスをメソッドBの引数に参照渡しですれば、 メソッドB(ウェブブラウザA){ ウェブブラウザA.Navigate(URL);//成功 メソッドA(); } も可能なのではないかと考えているのですが、可能でしょうか?またそのインスタンスを引数にする方法はどのようなものでしょうか? ちなみに、クラスBはDLLに置いてあり、メソッドAは複数のDLLで使うので毎度書くのは面倒なのでクラスAの中で呼び出して使いたいと考えています。
- ベストアンサー
- C・C++・C#
- newしないインスタンス?実体化しなくてもいいの?
JAVAについて教えて下さい。 ServletContext application = getServletContext(); の成り立ちの意味なのですが、newがなぜないのか教えて下さい。 ~自身の考え~ (1)サーブレットコンテキストというクラスをインスタンス化して (サーブレットコンテキスト 変数A = new サーブレットコンテキスト();) ↑ ↑ クラス クラス (2)変数Aドットメソッド()によって、代入変数Bを作り上げる (サーブレットコンテキスト 代入変数B = 変数A . メソッド();) (3)のはずが、上記の式にはnewがありません。 なんで?? ~~ ~疑問点~ もしかしたらHttpServletでimportしているからそこでnewインスタンス化宣言している? だとするならどのような式になっているのでしょうか。 もしくはメソッドのF3キーとして上位をたどったときに出てきた public abstract class GenericServlet implements Servlet, ServletConfig, Serializable { public ServletContext getServletContext() { return getServletConfig().getServletContext(); } } として抽象クラスが出てきましたが、どこにもnew実体化していません。 よろしくお願いいたします。
- ベストアンサー
- Java
- インスタンス化されているかの情報を 知るメソッド
VisualStudioC#で Aというクラスがあり、それを B,Cというクラスでインスタンスで使用したとします。 A: { ?????? } B: { A a = new A(); } C: { A a = new A(); } Aクラスの中の処理でB,Cのどちらでインスタンス化されているのかという情報を 知るメソッドはあるのでしょうか? ちなみにインスタンス化するときにAに引数などを送り込まないこととします。
- ベストアンサー
- Microsoft ASP
- newを書く場所とか挙動について、分からないので
newについて、幾つか分からないことがあるので、教えてください ■newしたら、その状態はどこまで保持されるのでしょうか? あるサイトに、 >PHPスクリプトは、処理が全て終了すると共に、メモリは開放されます と書かれていたのですが、 この場合の「処理」は、何を意味するのでしょうか? ファイルの一番最後まで来たら、newで確保した何かは自動的に解放される、 という意味でしょうか? <例> ・a.php ・b.php ・c.php … クラス記述 ・aからbへPOST ・aでもbでも、cのクラスを利用したい この場合、a、b両方のファイルに、必ず、new C と書かなければいけないのでしょうか? それとも、ファイルaにだけ、new C と書いて、 bで、require_once("a.php");としてもよいのでしょうか? あるいは、他に何か書き方があるのでしょうか? <選択肢> ・使いたいファイルで必ずnewする必要がある ・使いたいファイルで必ずしもnewする必要はない ■インスタンス名は違ってもよいのでしょうか? 上記例で、 ・ファイルaに、hoge1=new C; ・ファイルbに、hoge2=new C; とやってみたらエラーにならなかったのですが、 ということは、例えば同じクラスを複数のファイルで利用したい場合、 どうするのがいいのでしょうか? <選択肢> ・new する際、常に同じインスタンス名を利用 ・new する際、ファイル毎に異なるインスタンス名を利用 ・new する際のインスタンス名は、同じでも違っても、どっちでもよい
- ベストアンサー
- PHP
- C++のnewで確保した領域について
こんにちわ。C++を勉強し始めた者です。 new演算子を使ってインスタンスを生成した場合、それはスタックではなくヒープ領域に確保され、不要になったらdeleteを使って領域を解放しなければいけない認識です。 C++の初心者向けサンプルコードを見ていて疑問があったので質問させてください。 (例)クラスA.cpp ======================== #include <Car> #include <Garage> ~略~ クラスAのコンストラクタ{ Car *mycar = new Car("プリウス"); addGarage( mycar ); } クラスAのデストラクタ{ } ======================== 上記のような実装のクラスAがあったのですが、コンストラクタでCarクラスのインスタンス生成をして、オート変数の*mycarに格納して、Garageの公開関数に渡しています。 質問1:このクラスAをインスタンス生成した場合、コンストラクタで確保したヒープ領域は、プログラム終了時まで解放されない認識であっていますか? 質問2:オート変数の*mycarはコンストラクタからreturnした時点で解放されてしまうので、今のままではデストラクタでヒープ領域をdeleteできない認識であっていますか? 質問3:newで生成したインスタンスへのポインタは、その関数内でdeleteしない場合、メンバ変数やstatic変数、グローバル変数に格納しなければdeleteできなくなるという理解であっていますか? 質問4:C++のコードでnewした戻り値をオート変数に格納するプログラムは通常使うことはあるのですか?
- ベストアンサー
- C・C++・C#
- 同一クラスインスタンス名で別クラスのインスタンス作成方法(C++)
下記ソース(Java)の処理をするような、C++の実装方法を教えていただきたいです。 【処理内容】 クラスBのインスタンスを保持しており、クラスBのインスタンス名と同一であるクラスAのインスタンス生成 ClassA A_Instance = (ClassA)Class.forName(B_instance.name).newInstance(); 要はクラスインスタンスの名前の求め方がわからないのです。それさえわかれば、newしてクラスポインタを返すメソッドを用意すれば何とかなると考えていますが。 ※C++のAPI一覧はどこにあるのだろうか・・・
- 締切済み
- C・C++・C#
- C++ Builderでのnewコマンドについて
ファイルのコピーの際に利用する TStringList、TStringsについてお聞きしたいのですが、 TStringList *ABC = new TStringList; TStrings *DEF = new TStringList; 上記のように宣言し、 ABC->コンポーネント1、DEF->コンポーネント2のように 使うのですが、両方とも上記宣言の右辺がなぜこのように なるのでしょうか?なぜ2番目の宣言は左辺にTStringsと 記載していて右辺がTStringListなのでしょうか? そもそもここで記載しているnewの意図や 通常のC言語のポインタの宣言とどう違うのかが 掴めません。どうか初心者でもわかるように 教えていただけないでしょうか?
- ベストアンサー
- C・C++・C#
- インスタンス化について
.NETでのインスタンス化について .NETでプログラムの勉強をしています。インスタンスについてお教えください。 ↓では、「sr」はnewキーワードを使ってインスタンス化しています。 ********************************************************************************** //"C:\test.txt"をShift-JISコードとして開く System.IO.StreamReader sr = new System.IO.StreamReader( @"C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); //内容をすべて読み込む string s = sr.ReadToEnd(); //閉じる sr.Close(); //結果を出力する Console.WriteLine(s); ↓では、「enc」はnewキーワードを使ってインスタンス化していません。 ********************************************************************************** //読み込むテキストファイル string textFile = "C:\\text.txt"; //文字コード(ここでは、Shift JIS) System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis"); //テキストファイルの中身をすべて読み込む string str = System.IO.File.ReadAllText(textFile, enc); //行ごとの配列として、テキストファイルの中身をすべて読み込む string[] lines = System.IO.File.ReadAllLines(textFile, enc); ********************************************************************************** 質問1: インスタンス化させる時にはnewキーワードが必要だと思っていましたが、「enc」はnewキーワードが使用されていません。 なぜでしょうか? 質問2: System.IO.StreamReader sr = new System.IO.StreamReader( @"C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); 上記のように、newと同時にパスやエンコーディングを引数として渡しています。この事をコンストラクタとよぶのでしょうか? Googleで調べていますが、いまいち意味がわかりません・・・物凄くひらたくいうとどういったことなのでしょうか?何かプログラムではない、一般的な事で例えて頂けるとありがたいです。 宜しくお願い致します。
- ベストアンサー
- その他(プログラミング・開発)
- インスタンス破棄時にメモリが解放されるようにしたい
C++言語でプログラムを作成しています あるクラスでインスタンス生成時に動的にメモリを割り当てた後 インスタンスが破棄されるまでそれを使用し インスタンス破棄時に解放するにはどうしたらいいでしょうか デストラクタで解放処理を実装すると 明示的にデストラクタが呼ばれた際に解放されてしまい インスタンスが破棄されるまで使用できませんでした
- ベストアンサー
- C・C++・C#
- newと配列?
基本的な質問になるのですが、 例が書かれているサイトが見つからない為、質問とさせていただきたいと思います。 自分はUNIXでCの開発を行っていたのですが、C++に関してはよくわかりません。 CString a[10]; と CString a = new CString[10]; の違いを教えていただけないでしょうか? newを行い、deleteをすることで、 コンストラクタ、デストラクタを呼び出せる事はわかるのですが、 それ以外の違いはどのような点になるのですか? インスタンスについて理解できていないのでこのような 基本的な質問となりますが、ご教授願います。
- 締切済み
- C・C++・C#
お礼
回答ありがとうございます。 2つ目のコードについては、おっしゃるとおり2つ宣言はできないみたいですね。 ただ、ループの中に「A a = new A();」 と宣言を入れた場合、メモリ的にはどうなるのでしょうか。(もしかしてこれもできない!?) よろしくお願いします。