Udostępnij za pośrednictwem


Konstruowanie ciągów sformatowanych ciągów za pomocą interpolacji ciągów

W tym samouczku pokazano, jak za pomocą interpolacji ciągów języka C# wstawić wartości do pojedynczego ciągu wynikowego. Napiszesz kod w języku C# i zobaczysz wyniki kompilowania i uruchamiania go. Samouczek zawiera serię lekcji, które pokazują, jak wstawiać wartości do ciągu i formatować te wartości na różne sposoby.

Ten samouczek oczekuje, że masz maszynę, której możesz użyć do programowania. Samouczek platformy .NET Hello world w ciągu 10 minut zawiera instrukcje dotyczące konfigurowania lokalnego środowiska projektowego w systemie Windows, Linux lub macOS. Możesz również ukończyć interaktywną wersję tego samouczka w przeglądarce.

Tworzenie ciągu interpolowanego

Utwórz katalog o nazwie interpolowany. Ustaw go jako bieżący katalog i uruchom następujące polecenie w oknie konsoli:

dotnet new console

To polecenie tworzy nową aplikację konsolową platformy .NET Core w bieżącym katalogu.

Otwórz plik Program.cs w ulubionym edytorze i zastąp wiersz Console.WriteLine("Hello World!"); następującym kodem, w którym zastąp <name> ciąg nazwą:

var name = "<name>";
Console.WriteLine($"Hello, {name}. It's a pleasure to meet you!");

Wypróbuj ten kod, wpisując dotnet run polecenie w oknie konsoli. Kiedy uruchomisz program, zostanie wyświetlony jeden ciąg z Twoim imieniem w powitaniu. Ciąg zawarty w wywołaniu WriteLine metody jest wyrażeniem ciągu interpolowanego. Jest to rodzaj szablonu, który umożliwia skonstruowanie pojedynczego ciągu (zwanego ciągiem wynikowym) z ciągu obejmującego osadzony kod. Ciągi interpolowane są szczególnie użyteczne do wstawiania wartości do ciągu lub łączenia ciągów.

