수색…
메서드 선언
모든 메소드에는 접근 자 ( public
, private
, ...), 선택적 수정 자 ( abstract
), 이름 및 필요한 경우 메소드 매개 변수로 구성된 고유 한 서명이 있습니다. 반환 유형은 서명의 일부가 아닙니다. 메소드 프로토 타입은 다음과 같습니다.
AccessModifier OptionalModifier ReturnType MethodName(InputParameters)
{
//Method body
}
AccessModifier
는 public
, protected
, pirvate
또는 기본적으로 internal
있습니다.
OptionalModifier
는 static
abstract
virtual
override
new
또는 sealed
가 될 수 있습니다.
ReturnType
은 return이 없으면 void
가 될 수 있고 int
에서 complex 클래스처럼 기본 클래스의 모든 유형이 될 수 있습니다.
Method는 입력 매개 변수가 없거나 전혀 없을 수 있습니다. 메서드에 대한 매개 변수를 설정하려면 각각을 일반 변수 선언 ( int a
와 같이)으로 선언해야하며 두 개 이상의 매개 변수에 대해서는 쉼표 ( int a, int b
와 같이)를 사용해야합니다.
매개 변수에는 기본값이있을 수 있습니다. 이를 위해 매개 변수 값을 설정해야합니다 (예 : int a = 0
). 매개 변수에 기본값이 있으면 입력 값을 설정하는 것은 선택 사항입니다.
다음 메서드 예제는 두 정수의 합을 반환합니다.
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);
}
이 메서드는 하나의 인수를 받아들이고 문자열을 반환합니다. 정수 (예 : 5
)로 메서드를 호출하면 "Area of Square is 25"
출력됩니다.
public double Area(double value1, double value2)
{
return value1 * value2;
}
마찬가지로이 메서드에 두 개의 double 값을 전달하면 출력은 두 값의 곱이며 double 유형입니다. 이것은 곱셈과 직사각형의 면적을 찾는 데 사용될 수 있습니다.
public double Area(double value1)
{
return 3.14 * Math.Pow(value1,2);
}
이 값은 특히 원의 면적을 찾는 데 사용할 수 있습니다. 원의 면적은 이중 값 ( radius
)을 받아들이고 면적으로 다른 이중 값을 반환합니다.
이 메소드들 각각은 충돌없이 정상적으로 호출 될 수 있습니다 - 컴파일러는 각 메소드 호출의 매개 변수를 검사하여 어떤 버전의 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.
** 반환 유형 만으로는 두 가지 방법을 구별 할 수 없습니다. 예를 들어 Area에 동일한 매개 변수가있는 두 개의 정의가있는 경우 (예 :
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()