C# 9 a introdus o nouă caracteristică numită declarații de nivel superior (top level statements), care ne permit să scriem cod fără a defini în mod explicit o metodă Main() sau o clasă care să o conțină. De exemplu, un simplu program "Bună Lume!" pe care îl scriam în felul următor:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
using System;
namespace
ProiectulMeu
{
class
Program
{
static void Main(string[] args)
{
Console.WriteLine("Buna Lume!");
}
}
}
|
poate fi scris acum cu declarații de nivel superior astfel:
|
1
|
Console.WriteLine("Buna Lume!");
|
Deși pare curat și simplu, există câteva dezavantaje pe care le voi discuta mai târziu. Dar mai întâi, unde găsiți aceste declarații de nivel superior? Evident, va trebui să folosiți cel puțin versiunea C# 9, deoarece atunci au fost introduse. De asemenea, va trebui să folosiți cel puțin .NET 5, deci, nu vor fi disponibile când creați un proiect de consolă pentru .NET Framework, care este mai vechi, de exemplu.
Trebuie să știți de la început că, deși nu pare așa, există o metodă Main() ascunsă și o clasă Program generată de compilator în spatele scenei. Compilatorul ia declarațiile voastre de nivel superior și le încapsulează implicit într-o metodă Main() sintetică.
Deci, exemplul de o singură linie de cod pentru scrierea unui text la consolă pe care tocmai vi l-am arătat? De fapt, este convertit de compilator exact în cel din primul exemplu, unde acea linie se află în interiorul unei metode Main(), într-o clasă Program.
Deci, nu se pot folosi metode? Ce caracteristică inutilă!
De fapt, se pot folosi. Puteți scrie cod în felul următor:
|
1
2
3
4
5
6
|
void PrinteazaText(string text)
{
Console.WriteLine(text);
}
PrinteazaText("Buna Lume!");
|
care apoi este convertit de compilator în asta:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
using System;
namespace
ProiectulMeu
{
class
Program
{
static void Main(string[] args)
{
void PrinteazaText(string text)
{
Console.WriteLine(text);
}
PrinteazaText("Buna Lume!");
}
}
}
|
Probabil că ați recunoscut deja utilizarea unei metode locale, deoarece metoda PrinteazaText() este declarată în interiorul metodei Main().
Și aici se termină partea bună, și încep dezavantajele :
- nu puteți accesa direct metoda Main() sau clasa generată Program, care s-ar putea să fie necesare în unele cazuri, cum ar fi unit testing-ul.
- nu puteți supraîncărca metodele voastre, iar pentru un programator inexperimentat, acest lucru poate genera confuzie și descurajare.
- există o complexitate ascunsă, programul funcționează, și nu este imediat evident pentru programator cum anume face acest lucru.
- inconsistență: o aplicație poate avea doar un singur punct de intrare, ceea ce înseamnă că dacă folosiți declarații de nivel superior în mai multe fișiere, s-ar genera mai multe metode Main() și ați obține erori de compilare. Acest lucru mai înseamnă și că cea mai mare parte a proiectului vostru va trebui să folosească tot structura C# obișnuită, în timp ce fișierul vostru de punct de intrare ar urma un stil diferit, al declarațiilor de nivel superior. Acest lucru generează confuzie și e greu de urmărit.
- declarațiile de nivel superior au fost introduse doar ca o exaltare Microsoft de a încerca să emuleze Python, unde puteți scrie la ieșirea standard folosind o singură linie de cod. Deși acest lucru ar putea fi frumos, C# nu este Python, și Microsoft ar trebui să înceteze să încerce să îl facă să arate sau să se comporte ca alte limbaje. Până la urmă, Python nu copiază C#, și se descurcă destul de bine. Adaugați la aceasta și faptul că este bine știut că Microsoft își abandonează rapid propriile tendințe, și veți începe să vedeți declarațiile de nivel superior așa cum sunt: nu mai mult decât o caracteristică utilă pentru nimic altceva decât programe de consolă de jucărie (de altfel, aceasta este doar părerea mea personală, voi puteți face cum credeți de cuviință).
Declarațiile de nivel superior nu sunt activate în mod implicit atunci când creați o aplicație de Consolă. Le puteți activa sau dezactiva debifând opțiunea "Do not use top-level statements" ("Nu folosi declarații de nivel superior") în Visual Studio, atunci când creați un nou proiect Console App. Dacă proiectul este deja creat și declarațiile de nivel superior au fost activate, puteți schimba aceasta doar creând o metodă Main() într-o clasă Program, manual.