Oktatóanyag: Ötletek felfedezése legfelső szintű utasítások használatával kód összeállítása a tanulás során
Az oktatóanyag segítségével megtanulhatja a következőket:
- Ismerje meg a felső szintű utasítások használatára vonatkozó szabályokat.
- Az algoritmusok feltárásához használjon felső szintű utasításokat.
- A feltárások újrabontása újrafelhasználható összetevőkké.
Előfeltételek
Be kell állítania a gépet a .NET 6 futtatására, amely tartalmazza a C# 10 fordítót. A C# 10 fordító a Visual Studio 2022-től vagy a .NET 6 SDK-tól kezdve érhető el.
Ez az oktatóanyag feltételezi, hogy ismeri a C# és a .NET használatát, beleértve a Visual Studiót vagy a .NET CLI-t is.
További információ
A legfelső szintű utasítások lehetővé teszik, hogy elkerülje a szükséges extra ceremóniát, ha a program belépési pontját statikus metódusba helyezi egy osztályban. Az új konzolalkalmazások tipikus kiindulópontja a következő kódhoz hasonlóan néz ki:
using System;
namespace Application
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
Az előző kód a parancs futtatásának dotnet new console
és egy új konzolalkalmazás létrehozásának eredménye. Ez a 11 sor csak egy végrehajtható kódot tartalmaz. Az új felső szintű utasítások funkcióval egyszerűsítheti a programot. Ez lehetővé teszi a program két sorának eltávolítását:
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
Fontos
A .NET 6 C#-sablonjai felső szintű utasításokat használnak. Előfordulhat, hogy az alkalmazás nem egyezik a cikkben szereplő kóddal, ha már frissített a .NET 6-ra. További információ: Az új C#- sablonok legfelső szintű utasítások létrehozása
A .NET 6 SDK emellett implicitglobal using
irányelveket is hozzáad az alábbi SDK-t használó projektekhez:
- Microsoft.NET.Sdk
- Microsoft.NET.Sdk.Web
- Microsoft.NET.Sdk.Worker
Ezek az implicit global using
irányelvek tartalmazzák a projekttípus leggyakoribb névtereit.
További információkért tekintse meg az implicit eszközökkel kapcsolatos irányelveket ismertető cikket
Ez a funkció leegyszerűsíti az új ötletek megismeréséhez szükséges teendőket. Használhatja a legfelső szintű utasításokat szkriptelési forgatókönyvekhez, vagy megvizsgálhatja. Miután elvégezte az alapokat, megkezdheti a kód újrabontását, és létrehozhat metódusokat, osztályokat vagy más szerelvényeket az újrahasználható összetevőkhöz. A legfelső szintű utasítások lehetővé teszik a gyors kísérletezést és a kezdő oktatóanyagokat. Emellett zökkenőmentes utat biztosítanak a kísérletezéstől a teljes programokig.
A legfelső szintű utasítások végrehajtása a fájlban megjelenő sorrendben történik. A legfelső szintű utasítások csak egy forrásfájlban használhatók az alkalmazásban. A fordító hibát okoz, ha több fájlban használja őket.
Varázslatos .NET-válaszgép létrehozása
Ebben az oktatóanyagban hozzunk létre egy konzolalkalmazást, amely véletlenszerű választ ad egy "igen" vagy "nem" kérdésre. A funkciókat lépésről lépésre fogja felépíteni. A feladatra összpontosíthat, nem pedig egy tipikus program felépítéséhez szükséges ceremóniára. Ezután, ha elégedett a funkcióval, újrabontást végezhet az alkalmazáson, ahogy látja.
Jó kiindulópont a kérdés visszaírása a konzolra. Első lépésként írja be a következő kódot:
Console.WriteLine(args);
Nem deklarál változót args
. A legfelső szintű utasításokat tartalmazó egyetlen forrásfájl esetében a fordító felismeri args
, hogy a parancssori argumentumokat jelenti. Az args típusa egy string[]
, mint minden C#-programban.
A kód teszteléséhez futtassa a következő dotnet run
parancsot:
dotnet run -- Should I use top level statements in all my programs?
A parancssori argumentumok --
a programnak lesznek átadva. Láthatja a args
változó típusát, mert a konzolon ez lesz kinyomtatva:
System.String[]
Ha a kérdést a konzolra szeretné írni, számba kell vennie az argumentumokat, és szóközzel kell elválasztania őket. Cserélje le a WriteLine
hívást a következő kódra:
Console.WriteLine();
foreach(var s in args)
{
Console.Write(s);
Console.Write(' ');
}
Console.WriteLine();
Most, amikor futtatja a programot, az helyesen jeleníti meg a kérdést argumentumok sztringjeként.
Válasz véletlenszerű válaszsal
A kérdés megválaszolása után hozzáadhatja a kódot a véletlenszerű válasz létrehozásához. Első lépésként adjon hozzá egy tömböt a lehetséges válaszokhoz:
string[] answers =
[
"It is certain.", "Reply hazy, try again.", "Don’t count on it.",
"It is decidedly so.", "Ask again later.", "My reply is no.",
"Without a doubt.", "Better not tell you now.", "My sources say no.",
"Yes – definitely.", "Cannot predict now.", "Outlook not so good.",
"You may rely on it.", "Concentrate and ask again.", "Very doubtful.",
"As I see it, yes.",
"Most likely.",
"Outlook good.",
"Yes.",
"Signs point to yes.",
];
Ez a tömb tíz igenlő választ, öt nem véglegesítő választ, öt pedig negatív választ ad. Ezután adja hozzá a következő kódot, amely véletlenszerű választ hoz létre és jelenít meg a tömbből:
var index = new Random().Next(answers.Length - 1);
Console.WriteLine(answers[index]);
Az eredmények megtekintéséhez futtassa újra az alkalmazást. A következőhöz hasonló kimenetnek kell megjelennie:
dotnet run -- Should I use top level statements in all my programs?
Should I use top level statements in all my programs?
Better not tell you now.
Ez a kód megválaszolja a kérdéseket, de adjunk hozzá még egy funkciót. Azt szeretné, hogy a kérdésalkalmazás szimulálja a válaszra való gondolkodást. Ezt úgy teheti meg, hogy hozzáad egy kis ASCII-animációt, és szünetelteti a munkát. Adja hozzá a következő kódot a kérdést visszhangozó sor után:
for (int i = 0; i < 20; i++)
{
Console.Write("| -");
await Task.Delay(50);
Console.Write("\b\b\b");
Console.Write("/ \\");
await Task.Delay(50);
Console.Write("\b\b\b");
Console.Write("- |");
await Task.Delay(50);
Console.Write("\b\b\b");
Console.Write("\\ /");
await Task.Delay(50);
Console.Write("\b\b\b");
}
Console.WriteLine();
Egy utasítást using
is hozzá kell adnia a forrásfájl elejéhez:
using System.Threading.Tasks;
Az using
utasításoknak a fájl bármely más utasítása előtt kell lenniük. Ellenkező esetben fordítóhiba. Újra futtathatja a programot, és megtekintheti az animációt. Ez jobb élményt nyújt. Kísérletezzen a késés hosszával, hogy megfeleljen az ízlésének.
Az előző kód egy szóközzel elválasztott forgósorokat hoz létre. A await
kulcsszó hozzáadása arra utasítja a fordítót, hogy hozza létre a program belépési pontjait olyan metódusként, amely rendelkezik a async
módosítóval, és visszaad egy System.Threading.Tasks.Task. Ez a program nem ad vissza értéket, ezért a program belépési pontja egy Task
. Ha a program egész számot ad vissza, akkor a felső szintű utasítások végére egy visszatérési utasítást kell hozzáadnia. Ez a visszatérési utasítás a visszaadandó egész számot adja meg. Ha a felső szintű utasítások kifejezéseket await
tartalmaznak, a visszatérési típus lesz System.Threading.Tasks.Task<TResult>.
Újrabontás a jövőre vonatkozóan
A programnak a következő kódhoz hasonlóan kell kinéznie:
Console.WriteLine();
foreach(var s in args)
{
Console.Write(s);
Console.Write(' ');
}
Console.WriteLine();
for (int i = 0; i < 20; i++)
{
Console.Write("| -");
await Task.Delay(50);
Console.Write("\b\b\b");
Console.Write("/ \\");
await Task.Delay(50);
Console.Write("\b\b\b");
Console.Write("- |");
await Task.Delay(50);
Console.Write("\b\b\b");
Console.Write("\\ /");
await Task.Delay(50);
Console.Write("\b\b\b");
}
Console.WriteLine();
string[] answers =
[
"It is certain.", "Reply hazy, try again.", "Don't count on it.",
"It is decidedly so.", "Ask again later.", "My reply is no.",
"Without a doubt.", "Better not tell you now.", "My sources say no.",
"Yes – definitely.", "Cannot predict now.", "Outlook not so good.",
"You may rely on it.", "Concentrate and ask again.", "Very doubtful.",
"As I see it, yes.",
"Most likely.",
"Outlook good.",
"Yes.",
"Signs point to yes.",
];
var index = new Random().Next(answers.Length - 1);
Console.WriteLine(answers[index]);
Az előző kód ésszerű. Működik. De nem használható újra. Most, hogy már működik az alkalmazás, ideje elővenni az újrafelhasználható alkatrészeket.
Az egyik jelölt a várakozó animációt megjelenítő kód. Ez a kódrészlet a következő módszer lehet:
Első lépésként hozzon létre egy helyi függvényt a fájlban. Cserélje le az aktuális animációt a következő kódra:
await ShowConsoleAnimation();
static async Task ShowConsoleAnimation()
{
for (int i = 0; i < 20; i++)
{
Console.Write("| -");
await Task.Delay(50);
Console.Write("\b\b\b");
Console.Write("/ \\");
await Task.Delay(50);
Console.Write("\b\b\b");
Console.Write("- |");
await Task.Delay(50);
Console.Write("\b\b\b");
Console.Write("\\ /");
await Task.Delay(50);
Console.Write("\b\b\b");
}
Console.WriteLine();
}
Az előző kód létrehoz egy helyi függvényt a fő metódusban. Ez még mindig nem használható újra. Tehát bontsa ki a kódot egy osztályba. Hozzon létre egy utilities.cs nevű új fájlt, és adja hozzá a következő kódot:
namespace MyNamespace
{
public static class Utilities
{
public static async Task ShowConsoleAnimation()
{
for (int i = 0; i < 20; i++)
{
Console.Write("| -");
await Task.Delay(50);
Console.Write("\b\b\b");
Console.Write("/ \\");
await Task.Delay(50);
Console.Write("\b\b\b");
Console.Write("- |");
await Task.Delay(50);
Console.Write("\b\b\b");
Console.Write("\\ /");
await Task.Delay(50);
Console.Write("\b\b\b");
}
Console.WriteLine();
}
}
}
A legfelső szintű utasításokkal rendelkező fájlok névtereket és típusokat is tartalmazhatnak a fájl végén, a legfelső szintű utasítások után. Ebben az oktatóanyagban azonban egy külön fájlba helyezte az animációs módszert, hogy könnyebben újrafelhasználható legyen.
Végül törölheti az animációs kódot a duplikációk eltávolításához:
foreach (string s in animations)
{
Console.Write(s);
await Task.Delay(50);
Console.Write("\b\b\b");
}
Most már rendelkezik egy teljes alkalmazással, és újrabontással újrahasználta az újrahasználható alkatrészeket későbbi használatra. Az új segédprogram metódust a legfelső szintű utasításokból hívhatja meg, ahogyan az a fő program befejezett verziójában alább látható:
using MyNamespace;
Console.WriteLine();
foreach(var s in args)
{
Console.Write(s);
Console.Write(' ');
}
Console.WriteLine();
await Utilities.ShowConsoleAnimation();
string[] answers =
[
"It is certain.", "Reply hazy, try again.", "Don’t count on it.",
"It is decidedly so.", "Ask again later.", "My reply is no.",
"Without a doubt.", "Better not tell you now.", "My sources say no.",
"Yes – definitely.", "Cannot predict now.", "Outlook not so good.",
"You may rely on it.", "Concentrate and ask again.", "Very doubtful.",
"As I see it, yes.",
"Most likely.",
"Outlook good.",
"Yes.",
"Signs point to yes.",
];
var index = new Random().Next(answers.Length - 1);
Console.WriteLine(answers[index]);
Az előző példa hozzáadja a hívást Utilities.ShowConsoleAnimation
, és hozzáad egy további using
utasítást.
Összesítés
A legfelső szintű utasítások megkönnyítik az új algoritmusok megismerésére szolgáló egyszerű programok létrehozását. Az algoritmusokkal kísérletezhet különböző kódrészletek kipróbálásával. Miután megtudta, hogy mi működik, újrabontást végezhet a kódon, hogy könnyebben karbantartható legyen.
A legfelső szintű utasítások leegyszerűsítik a konzolalkalmazásokon alapuló programokat. Ezek közé tartoznak az Azure-függvények, a GitHub-műveletek és más kis segédprogramok. További információ: Legfelső szintű utasítások (C# programozási útmutató).