サーチ…
メソッドの宣言
すべてのメソッドには、アクセサ( public
、 private
、...)、オプションの修飾子( abstract
)、名前、および必要に応じてメソッドパラメータからなる固有のシグネチャがあります。戻り値の型は署名の一部ではないことに注意してください。メソッドプロトタイプは次のようになります。
AccessModifier OptionalModifier ReturnType MethodName(InputParameters)
{
//Method body
}
AccessModifier
はpublic
、 protected
、 pirvate
またはデフォルトでinternal
ます。
OptionalModifier
は、 static
またはabstract
virtual
override
new
またはsealed
することができます。
ReturnType
は戻り値がない場合はvoid
になりvoid
、複雑なクラスの場合はint
として、基本型のいずれかの型にすることができます。
1つのメソッドには、入力パラメータがある場合とない場合があります。メソッドのパラメータを設定するには、通常の変数宣言( int a
)のように宣言する必要があります。複数のパラメータの場合は、それらの間にコンマ( int a, int b
)を使用する必要があります。
パラメータにはデフォルト値が設定されています。このためには、パラメータの値を設定する必要があります( int a = 0
)。パラメータにデフォルト値がある場合、入力値の設定はオプションです。
次のメソッド例は、2つの整数の合計を返します。
private int Sum(int a, int b)
{
return a + b;
}
方法の呼び出し
静的メソッドを呼び出す:
// Single argument
System.Console.WriteLine("Hello World");
// Multiple arguments
string name = "User";
System.Console.WriteLine("Hello, {0}!", name);
静的メソッドを呼び出して戻り値を格納する:
string input = System.Console.ReadLine();
インスタンスメソッドの呼び出し:
int x = 42;
// The instance method called here is Int32.ToString()
string xAsString = x.ToString();
ジェネリックメソッドの呼び出し
// Assuming a method 'T[] CreateArray<T>(int size)'
DateTime[] dates = CreateArray<DateTime>(8);
パラメータと引数
メソッドは任意の数のパラメータを宣言できます(この例では、 i
、 s
、 o
がパラメータです)。
static void DoSomething(int i, string s, object o) {
Console.WriteLine(String.Format("i={0}, s={1}, o={2}", i, s, o));
}
メソッドに値を渡すためにパラメータを使用することができます。そのため、メソッドはそれらのメソッドで動作します。これは、値を出力する、パラメータで参照されるオブジェクトを変更する、値を保存するなど、あらゆる種類の作業が可能です。
メソッドを呼び出すときは、すべてのパラメータに実際の値を渡す必要があります。この時点で、実際にメソッド呼び出しに渡す値は引数と呼ばれます。
DoSomething(x, "hello", new object());
戻り値の型
メソッドはnothing( void
)または指定された型の値を返すことができます:
// If you don't want to return a value, use void as return type.
static void ReturnsNothing() {
Console.WriteLine("Returns nothing");
}
// If you want to return a value, you need to specify its type.
static string ReturnsHelloWorld() {
return "Hello World";
}
メソッドが戻り値を指定する場合、メソッドは値を返す必要があります。これは、 return
ステートメントを使用して行います。 return
ステートメントに達すると、指定された値とそれ以降実行されないコードが返されます(例外はfinally
ブロックであり、メソッドが戻る前に実行されます)。
メソッドが何も返さない場合( void
)、メソッドからすぐに戻りたい場合は、値を指定しないでreturn
ステートメントを使用できます。そのようなメソッドの終わりには、 return
ステートメントは不要です。
有効なreturn
文の例:
return;
return 0;
return x * 2;
return Console.ReadLine();
例外をスローすると、値を返さずにメソッドの実行を終了できます。また、yieldキーワードを使用して戻り値が生成される反復子ブロックもありますが、これはこの時点では説明されない特殊なケースです。
デフォルトパラメータ
パラメータを省略するためのオプションを提供する場合は、デフォルトのパラメータを使用できます。
static void SaySomething(string what = "ehh") {
Console.WriteLine(what);
}
static void Main() {
// prints "hello"
SaySomething("hello");
// prints "ehh"
SaySomething(); // The compiler compiles this as if we had typed SaySomething("ehh")
}
このようなメソッドを呼び出し、デフォルト値が指定されているパラメーターを省略すると、コンパイラーはそのデフォルト値を挿入します。
デフォルト値を持つパラメータは、デフォルト値を持たないパラメータの後に記述する必要があることに注意してください。
static void SaySomething(string say, string what = "ehh") {
//Correct
Console.WriteLine(say + what);
}
static void SaySomethingElse(string what = "ehh", string say) {
//Incorrect
Console.WriteLine(say + what);
}
警告 :このように動作するため、デフォルト値が問題になることがあります。メソッド・パラメーターのデフォルト値を変更し、そのメソッドのすべての呼び出し元を再コンパイルしないと、それらの呼び出し元はコンパイル時に存在したデフォルト値を引き続き使用し、矛盾が発生する可能性があります。
メソッドのオーバーロード
定義:同じ名前を持つ複数のメソッドが異なるパラメータで宣言されている場合は、メソッドのオーバーロードと呼ばれます。メソッドのオーバーロードは、通常、目的は同じですが、異なるデータ型をパラメータとして受け入れるように記述された関数を表します。
影響を与える要因
- 引数の数
- 引数のタイプ
- 戻り値の型**
さまざまな引数を受け取り、結果を返す計算関数を実行するArea
という名前のメソッドを考えてみましょう。
例
public string Area(int value1)
{
return String.Format("Area of Square is {0}", value1 * value1);
}
このメソッドは1つの引数を受け取り、文字列を返します。メソッドを整数(たとえば5
)とすると、出力は"Area of Square is 25"
ます。
public double Area(double value1, double value2)
{
return value1 * value2;
}
同様に、このメソッドに2つのdouble値を渡すと、出力は2つの値の積であり、double型になります。これは、掛け算のほか、長方形の面積
public double Area(double value1)
{
return 3.14 * Math.Pow(value1,2);
}
これは、円の領域を見つけるために特別に使用することができます。この領域は、double値( radius
)を受け取り、別のdouble値をそのAreaとして返します。
これらのメソッドのそれぞれは、競合することなく正常に呼び出すことができます。コンパイラは各メソッド呼び出しのパラメータを調べて、使用する必要のあるバージョンのArea
を判断します。
string squareArea = Area(2);
double rectangleArea = Area(32.0, 17.5);
double circleArea = Area(5.0); // all of these are valid and will compile.
** return型だけでは2つのメソッドを区別できないことに注意してください。たとえば、同じパラメータを持つAreaの定義が2つある場合は、次のようになります。
public string Area(double width, double height) { ... }
public double Area(double width, double height) { ... }
// This will NOT compile.
クラスに異なる値を返す同じメソッド名を使用させる必要がある場合は、インターフェイスを実装してその使用法を明示的に定義することで、あいまいさの問題を取り除くことができます。
public interface IAreaCalculatorString {
public string Area(double width, double height);
}
public class AreaCalculator : IAreaCalculatorString {
public string IAreaCalculatorString.Area(double width, double height) { ... }
// Note that the method call now explicitly says it will be used when called through
// the IAreaCalculatorString interface, allowing us to resolve the ambiguity.
public double Area(double width, double height) { ... }
匿名メソッド
匿名メソッドは、デリゲートパラメータとしてコードブロックを渡す手法を提供します。彼らは身体を持つメソッドですが、名前はありません。
delegate int IntOp(int lhs, int rhs);
class Program
{
static void Main(string[] args)
{
// C# 2.0 definition
IntOp add = delegate(int lhs, int rhs)
{
return lhs + rhs;
};
// C# 3.0 definition
IntOp mul = (lhs, rhs) =>
{
return lhs * rhs;
};
// C# 3.0 definition - shorthand
IntOp sub = (lhs, rhs) => lhs - rhs;
// Calling each method
Console.WriteLine("2 + 3 = " + add(2, 3));
Console.WriteLine("2 * 3 = " + mul(2, 3));
Console.WriteLine("2 - 3 = " + sub(2, 3));
}
}
アクセス権
// static: is callable on a class even when no instance of the class has been created
public static void MyMethod()
// virtual: can be called or overridden in an inherited class
public virtual void MyMethod()
// internal: access is limited within the current assembly
internal void MyMethod()
//private: access is limited only within the same class
private void MyMethod()
//public: access right from every class / assembly
public void MyMethod()
//protected: access is limited to the containing class or types derived from it
protected void MyMethod()
//protected internal: access is limited to the current assembly or types derived from the containing class.
protected internal void MyMethod()