Menu

Hello World w C#: Main, Console.WriteLine i ReadLine

Twój pierwszy program w C# linia po linii: metoda Main, Console.WriteLine i Write, wczytywanie danych przez Console.ReadLine, komentarze, tworzenie i uruchamianie projektu przez dotnet CLI oraz instrukcje najwyższego poziomu.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Klasyczny pierwszy program wypisuje jedną linię tekstu. W C# wygląda tak:

Wynik:

Hello, World!

Linia po linii

  • using System; pozwala pisać Console zamiast pełnej nazwy System.Console. Console to klasa w namespace System (zobacz namespace i using).
  • class Program deklaruje klasę. Cały kod C# znajduje się wewnątrz jakiegoś typu; nazwa Program to konwencja, a nie wymóg.
  • static void Main() to punkt wejścia. Gdy program startuje, środowisko uruchomieniowe szuka statycznej metody o nazwie Main i ją wywołuje. static oznacza, że należy do samej klasy, więc nie trzeba najpierw tworzyć obiektu. void oznacza, że nic nie zwraca.
  • Console.WriteLine("Hello, World!"); wywołuje metodę WriteLine z 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. Main ma literówkę, nie jest static albo ma nieobsługiwaną sygnaturę.
  • CS0017: Program has more than one entry point defined. Dwie klasy mają po metodzie Main. Zostaw jedną albo wybierz jedną ustawieniem StartupObject w pliku .csproj.
  • Okno od razu się zamyka. Gdy aplikację konsolową uruchamia się dwuklikiem, okno zamyka się, gdy Main zakończy działanie. Uruchom ją z terminala albo na czas testów dodaj Console.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).

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