C#で、クラスのメンバーの値を出力する方法とは?

このQ&Aのポイント
  • C#の勉強したてなので、他クラスのメンバーの値を一つずつ代入&出力する方法がわかりません。
  • ループ文を使って効率的に他クラスのメンバーの値を入力し、出力する方法を教えてください。
  • メンバーが数十個あるので、効率よく値を入力し、出力する方法が知りたいです。
回答を見る
  • ベストアンサー

C#で、あるクラスのメンバーすべての値を出力したい

C#の勉強したて(Cの知識もへっぽこ)なので、以下のことをしたいのに、 さっぱりやり方が分かりません。 教えて君みたいな質問ですが、心の大きい方、どうぞ教えてくださいませ。 ★やりたいこと 他クラスのメンバー全部に値を入力し、かつそれを出力したい。 なお、他クラスのメンバーは数十個あるので、一つづつ代入&出力ではなく、 ループ文を使ったようなもので行えないかと模索中。 ★例 //住所録ファイルの内容をコンソール出力するプログラム。 using System; class Data_Format {   public string name;   public string address;   public string age; } class App{   public static void Read_Data(ref Data_Format obj){     obj.name = 略) テキストファイルの1行目から読込め     obj.address = 略) テキストファイルの2行目から読込め     obj.age = 略) テキストファイルの3行目から読込め   }   public static void Main() {     Data_Format ob = new Data_Format();     App.Read_Data(ref ob);     Console.WriteLine(ob.name);     Console.WriteLine(ob.adress);      Console.WriteLine(ob.age);   } } この例では Mainメソッドで、 3個のオブジェクト(ob.name, ob.address, ob.age)の内容を出力させるのに、 Conosole.WriteLineの文を3個書いています。 さらに、Read_Dataメソッドで 3個のオブジェクト(ob.name, ob.address, ob.age)の値を入力するのに、 3行費やしています。 (↑ファイルの1行目から順番に読ませるので、効率化できる??) しかし、実際に作りたいプログラムはメンバーが数十個あるので、 ループ文等を使えれば、効率よくなるのかな悪それでもいいのですが、 もっといい方があればご教授下さい。

  • jyuzou
  • お礼率77% (238/307)

質問者が選んだベストアンサー

  • ベストアンサー
  • jun2004
  • ベストアンサー率42% (24/57)
回答No.2

リフレクションを使えば動的に取得できます。 public class Data_Format { public string s1 = "1"; public string s2 = "2"; public string s3 = "3"; public string members() { string ret = ""; try { System.Reflection.FieldInfo[] fields = this.GetType().GetFields(); foreach(System.Reflection.FieldInfo f in fields) { ret += (string)f.GetValue(this) + "\n"; } } catch(Exception) { } return ret; } }

jyuzou
質問者

お礼

大変参考になりました。 どうもありがとうございました。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

Data_Formatクラスに、 メンバをコンソールプリントするようなメソッドを 作ればいいと思いますが。

