日々常々

ふつうのプログラマがあたりまえにしたいこと。

JavaとC#のコンストラクタさん

おしごとでJavaC#を同時に使うことになってたりしまして、C#の知識不足のせいで「同じようなことをやれば良いだけ」みたいなこと言われてもぐぬぬしちゃう今日この頃です。

そんな中から、コンストラクタさんのお話。

参考:#51 コンストラクタと継承 « C# « a wandering wolf

ふつうの

// Java
public class Hoge {
    public Hoge() {
    }
    public Hoge(int i) {
    }
}
// C#
public class Hoge
{
    public Hoge()
    {
    }
    public Hoge(int i)
    {
    }
}

特に悩まないですね。JavaC#では {} の前に改行するかどうかくらいの差*1

継承したとき

// Java
public class Fuga extends Hoge {
    public Fuga() {
        this(0);
    }
    public Fuga(int i) {
        super(i);
    }
}

Javaだとコンストラクタの中で、thisやsuperって書きます。

// C#
public class Fuga
{
    public Fuga()
        : this(0)
    {
    }
    public Fuga(int i)
        : base(i)
    {
    }
}

C#だとコロンで続けて、ブロックの前にthisやbaseって書くようです。

省略したとき

// Java
public class Fuga extends Hoge {
    public Fuga() {
    }
    public Fuga(int i) {
    }
}

省略した時はブロックの先頭に super(); がついてるようなもんです。なのでコンストラクタの引数に関わらず Hoge() が実行されます。

// Java
public class Fuga extends Hoge {
    public Fuga() {
        super();
    }
    public Fuga(int i) {
        super();
    }
}

こういうこと。

// C#
public class Fuga : Hoge
{
    public Fuga()
    {
    }
    public Fuga(int i)
    {
    }
}

省略した時はブロックの直前に : base() がついてるようなもんです。なのでコンストラクタの引数に関わらず Hoge() が実行されます。

// C#
public class Fuga : Hoge
{
    public Fuga()
        : base()
    {
    }
    public Fuga(int i)
        : base()
    {
    }
}

こういうこと。

まとめ

なんだ、同じか。

*1:動作に影響しないので慣習的なとこです。でもC#だとVisualStudioがデフォルトでこうフォーマットするんで、わざわざ他のスタイルにするメリットが云々。