Klasyczny pierwszy program wypisuje jedną linię tekstu. W C# wygląda tak:
Wynik:
Hello, World!
Linia po linii
using System;pozwala pisaćConsolezamiast pełnej nazwySystem.Console.Consoleto klasa w namespaceSystem(zobacz namespace i using).class Programdeklaruje klasę. Cały kod C# znajduje się wewnątrz jakiegoś typu; nazwaProgramto konwencja, a nie wymóg.static void Main()to punkt wejścia. Gdy program startuje, środowisko uruchomieniowe szuka statycznej metody o nazwieMaini ją wywołuje.staticoznacza, że należy do samej klasy, więc nie trzeba najpierw tworzyć obiektu.voidoznacza, że nic nie zwraca.Console.WriteLine("Hello, World!");wywołuje metodęWriteLinez argumentem typu string. Każda instrukcja kończy się średnikiem.- Nawiasy klamrowe
{ }wyznaczają ciało klasy i metody.
C# rozróżnia wielkość liter. console.writeline i main to inne nazwy niż Console.WriteLine i Main i żadna z nich nie istnieje.
Console.WriteLine a Console.Write
WriteLine dodaje znak nowej linii po tekście. Write tego nie robi, więc następne wyjście jest kontynuowane w tej samej linii. Obie przyjmują dowolny typ, nie tylko stringi: liczby, wartości logiczne i obiekty są konwertowane metodą ToString().
Wynik:
Loading.. done
42
True
Item: coffee
coffee costs 3.20
coffee costs 3.20
Zwróć uwagę, że true wypisuje się jako True: tak zwraca bool.ToString(). Forma $"...", zwana interpolacją stringów, to ta, której będziesz używać najczęściej; kody formatowania, takie jak :F2, opisuje strona o interpolacji stringów.
Wczytywanie danych przez Console.ReadLine
Console.ReadLine() czeka, aż użytkownik wpisze linię i naciśnie Enter, a potem zwraca tę linię jako string bez znaku nowej linii. Na końcu danych wejściowych (na przykład gdy wejście jest przekierowane z pliku, który się skończył) zwraca null.
Wynik:
What is your name? How old are you?
Hi Maya, next year you will be 28.
Gdy uruchomisz to w terminalu, wpisywany tekst pojawi się po każdym pytaniu. W powyższym wyniku nie ma wpisanego tekstu, bo dane wejściowe zostały przekierowane (przez potok), a nie wpisane, więc widać tylko to, co wypisuje sam program.
ReadLine zawsze zwraca tekst. Aby użyć wartości jako liczby, trzeba ją skonwertować. int.Parse(text) rzuca FormatException, gdy tekst nie jest liczbą; int.TryParse zamiast tego zwraca false, dlatego to właściwy wybór dla danych od użytkownika. Szczegóły są na stronie o konwersji typów.
Dwie pokrewne metody: Console.Read() zwraca następny znak jako kod int, a Console.ReadKey() odczytuje pojedyncze naciśnięcie klawisza bez czekania na Enter (działa tylko w interaktywnym terminalu).
Inne formy metody Main
Main może przyjmować argumenty wiersza poleceń i może zwracać kod wyjścia. Wszystkie te punkty wejścia są poprawne:
static void Main()
static void Main(string[] args)
static int Main()
static int Main(string[] args)
static async Task Main() // C# 7.1 and later
static async Task<int> Main(string[] args) // C# 7.1 and later
Zwrócony int staje się kodem wyjścia procesu, który skrypty i systemy CI odczytują, aby ustalić, czy program zakończył się sukcesem (zgodnie z konwencją 0 oznacza sukces).
Wynik:
Got 0 argument(s)
Uruchom go przez dotnet run -- apples pears, a args będzie zawierać "apples" i "pears". -- oddziela argumenty dla twojego programu od argumentów dla narzędzia dotnet.
Komentarze
C# ma trzy rodzaje komentarzy. Kompilator ignoruje je wszystkie.
// A single-line comment runs to the end of the line.
/* A block comment
can span several lines. */
/// <summary>
/// An XML documentation comment. Editors show it as the tooltip for the method.
/// </summary>
static decimal ApplyDiscount(decimal price) => price * 0.9m;
Używaj // do notatek w kodzie. Komentarze /// umieszcza się nad typami i publicznymi składowymi; IDE pokazuje je po najechaniu kursorem na wywołanie, a kompilator potrafi wyeksportować je do pliku XML dla narzędzi dokumentacji.
Tworzenie i uruchamianie projektu przez dotnet
Na własnym komputerze zainstaluj .NET SDK ze strony dotnet.microsoft.com, a potem:
dotnet new console -o HelloApp
cd HelloApp
dotnet run
Hello, World!
dotnet new console tworzy dwa pliki: HelloApp.csproj (plik projektu: docelowy framework, ustawienia, odwołania do pakietów) i Program.cs. dotnet run kompiluje projekt i go uruchamia. dotnet build kompiluje bez uruchamiania i zapisuje wynik w bin/Debug/net8.0/ (nazwa folderu zależy od docelowego frameworka).
Instrukcje najwyższego poziomu (C# 9 i nowsze)
Otwórz wygenerowany Program.cs, a znajdziesz tam tylko to:
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
To program z instrukcjami najwyższego poziomu (top-level statements), funkcją C# 9. Kompilator generuje klasę Program i metodę Main wokół twoich instrukcji. Brakuje też using System;, bo projekty w .NET 6 i nowszych włączają niejawne usingi (implicit usings): popularne namespace, takie jak System, System.IO, System.Linq i System.Collections.Generic, są importowane dla całego projektu.
Programy z instrukcjami najwyższego poziomu nadal mogą czytać args, używać await i zwracać kod wyjścia przez return:
// C# 9 and later: the whole Program.cs
Console.Write("Name: ");
string? name = Console.ReadLine();
Console.WriteLine($"Hello, {name}! You passed {args.Length} arguments.");
return 0;
Instrukcje najwyższego poziomu może zawierać tylko jeden plik w projekcie, a typy (klasy, rekordy) muszą znajdować się po nich. Adnotacja string? to typ referencyjny dopuszczający null (C# 8) i jest tu, bo ReadLine może zwrócić null. Jawna forma class Program używana w przykładach na tej stronie jest równoważna i spotkasz ją w starszym kodzie oraz w większości skryptów Unity, więc warto umieć czytać obie. Jeśli w nowych projektach wolisz formę jawną, przekaż --use-program-main do dotnet new console.
Błędy, które zobaczysz najpierw
- CS1002: ; expected. W instrukcji brakuje średnika. Błąd jest zgłaszany na końcu linii, w której go brakuje.
- CS0103: The name 'console' does not exist in the current context. Zła wielkość liter albo brak
using System;w projekcie bez niejawnych usingów. - CS5001: Program does not contain a static 'Main' method suitable for an entry point.
Mainma literówkę, nie jeststaticalbo ma nieobsługiwaną sygnaturę. - CS0017: Program has more than one entry point defined. Dwie klasy mają po metodzie
Main. Zostaw jedną albo wybierz jedną ustawieniemStartupObjectw pliku.csproj. - Okno od razu się zamyka. Gdy aplikację konsolową uruchamia się dwuklikiem, okno zamyka się, gdy
Mainzakończy działanie. Uruchom ją z terminala albo na czas testów dodajConsole.ReadKey();na końcu.
Najczęściej zadawane pytania
Jak napisać Hello World w C#?
Umieść Console.WriteLine("Hello, World!"); w metodzie static void Main() jakiejś klasy, z using System; na początku pliku. W projekcie utworzonym przez dotnet new console w .NET 6 lub nowszym cały plik może składać się z tej jednej linii, bo instrukcje najwyższego poziomu generują za ciebie klasę i Main.
Czym jest metoda Main w C#?
Main to punkt wejścia: metoda, którą środowisko uruchomieniowe wywołuje przy starcie programu. Musi być static, może zwracać void albo int (kod wyjścia) i może przyjmować parametr string[] args z argumentami wiersza poleceń. Program potrzebuje dokładnie jednej takiej metody.
Czym różni się Console.Write od Console.WriteLine?
Console.WriteLine wypisuje tekst i znak nowej linii, więc następne wyjście zaczyna się w nowej linii. Console.Write wypisuje tylko tekst, więc następne wyjście jest kontynuowane w tej samej linii. Console.WriteLine() bez argumentów wypisuje pustą linię.
Jak wczytać dane od użytkownika w C#?
Console.ReadLine() czyta jedną linię tekstu i zwraca ją jako string (bez znaku nowej linii) albo null, gdy nie ma już danych. Aby dostać liczbę, skonwertuj string: int.TryParse(Console.ReadLine(), out int n) zwraca false zamiast wywracać program, gdy tekst nie jest liczbą.
Jak uruchomić program w C# z wiersza poleceń?
Zainstaluj .NET SDK, a potem uruchom dotnet new console -o HelloApp, aby utworzyć projekt, cd HelloApp i dotnet run, aby go zbudować i uruchomić. dotnet build tylko kompiluje i umieszcza wynik w bin/Debug/net8.0/ (albo w folderze wersji, na którą celujesz).