using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _2020_07_23
{
class Program
{
delegate int Calculator(int iNum1, int iNum2);
static int Add(int iNum1,int iNum2)
{
return iNum1 + iNum2;
}
static int Div(int iNum1, int iNum2)
{
return iNum1 / iNum2;
}
static int Mul(int iNum1, int iNum2)
{
return iNum1 * iNum2;
}
static int Sub(int iNum1, int iNum2)
{
return iNum1 - iNum2;
}
static void Main(string[] args)
{
int iResult;
Calculator[] aCalculator = new Calculator[] { Add , Sub, Mul, Div };
for (int i = 0; i < aCalculator.Length; ++i)
{
iResult = aCalculator[i](3, 4);
Console.WriteLine(iResult);
}
Console.WriteLine("////////////////////////////////////////");
foreach (Calculator temp in aCalculator)
{
iResult = temp(3, 4);
Console.WriteLine(iResult);
}
Console.WriteLine("////////////////////////////////////////");
iResult = Add(3, 4);
Console.WriteLine(iResult);
iResult = Sub(3, 4);
Console.WriteLine(iResult);
iResult = Mul(3, 4);
Console.WriteLine(iResult);
iResult = Div(3, 4);
Console.WriteLine(iResult);
}
}
}
delegate를 통해서 메소드를 가르키는 타입을 만들수 있다.
총 3번이 출력된다
한번은 메소드로 호출
한번은 for문으로 호출 (원래는 delegate를가 없었으면 불가능)
한번은 foreach문으로 호출
이 구문에서 delegate를 사용하는 법이 나온다
보고 이해하기 바란다.
여기서 좀 더 새련된걸 보여주겠다
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public class Mathematics
{
delegate int CalcDelegate(int x, int y);
static int Add(int x, int y) { return x + y; }
static int Subtract(int x, int y) { return x - y; }
static int Multiply(int x, int y) { return x * y; }
static int Divide(int x, int y) { return x / y; }
CalcDelegate[] methods;
public Mathematics()
{
methods = new CalcDelegate[] { Mathematics.Add, Mathematics.Subtract, Mathematics.Multiply, Mathematics.Divide };
}
public void Calculate(char opCode, int operand1, int operand2)
{
switch(opCode)
{
case '+':
Console.WriteLine("+: " + methods[0](operand1, operand2));
break;
case '-':
Console.WriteLine("-: " + methods[1](operand1, operand2));
break;
case '*':
Console.WriteLine("*: " + methods[2](operand1, operand2));
break;
case '/':
Console.WriteLine("/: " + methods[3](operand1, operand2));
break;
}
}
}
namespace ConsoleApp1
{
class Program
{
delegate void WorkDelegate(char arg1, int arg2, int arg3);
static void Main(string[] args)
{
Mathematics math = new Mathematics();
WorkDelegate Work= math.Calculate;
Work('+', 10, 5);
Work('-', 10, 5);
Work('*', 10, 5);
Work('/', 10, 5);
}
}
}
결과물은 위와 같으나 유지 보수나 관리하기에 좋은 코드를 보여주겠다
좀더 복잡하기는 내용을 추가하거나 삭제할때 아주 간편하고 좋다
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
delegate int CalcDelegate(int x, int y);
class MessageMap
{
public char opCode;
public CalcDelegate Calc;
public MessageMap(char opCode, CalcDelegate Calc)
{
this.opCode = opCode;
this.Calc = Calc;
}
}
public class Mathematics
{
MessageMap[] aMessageMap;
static int Add(int x, int y) { return x + y; }
static int Subtract(int x, int y) { return x - y; }
static int Multiply(int x, int y) { return x * y; }
static int Divide(int x, int y) { return x / y; }
static int Per(int x, int y) { return x % y; }
public Mathematics()
{
aMessageMap = new MessageMap[] {
new MessageMap('+', Add),
new MessageMap('-', Subtract),
new MessageMap('*', Multiply),
new MessageMap('/', Divide),
new MessageMap('%', Per)
};
}
public void Calculate(char opCode, int operand1, int operand2)
{
Console.Write(opCode + " : ");
foreach (MessageMap Temp in aMessageMap)
{
if (Temp.opCode == opCode)
{
Console.WriteLine(Temp.Calc(operand1, operand2));
}
}
}
}
namespace ConsoleApp1
{
class Program
{
delegate void WorkDelegate(char arg1, int arg2, int arg3);
static void Main(string[] args)
{
Mathematics math = new Mathematics();
WorkDelegate Work= math.Calculate;
Work('+', 10, 5);
Work('-', 10, 5);
Work('*', 10, 5);
Work('/', 10, 5);
Work('%', 10, 5);
}
}
}
'스마트팩토리 > C#' 카테고리의 다른 글
2020/7/28 C# (0) | 2020.07.28 |
---|---|
2020/07/27 C# (0) | 2020.07.27 |
2020/7/22 C# (0) | 2020.07.22 |
2020/07/15 C# (0) | 2020.07.15 |
2020/07/01 C# (0) | 2020.07.01 |