「C# エッセンシャルズ」まとめ その3

2.9.7 メソッド (p.51, 52)

・引数の値渡し/参照渡し
 デフォルトでは、C# の引数は値渡しされる。ref 修飾子を仮引数にしていすると、参照渡しになる。

static void Foo(int p) { ++p; }      // 値渡し
static void Bar(ref int p ) { ++p; } // 参照渡し
public static void Main() {
int x = 8;
Foo(x);
Console.WriteLine(x); //=> 8
Bar(x);
Console.WriteLine(x); //=> 9
}
 デフォルトが値渡しってのは、意外と珍しいかも。

・out修飾子
 メソッドから値を受け取るための引数を指定するための修飾子。メソッド内で変数に値を割り当てられる事が保証されるので、メソッド呼び出しの時点では初期化を行わなくても良い。
using System;
class Test {
static void Split(string name, out string firstNames,
out string lastName) {
int i = name.LastIndexOf(' ');
firstNames = name.Substring(0, i);
lastName = name.Substring(i + 1);
}

public static void Main() {
string a, b; // 初期化不要
Split("Nuno Bettencourt", out a, out b); // 呼び出し側でも out が必要
Console.WriteLine("FirstName: {0}, LastName: {1}", a, b);
//=> FirstName: Nuno, LastName: Bettencourt
}
}

 うーん、これは正直どうなんだろ。引数で結果を受け取るという機会が、Cならまだしも、C#ではほとんどないような気がするんだけど。少なくとも、僕は使わないだろうな。

・params修飾子
 params修飾子は、メソッドの最後のパラメータに指定することができる。これが指定されると、メソッドは、特定の方のパラメータをいくつでも受け取ることができる。
using System;
class Test {
static int Add(params int[] iarr) {
int sum = 0;
foreach (int i in iarr)
sum += i;
return sum;
}

static void Main() {
int i = Add(1, 2, 3, 4);
Console.WriteLine(i); //=> 10
}
}

 ruby の * が付いた仮引数みたいなものだね。ちなみに、Ruby 1.9 からは、* は最後以外の引数にも指定できるようになりました (って、いつの間にか ruby の話になってる・・・w)。
def add(*iarr, name)
sum = 0
sum = iarr.inject { |r, s| r += s }
return "sum: #{sum}, name: #{name}"
end

def main
puts add(1, 2, 3, 4, 'fkmn') #=> "sum: 10, name: fkmn
end

main()


2.9.9 インスタンスコンストラクタ (p.56, 57)

 クラス/構造体では、コンストラクタをオーバーロードする事が可能。thisキーワードを使うと、オーバーロードされたコンストラクタを呼び出すことができる。baseキーワードを使うと、親クラスのコンストラクタを呼び出すことができる。
class B {
public int x;
putlic B(int a) {
x = 1;
}
public B(int a, int b) {
x = a * b;
}
// クラスBのコンストラクタは、すべてパラメータを受け取る
}

class D : B {
public D() : this(7) {} // オーバーロードされたコンストラクタを呼び出す
public D(int a) : base(a) {} // 親クラスのコンストラクタを呼び出す
}

 構文にちょっと違和感を感じるけど、機能自体はまぁ普通、というか無いと困る。

2.10.5 明示的なインターフェイスの実装 (p.65)

 インターフェイスメンバとそのクラスまたは構造体の既存のメンバの名前が重複した場合は、競合を解決するために、インターフェイスのメンバを明示的に実装することができる。

public interface IDelete {
void Delete();
}

public interface IDesignTimeControl {
object Delete();
}

public class TextBox : IDelete, IDesignTimeControl {
void IDelete.Delete() { ... }
object IDesignTimeControl.Delete() { ... }
// 競合を解決するためには、片方だけを明示的に実装すれば十分
}

[PR]
by fkmn | 2009-04-10 23:55 | IT
<< 「C# エッセンシャルズ」まと... JPA という略称の日本の団体 >>


とあるWebアプリケーションエンジニアの日記
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
カテゴリ
以前の記事
ブログパーツ
リンク
検索
タグ
最新のトラックバック
プログラミングが「出来る..
from とりあえず9JP?
Genographic ..
from ナンジャモンジャ
ジュセリーノ
from ありの出来事
くちこみブログ集(ライフ..
from くちこみブログ集(ライフ)(..
以降、丁寧語で行こう!
from エッセイ的な何か
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧

fkmnの最近読んだ本 フィードメーター - フッ君の日常 あわせて読みたい AX