文字列
String msg1 = "hello"; string msg2 = "world";
string は String のエイリアスらしいんだけど、string を使うほうが標準的?
大文字と小文字始まりが混ざるのが気持ち悪いんだけど、メリットはなに??
文字列連結
using System.Text; StringBuilder buf = new StringBuilder(); buf.Append("a"); buf.Append("b");
java と同じ。
配列
String[] s_array = {"a" , "b" , "c"}; int[] i_array = {1,2,3,4,5}; class Class1 {} Class1[] c_array = {new Class1() , new Class1()};
型指定しなくても { } でいける?
リスト
using System.Collections; IList list = new ArrayList(); list.Add("a"); list.Add("b"); list.Add("c");
java だとインタフェースに突っ込むんだけど、C# はインタフェースが I 始まりだからちょっとキモい。
辞書
using System; using System.Collections; IDictionary hash = new Hashtable(); hash.Add("a" , "A"); hash["b"] = "B"; Console.WriteLine(hash["a"]); //=> A Console.WriteLine(hash["b"]); //=> B
Add はあるけど Get は無い。["hoge"] を使うのが一般的?
foreach (DictionaryEntry o in hash) { Console.WriteLine(o.Key); Console.WriteLine(o.Value); }
ループしてみる。
リフレクション
using System.Reflection; class Person { public String pname = null; private String name_ = null; public Person(String name) { name_ = name; pname = "p_" + name; } public String name { get { return name_;} } public String say() { return "I'm " + name_; } }
Type を取得してインスタンスを生成してみる。
Type t = Type.GetType("Person"); Object p = Activator.CreateInstance(t , new String[]{"basyura"}); Console.WriteLine(p.GetType()); //=> Person
キャストして getter 呼び出し。
Console.WriteLine(((Person)p).name); //=> basyura
パブリックなフィールドを出力。
foreach (FieldInfo f in t.GetFields()) { Console.WriteLine(f); //=> System.String pname しかでない }
パブリックなフィールドを取得する
Console.WriteLine(t.GetField("pname").GetValue(p)); //=> p_basyura
プライベートなフィールドを取得する。BindingFlags の指定がめんどう(いろいろ間違えそう)。
FieldInfo finfo = t.GetField("name_" , BindingFlags.NonPublic | BindingFlags.Instance); Console.WriteLine(finfo.GetValue(p)); //=> basyura
引数が多いけどメソッド呼び出しを使った取得。
Console.WriteLine( t.InvokeMember( "name_" , BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null , p , null)); //=> basyura
メソッド呼び出し。引数の binder が何者かよくわからない。
Object say_ret = t.InvokeMember( "say" , BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod , null , p , null); Console.WriteLine(say_ret); //=> I'm basyura
まとめ
- メソッドの大文字始まりに慣れてきた。
- msdn でライブラリ検索したときに 2.0 とか古いのヒットするのがうざい
- 割と面白くなってきた
- どっかの勉強会に参加したいんだけど、それっぽいのがヒットしない
- String -> string 、Object -> object といったエイリアスの必要性が分からない