Ten prosty przykład zawiera dwa elementy, które musi mieć każdy ciąg interpolowany:

  • Literał ciągu rozpoczynający się od znaku $ przed otwierającym znakiem cudzysłowu. Pomiędzy symbolem $ i znakiem zapytania nie może być żadnych odstępów. (Jeśli chcesz zobaczyć, co się stanie, jeśli go dołączysz, wstaw spację po $ znaku, zapisz plik i uruchom program ponownie, wpisując polecenie dotnet run w oknie konsoli. Kompilator języka C# wyświetla komunikat o błędzie "error CS1056: Unexpected character '$'".

  • Co najmniej jedno wyrażenie interpolacji. Wyrażenie interpolacji jest wskazywane przez otwierający i zamykający nawias klamrowy ({ i }). Do nawiasów klamrowych możesz wstawić dowolne wyrażenie języka C# zwracające wartość (w tym null).

Wypróbujmy jeszcze kilka przykładów interpolacji ciągów z innymi typami danych.

Uwzględnianie innych typów danych

W poprzedniej sekcji użyto interpolacji ciągów, aby wstawić jeden ciąg wewnątrz innego. Wynik wyrażenia interpolacji może mieć dowolny typ danych. Uwzględnijmy wartości różnych typów danych w ciągu interpolowanym.

W poniższym przykładzie najpierw definiujemy typ Vegetable danych klasy, który ma Namewłaściwość i metodęToString, która zastępuje zachowanie Object.ToString() metody. Modyfikatorpublic dostępu udostępnia tę metodę dowolnemu kodowi klienta, aby uzyskać reprezentację Vegetable ciągu wystąpienia. W przykładzie Vegetable.ToString metoda zwraca wartość Name właściwości zainicjowanej w konstruktorzeVegetable:

public Vegetable(string name) => Name = name;

Następnie tworzymy wystąpienie Vegetable klasy o nazwie item przy użyciu new operatora i podajemy nazwę konstruktora Vegetable:

var item = new Vegetable("eggplant");

Na koniec dołączymy zmienną item do ciągu interpolowanego, który zawiera DateTime również wartość, Decimal wartość i Unit wartość wyliczenia. Zastąp cały kod języka C# w edytorze następującym kodem, a następnie użyj dotnet run polecenia , aby go uruchomić:

using System;

public class Vegetable
{
   public Vegetable(string name) => Name = name;

   public string Name { get; }

   public override string ToString() => Name;
}

public class Program
{
   public enum Unit { item, kilogram, gram, dozen };

   public static void Main()
   {
      var item = new Vegetable("eggplant");
      var date = DateTime.Now;
      var price = 1.99m;
      var unit = Unit.item;
      Console.WriteLine($"On {date}, the price of {item} was {price} per {unit}.");
   }
}

Należy pamiętać, że wyrażenie item interpolacji w ciągu interpolowanym jest rozpoznawane jako tekst "eggplant" w ciągu wynikowym. Dzieje się tak dlatego, że gdy typ wyniku wyrażenia nie jest ciągiem, wynik jest rozpoznawany jako ciąg w następujący sposób:

  • Jeśli wyrażenie interpolacji daje w wyniku wartość null, jest używany pusty ciąg ("" lub String.Empty).

  • Jeśli wyrażenie interpolacji nie daje wartości null, zazwyczaj ToString wywoływana jest metoda typu wyniku. Można to przetestować, aktualizując implementację Vegetable.ToString metody . Być może nawet nie trzeba implementować ToString metody, ponieważ każdy typ ma implementację tej metody. Aby to przetestować, oznacz jako komentarz definicję Vegetable.ToString metody w przykładzie (w tym celu umieść przed nim symbol komentarza , //). W danych wyjściowych ciąg "eggplant" jest zastępowany przez w pełni kwalifikowaną nazwę typu ("Warzywo" w tym przykładzie), co jest zachowaniem domyślnym Object.ToString() metody. Domyślnym zachowaniem ToString metody dla wartości wyliczenia jest zwrócenie reprezentacji ciągu wartości.

W danych wyjściowych z tego przykładu data jest zbyt precyzyjna (cena bakłażana nie zmienia się co sekundę), a wartość ceny nie wskazuje jednostki waluty. W następnej sekcji dowiesz się, jak rozwiązać te problemy, kontrolując format reprezentacji ciągu w wynikach wyrażenia.

Kontrolowanie formatowania wyrażeń interpolacji

W poprzedniej sekcji do ciągu wynikowego wstawiono dwa źle sformatowane ciągi. Jednym z nich była wartość daty i godziny, chociaż tylko data powinna mieć zastosowanie. Drugi był ceną, która nie wskazywała swojej jednostki waluty. Oba problemy można z łatwością rozwiązać. Interpolacja ciągów umożliwia określenie ciągów formatu kontrolujących formatowanie określonych typów. Zmodyfikuj wywołanie metody Console.WriteLine z poprzedniego przykładu, aby uwzględnić ciągi formatu dla wyrażeń daty i ceny, jak pokazano w następującym wierszu:

Console.WriteLine($"On {date:d}, the price of {item} was {price:C2} per {unit}.");

Należy określić ciąg formatu, postępując zgodnie z wyrażeniem interpolacji z dwukropkiem (":") i ciągiem formatu. „d” jest standardowym ciągiem formatu daty i godziny, który reprezentuje krótki format daty. "C2" to standardowy ciąg formatu liczbowego , który reprezentuje liczbę jako wartość waluty z dwiema cyframi po przecinku dziesiętnym.

Wiele typów w bibliotekach .NET obsługuje wstępnie zdefiniowany zestaw ciągów formatu. Uwzględnia to wszystkie typy numeryczne oraz typy daty i godziny. Aby uzyskać kompletną listę typów, które obsługują ciągi formatu, zobacz Ciągi formatu i typy biblioteki klas .NET w artykule Typy formatowania na platformie .NET.

Spróbuj zmodyfikować ciągi formatu w edytorze tekstów i za każdym razem, gdy wprowadzisz zmianę, uruchom ponownie program, aby zobaczyć, jak zmiany wpływają na formatowanie daty i godziny oraz wartości liczbowej. Zmień „d” w ciągu {date:d} na „t” (aby wyświetlić krótki format daty), „y” (aby wyświetlić rok i miesiąc) oraz „yyyy” (aby wyświetlać rok jako liczbę czterocyfrową). Zmień „C2” w ciągu {price:C2} na „e” (notacja wykładnicza) oraz „F3” (wartość numeryczna z trzema cyframi po separatorze dziesiętnym).

Oprócz kontrolowania formatowania można również kontrolować szerokość pola i wyrównanie sformatowanych ciągów zawartych w ciągu wynikowym. W następnej sekcji dowiesz się, jak to zrobić.

Kontrolowanie szerokości pola i wyrównania wyrażeń interpolacji

Zwykle, gdy wynik wyrażenia interpolacji jest sformatowany na ciąg, ciąg jest uwzględniany w ciągu wynikowym bez spacji wiodących lub końcowych. Szczególnie w przypadku pracy z zestawem danych możliwość kontrolowania szerokości pola i wyrównania tekstu pomaga wygenerować bardziej czytelne dane wyjściowe. Aby to zobaczyć, zastąp cały kod w edytorze tekstów następującym kodem, a następnie wpisz dotnet run polecenie , aby wykonać program:

using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
      var titles = new Dictionary<string, string>()
      {
          ["Doyle, Arthur Conan"] = "Hound of the Baskervilles, The",
          ["London, Jack"] = "Call of the Wild, The",
          ["Shakespeare, William"] = "Tempest, The"
      };

      Console.WriteLine("Author and Title List");
      Console.WriteLine();
      Console.WriteLine($"|{"Author",-25}|{"Title",30}|");
      foreach (var title in titles)
         Console.WriteLine($"|{title.Key,-25}|{title.Value,30}|");
   }
}

