- Published on
Top-Level Statement - programs without Main methods in C#
- Authors
- Name
- Jeevan Wijerathna
- @iamjeevanvj
Top-Level Statement - programs without Main methods
C# 9’s top-level statements let you avoid the baggage of a static Main method and a containing class. A file with top-level statements comprises three parts, in this order:
- (Optionally) using directives
- A series of statements, optionally mixed with method declarations
- (Optionally) Type and namespace declarations
Top Level Statement let us write simple programms like Utilities such as Azure function and github Actions.
When we need to try some logic in c# we can take help of the Top-Level statement. We can get started with this and refactor the code when we adding more features to code for maintainability.
Rules
- Only one Top-Level Statement is allowed in the application as there should be one entry point.
- No other Entry points. We can introduce explicit method. But those can not act as Entry points. We can use
Main
Compiller options.-main
Access Parametrs
We can use magic
args
args
0
null
if (args.Length > 0) { foreach (var arg in args) { Console.WriteLine($"Argument={arg}"); } } else { Console.WriteLine("No arguments"); }
await
await
We can use
await
await AsyncMethod()
Classes and Namespaces
After Top_Level statements we can defince namespaces and type definitions.
using System; Console.WriteLine("Hello World!"); TestClass.TestMethod(); MyNamespace.MyClass.MyMethod(); public class TestClass { public static void TestMethod() { Console.WriteLine("Hello from TestMethod"); } } namespace MyNamespace { class MyClass { public static void MyMethod() { Console.WriteLine("Hello World from MyNamespace.MyClass.MyMethod!"); } } }
Exit Coode
We are allowed to use
return
Because the CLR doesn’t explicitly support top-level statements, the compiler translates your code into something like this:
using System; // Part 1 static class Program$ // Special compiler-generated name { static void Main$() // Special compiler-generated name { Console.WriteLine ("Hello, world"); // Part 2 TestClass.TestMethod(); MyNamespace.MyClass.MyMethod(); // Part 2 } } class TestClass { ... } // Part 3 namespace MyNamespace { ... } // Part 3