Megosztás a következőn keresztül:


Oktatóanyag: Ötletek felfedezése legfelső szintű utasítások használatával kód összeállítása a tanulás során

Ebben az oktatóanyagban a következőket sajátíthatja el:

  • 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-os vagy újabb verziójának futtatására. A C# fordító a Visual Studio 2022-tól vagy a .NET SDK-tól é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.

Felfedezés kezdete

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 dotnet new console parancs futtatásának é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, hogy minden sort eltávolítson, kivéve kettőt ebből a programból.

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

Fontos

A .NET 6 C#-sablonjai legfelső 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ó: Ú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óért tekintse meg a cikket: Implicit használati irányelvek .

Ez a funkció leegyszerűsíti az új ötletek feltárását. 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 egyéb 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 építheti ki. 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 funkcionalitással, elvégezheti az alkalmazás újraírását, ahogyan jónak 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álhat args változót. A legfelső szintű utasításokat tartalmazó egyetlen forrásfájl esetében a fordító felismeri a args kifejezést úgy, mint a parancssori argumentumokat. 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 parancssorban lévő -- utáni argumentumok a programnak lesznek átadva. Láthatja a konzolra nyomtatott args változó típusát:

System.String[]

A kérdés konzolra írásához 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.",
];

Ebben a tömbben 10 igenlő válasz, öt nem válasz, öt pedig negatív válasz. 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.

A válasz létrehozásához használt kód tartalmaz egy változó deklarációt a legfelső szintű utasításokban. A fordító tartalmazza ezt a deklarációt a fordítóban létrehozott Main metódusban. Mivel ezek a változódeklarációk helyi változók, a static módosító nem használható.

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();

Emellett hozzá kell adnia egy using direktívát a forrásfájl elejéhez:

using System.Threading.Tasks;

A using irányelveknek 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 egy System.Threading.Tasks.Taskad vissza. Ez a program nem ad vissza értéket, ezért a program belépési pontja egy Taskad vissza. 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 await kifejezést tartalmaznak, a visszatérési típus System.Threading.Tasks.Task<TResult>lesz.

Újrafaktorálás a jövőért

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 a kód még mindig nem használható újra. Tehát szervezze át 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 megtisztíthatja az animációs kódot a duplikációk eltávolításához, foreach hurok használatával iterálhat a animations tömbben definiált animációs elemeken keresztül.
Az újrabontás utáni teljes ShowConsoleAnimation metódusnak az alábbi kódhoz hasonlóan kell kinéznie:

public static async Task ShowConsoleAnimation()
{
    string[] animations = ["| -", "/ \\", "- |", "\\ /"];
    for (int i = 0; i < 20; i++)
    {
        foreach (string s in animations)
        {
            Console.Write(s);
            await Task.Delay(50);
            Console.Write("\b\b\b");
        }
    }
    Console.WriteLine();
}

Most már rendelkezik egy teljes alkalmazással, és újra átképezte 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 kész verziójában is 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 Utilities.ShowConsoleAnimationhívást, és hozzáad egy másik using irányelvet.

Összefoglalá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, újrafunkálhatja a kódot, hogy könnyebben karbantartható legyen.

A legfelső szintű utasítások leegyszerűsítik a konzolalkalmazásokon alapuló programokat. Ezek az alkalmazások 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ó).