関連するQ&A

  • C#について

    using System; class AddressBook: PhoneBook { private string address; public AddressBook() : base() { address=""; } public void Input() { base.Input(); Console.Write("住所?"); string address=Console.ReadLine(); } public void Writes() { base.Write(); Console.WriteLine("住所:{0}",address); } } class kadai62 { public static void Main() { Console.Write("電話帳に入力する人数を入れてください:"); int n = int.Parse(Console.ReadLine()); AddressBook[] pb = new AddressBook[n]; int i; for (i = 0; i < pb.Length; i++) { pb[i] = new AddressBook(); Console.WriteLine("{0}番目を入力してください.", i+1); pb[i].Input(); } Console.WriteLine(); while(true) { Console.Write("どこから探しますか?[1:氏名,2:自宅電話,3:携帯電話,0:終了] "); int t = int.Parse(Console.ReadLine()); if (t == 0) break; Console.Write("探す文字列は?"); string s = Console.ReadLine(); for (i = 0; i < pb.Length; i++) { if (pb[i].Search(t, s)) pb[i].Writes(); } } } } このプログラムで public void Writes() { base.Write(); Console.WriteLine("住所:{0}",address); } のaddressが出力されません・・どうすれば 出力されますか?

  • C#の変数の範囲

    C#の変数の範囲 質問させてください。 以下は、ネットに掲載されていたC#の問題です。 ~ここから~ 下記のC#のコードを実行した場合、"Hello World!"と二行表示されます。 using System; class Program { static void Main(string[] args) { string s = "Hello"; Action a = () => Console.WriteLine(s); s += " World!"; a(); Console.WriteLine(s); } これを一行目だけ"Hello"と表示される場合、 Action a = () => Console.WriteLine(s);をどう書き換えればよいでしょうか。 1. Action a = () => Console.WriteLine("Hello!"); 2. Action<string> a = (s) => Console.WriteLine(s); 3. Action a = () => Console.WriteLine(t - " World!"); 4. string t = s; Action a = () => Console.WriteLine(t); 5. Action a = () => { string t = s; Console.WriteLine(t); }; ~ここまで~ 正解は4だそうですが、「何故」そうなるかがわかりません。 汗 私としては、1.4.も題意を満たす気がするのですが・・・。 お知恵をお貸しください。 出展 http://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_07/extremecs_07_10.html

  • C#のToString("c")

    C#で、テキストボックスに金額を記入し、のちに取り出して数値として使いたいのですが、ToString("c")でフォーマットして記入した場合は通貨記号が取れませんでした。 なぜでしょうか? 何か良い方法がありますでしょうか? よろしくお願いいたします。 //ToString("c")を使わないで記入した場合 textBox1.Text = "-\\12345"; string stTarget; stTarget = textBox1.Text; Console.WriteLine("1stTarget=" + stTarget); stTarget = stTarget.Replace(",", ""); Console.WriteLine("2stTarget=" + stTarget); stTarget = stTarget.Replace("\\", ""); Console.WriteLine("3stTarget=" + stTarget); //出力結果 //1stTarget=-\12,345 //2stTarget=-\12345 //3stTarget=-12345 //ToString("c")を使って記入した場合 int tempNum = -12345; textBox1.Text = tempNum.ToString("c"); stTarget = textBox1.Text; Console.WriteLine("1stTarget=" + stTarget); stTarget = stTarget.Replace(",", ""); Console.WriteLine("2stTarget=" + stTarget); stTarget = stTarget.Replace("\\", ""); Console.WriteLine("3stTarget=" + stTarget); //出力結果 //1stTarget=-\12,345 //2stTarget=-\12345 //3stTarget=-\12345

  • クラスにおける、メンバー変数の「$」の有無について

    クラスについて学習中です。 テキストに載っていた、以下のサンプルスクリプトについて質問があります。 (他言語の方々へ。PHPは特に指定しなかった場合、アクセス制限はpublicです) <?php class Book { var $name=""; function Book($name) { $this->name=$name; //6行目【注1】 } function display() { if ($this->n=="phpの本") {   //10行目 $file="php.txt"; echo join(file($file)); } else { echo "本がありません"; } } } $obj=new Book("本の名前"); //display()というメソッドを呼ぶ $obj->display(); //nameというメンバー変数を読み込む  echo $obj->name; ?> 今回の疑問・質問のスタートは6行目【注1】の箇所でした。 『疑問1』 nameと$nameは別物なんだろうか?(「=」で結べば中身が同じになるのは当然ですが、それ以前の概念?の話です) 『考察(予想)1』 おそらく別物だろう。もし同一なら6行目の式が意味を成さない(不要)だろうから。 『疑問2』 別物であるなら「name」とは何なのだろう?「メンバー変数」というものであることは知ったが、(関数や定数ではなく)変数の一種なのに、なぜ「$」が無いのだろう? 『考察(予想)2』 クラスやオブジェクトの記述で、「$this->」や「$obj->」などの後に続く場合は$を書かずに「メンバー変数」とすることが決まっている!?もしここに「$」を付けてしまうと、それは「$name」となってしまい、考察1と矛盾することになるから、おそらく、「決まり」なのだろう!? 『疑問3』 「$name」については3行目においてメンバー変数であることを宣言しているのに対し、「name」について宣言しないのはなぜだろう。 『考察(予想)3』 試しにnameについても「var name;」と書いてみたらエラーになった。やはり最初に宣言するときは「$」が必要なようだ。そうすると・・「$name」と書くはめになり、考察1と矛盾してしまう。 よし。試しに($nameではない)「name」の箇所を「nnnn」としてみよう。 (6行目、10行目、下から2・3行目の4箇所) こう変更してみても同様に動いたことで、「name」と「$name」は綴りを同じにしてるだけの別物だろうなのだろうと理解したつもりになりました。 そして、事前に「nnnn」を(var $nnnn;と)メンバー変数宣言することが可能であることも、もしくは「var $name;」を省略しても同様に動くことを確認しました。 ところが同時に新たな疑問が湧きました。 『疑問4』 「nnnn」を事前に宣言するときは「var $nnnn;」と、「$」を付けないとエラーになる。・・・え?とすると、元の「name」と「$name」の場合のスクリプト3行目の「var $name;」というのは、「name」について宣言してるのか、それとも「$name」について宣言してるのかどっちなのだろう?・・・同じこと?ってことは『考察1』の「別物である」は誤りなの?でもnameを「nnnn」と変えても同じように動くんだよね?・・・何がなんだかわからなくなってきた。 という状態なのです。 どなたか、このモヤモヤっとした疑問を消してください。 お願いします。

  • C#の数値の出力について

    下記のコードで cntLose の変数の数値を、コンソールに出力したいのですが、やり方が分からず、どなたか教えて頂けないでしょうか? 【ソースコード】 static class Program { static string userName; static int cntWin = 0; //勝利回数 static int cntLose = 0; //敗北回数 static int cntDraw = 0; //引分回数 //ユーザー名の入力 static void Main(string[] args) { string enterName = Console.ReadLine(); Console.WriteLine("ユーザ名を入力してください: {0}", enterName); userName = enterName; Start(); Resurut(); } static void Janken(ref string myHand) { // Random クラスの新しいインスタンスを生成する Random ran = new System.Random(); //コンピュータの出す手を1以上3以下に設定する。 string[] com = new string[] { "1", "2", "3" }; string con = com[ran.Next(3)]; //コンピュータが勝利した場合 if (((myHand == "1") && (con == "3")) || ((myHand == "2") && (con == "1")) || ((myHand == "3") && (con == "2"))) { Console.WriteLine("LOSE"); cntLose++; //敗北回数に加算 Console.WriteLine("{0}:cntWin勝、CPU:cntLose勝", userName); }

  • C# override

    某C#の入門書のサンプルですが、overrideがよくわかりません。 using System; using System.Collections.Generic; using System.Text; namespace PersonList {   class Person   {     public string name;     public int age;     public Person(string nam, int ag)     {       name = nam;       age = ag;     }     public override string ToString()     {       return String.Format("{0}({1})", name, age);     }   }   class Program   {     static void Main(string[] args)     {       List<Person> p = new List<Person>();       p.Add(new Person("Pochi", 3));       p.Add(new Person("Kenta", 5));       p.Add(new Person("Mari", 4));       p.Add(new Person("Wanko", 1));       p.Add(new Person("Doggy", 4));       p.ForEach(Console.WriteLine);     }   } } 1.overrideをしないと 「PersonList.Person」が出力されてしまうのですが  なぜToString()をoverrideするのかがわかりません。 2.override しないですべての内容を出力するためにはどうしたら  いいのでしょうか?

  • どうして、Windows server 2008の場合、下記のコードを

    どうして、Windows server 2008の場合、下記のコードを利用してローカルPCのIPAddress、IPSubnetなどの情報を取得することができませんか。 _mosNetworkAdapterConfiguration = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_NetworkAdapterConfiguration"); // ********************************************************* // -- インターネットプロトコルTCPIPの詳細 // ********************************************************* _clsXML.WriteXMLStartElement("インターネットプロトコルTCPIPの詳細"); foreach (ManagementObject obj in _mosNetworkAdapterConfiguration.Get()) { _clsXML.WriteXMLStartElement("DHCPの使用"); _clsXML.WriteXMLAttributes("DHCPEnabled", Tools.ConvertNullToString(obj["DHCPEnabled"])); _clsXML.WriteXMLEndElement(); // DHCPの使用 Console.WriteLine("IPAddress..."); if (obj["IPAddress"] == null) { Console.WriteLine("NULL"); _clsXML.WriteXMLStartElement("IPアドレス"); _clsXML.WriteXMLEndElement(); // IPアドレス } else { arr = (string[])(obj["IPAddress"]); foreach (string arrValue in arr) { Console.WriteLine("###" + arrValue + "###"); _clsXML.WriteXMLStartElement("IPアドレス"); _clsXML.WriteXMLAttributes("IPAddress", arrValue); _clsXML.WriteXMLEndElement(); // IPアドレス } } Console.WriteLine("IPSubnet..."); if (obj["IPSubnet"] == null) { Console.WriteLine("NULL"); _clsXML.WriteXMLStartElement("IPサブネットマスク"); _clsXML.WriteXMLEndElement(); // IPサブネットマスク } else { arr = (string[])(obj["IPSubnet"]); foreach (string arrValue in arr) { Console.WriteLine("###" + arrValue + "###"); _clsXML.WriteXMLStartElement("サブネットマスク"); _clsXML.WriteXMLAttributes("IPSubnet", arrValue); _clsXML.WriteXMLEndElement(); // IPサブネットマスク } } ...

  • Visual C++ 2008 Express Editionでファイル出力プログラムができない。

    今、Visual C++ 2008 Express Editionを使って、データをファイル出力保存するプログラムを作る練習をして、下のURL http://homepage3.nifty.com/ishidate/vcpp08_2/vcpp08_2.htm ここで紹介されている通りのプログラムを組んで見たのですが、コンパイルが完了して、デバッグしてみると、DOSプロンプトが立ち上がった時点で、”動作を停止しました。”という感じで起動ができませんでした。 // C880.cpp : メイン プロジェクト ファイルです。 #include "stdafx.h" using namespace System; using namespace System::IO; int main() { String^string1; StreamWriter^swriter1=gcnew StreamWriter("A:sample.txt"); string1=" 二乗 三乗 四乗 平方根"; swriter1->WriteLine(string1); string1="---------------------------------------"; swriter1->WriteLine(string1); for(int a=1;a<11;a++){ string1=String::Format("{0,2} {1,5} {2,5} {3,6} {4,7:F4}", a,a*a,a*a*a,a*a*a*a,Math::Sqrt(a)); swriter1->WriteLine(string1); } swriter1->Close(); //これを忘れてはいけない Console::Read(); return 0; } これは何が原因なのかご存じの方いらっしゃいますでしょうか。ぜひご教授ねがいます。

  • prototypeで前の値を潰さない方法は?

    function obj() { this.name = "名前です"; } var obj01 = new obj(); alert(obj.name); というコードの場合、obj.nameでobj関数に設定されたnameプロパティの値「名前です」をアラートすることができます。このobj関数を変更せず、あとからプロパティと値を追加したい場合、prototypeメソッド(って言って間違いありませんか?)を用いて以下のように実現することができます。 function obj() { this.name = "名前です"; } obj.prototype.age = "年齢です"; var obj01 = new obj(); alert(obj.name+" / "+obj.age); newする前に記述するのがポイントなんですよね。これにより、obj関数(オブジェクト)にageというプロパティと値「年齢です」が追加され、アラートできるようになりました。また最近、連想配列を使うことで複数のプロパティと値を一気にセットできる便利な方法を発見しました。 function obj() { this.name = "名前です"; } obj.prototype.age = "年齢です"; obj.prototype = { "country":"日本出身です", "city":"東京出身です", "hobby":"音楽鑑賞です" }; var obj01 = new obj(); alert(obj.country+" / "+obj.city+" / "+obj.hobby); //alert(obj.age); //alert(obj.name); と、このように複数のプロパティと値をセットし、後で利用することができます。 前置きが長くてすみません、ここからが質問です。 最後の例の場合、連想配列によってセットされたプロパティの値は存在しますが、それ以前にprototypeで設定したageプロパティは存在しなくなっています。alert(obj.age)の行をコメントアウトしていますが、実行するとundefinedと表示されます。そして2つ目のコメントアウト行alert(obj.name);は問題なくnameプロパティの値をアラートできています。 つまり、prototypeメソッドを使って先に追加したプロパティと値は、「obj.prototype=連想配列」で実行した時点で潰されてしまっているようでした。 この連想配列を使ったプロパティ追加を行う際、先に「obj.prototype.プロパティ名」で追加していたプロパティと値を残しておく方法はありませんでしょうか?

  • [言語C#] string型における参照値の受け渡し

    stringは、参照型に分類されると思います。・・・(1) 【string宣言部抜粋】 public sealed class String : IComparable, ICloneable...... また、参照変数の代入では、オブジェクトの参照値が受け渡されるという認識です。・・・(2) 上記(1)、(2)を踏まえると、次のプログラムの実行結果に納得がいきません。 string aiu = "aiu"; string aiue = aiu; Console.WriteLine(aiue); aiu = "abc"; Console.WriteLine(aiu); Console.WriteLine(aiue); 出力結果---------- aiu abc aiu ------------------ (1)、(2)の考えを取り入れた場合、出力結果は aiu abc abc になるものだと思いましたが、なぜこのような結果になるのでしょうか 。自作クラスで似たような処理を行った場合では、一方の変更が同じインスタンスを代入した他方へも影響することは確認済みです。 ただ、stringの場合では・・・違うみたいです。 初歩的なことだと思いますが、宜しくお願い致します。

専門家に質問してみよう