public delegate void Log(string message);
private readonly Log _logger;
public Calculator(Log logger)
public int Add(int a, int b)
_logger(String.Format("Adding {1} to {0}", a, b));
public int Subtract(int a, int b)
_logger(String.Format("Subtracting {1} from {0}", a, b));
var calc = new Calculator(Console.WriteLine);
Console.WriteLine("Sum: {0}", calc.Add(10, 20));
Console.WriteLine("Diff: {0}", calc.Subtract(20, 10));
private readonly Action<string> _logger;
public Calculator2(Action<string> logger)
public int Add(int a, int b)
_logger(String.Format("Adding {1} to {0}", a, b));
public int Subtract(int a, int b)
_logger(String.Format("Subtracting {1} from {0}", a, b));
var calc2 = new Calculator(Console.WriteLine);
Console.WriteLine("Sum: {0}", calc2.Add(10, 20));
Console.WriteLine("Diff: {0}", calc2.Subtract(20, 10));
interface IDateTimeService
public class DateTimeService
public DateTime GetCurrent() { return DateTime.Now; }
var dtSvc = new DateTimeService();
Console.WriteLine(dtSvc.GetCurrent());
Func<DateTime> dtSvc2 = () => DateTime.Now;
Console.WriteLine(dtSvc2());