basyura's blog

あしたになったらほんきだす。

C# の基本

文字列

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 といったエイリアスの必要性が分からない