Chasing minimal number of lines is just silly. You should try to write the number of lines promoting better readability, never repeating the same code, and so on.
However, there is absolutely no way to write those delegate types like the one you wrote. You can solve such problems using
generics. You don't even have to define generic types or methods: several definitions in .NET BCL already cover some 99% of practically important cases including yours. This is what you can do:
System.Action<string, string> mm;
That's not all. You don't even need to write a separate (named) method if you want immediately initialize
mm>
with some delegate instance. Here is what you can do, for example:
System.Action<string, string> mm = new System.Action<string, string>((s1, s2) => {
System.Console.WriteLine(@"First argument: ""{0}""; second argument:""{1}""", s1, s2);
});
To understand how it all works, read on the following topics: 1) generics, 2) anonymous methods; 3) lambda expressions and methods; 4) as a bonus: closures.
By the way, I would advise to read some language and .NET manual from the beginning to the end before writing anything serious (beyond learning exercises) and trying to improve something. First, you need to know what is already available.
—SA