Nazwy autorów są wyrównane do lewej, a napisane przez nich tytuły są wyrównane do prawej. Wyrównanie określa się przez dodanie przecinka (",") po wyrażeniu interpolacji i wyznaczeniu minimalnej szerokości pola. Jeśli określona wartość jest liczbą dodatnią, pole jest wyrównane do prawej. Jeśli jest to liczba ujemna, pole jest wyrównane do lewej.

Spróbuj usunąć znaki ujemne z kodu {"Author",-25} i i {title.Key,-25} i ponownie uruchomić przykład, jak robi następujący kod:

Console.WriteLine($"|{"Author",25}|{"Title",30}|");
foreach (var title in titles)
   Console.WriteLine($"|{title.Key,25}|{title.Value,30}|");

Tym razem informacje o autorze są wyrównane do prawej.

Można połączyć specyfikator wyrównania i ciąg formatu dla pojedynczego wyrażenia interpolacji. Aby to zrobić, najpierw określ wyrównanie, a następnie dwukropek i ciąg formatu. Zastąp cały kod wewnątrz Main metody następującym kodem, który wyświetla trzy sformatowane ciągi ze zdefiniowanymi szerokościami pól. Następnie uruchom program, wprowadzając dotnet run polecenie .

Console.WriteLine($"[{DateTime.Now,-20:d}] Hour [{DateTime.Now,-10:HH}] [{1063.342,15:N2}] feet");

Dane wyjściowe wyglądają mniej więcej tak:

[04/14/2018          ] Hour [16        ] [       1,063.34] feet

Ukończono samouczek interpolacji ciągów.

Aby uzyskać więcej informacji, zobacz temat Interpolacja ciągów i samouczek Interpolacja ciągów w języku C# .