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

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ó).