String Interpolation

String interpolation یا الحاق رشته‌ها، به شما اجازه می‌دهد که، عبارات رشته‌ای با خوانایی بیشتر ایجاد کنید. در نسخه‌های قبلی سی شارپ از متد string.format برای الحاق رشته‌ها و در نسخه 6 از ویژگی String interpolation برای این کار استفاده می‌شود. دستور استفاده از این ویژگی جدید به صورت زیر است :

$"some text {expression} some other text"

همانطور که در کد بالا مشاهده می‌کنید، برای الحاق رشته‌ها قبل از هر رشته یک علامت $ قرار می‌دهیم. در داخل رشته هم یک یا چند عبارت را که در داخل آکولاد هستند، می‌نویسیم. این عبارت می‌تواند یک متغیر و یا حاصل یک یا چند متغیر باشد. هر چیز در داخل آکولاد ارزیابی شده و با استفاده از متد ()ToString به رشته تبدیل و در داخل رشته قرار داده می‌شود. اگر بخواهید خود آکولادها هم پردازش شده و در نتیجه نهایی نمایش داده شوند باید از دو علامت آکولاد استفاده کنید ({{ and }}). به مثال زیر توجه کنید :

   1: public class Program
   2: {
   3:     public static void Main(string[] args)
   4:     {
   5:         string message = "Hello World";
   6: 
   7:         string interpolatedString = $"The message is {message}";
   8: 
   9:         Console.WriteLine(interpolatedString);
  10:     }
  11: }
The message is Hello World

در خط 5 یک رشته تعریف شده است. می‌خواهیم این رشته را به رشته دیگر بچسبانیم. برای این کار در خط 7 و با استفاده از ویژگی string interpolation این کار را انجام داده‌ایم. در این خط یک متغیر که نتیجه الحاق دو رشته در آن قرار می‌گیرد را تعریف کرده‌ایم. همانطور که مشاهده می‌کنید متغیر تعریف شده در خط 5 را در خط 7 داخل علامت آکولاد قرار داده‌ایم. مقدار این متغیر در داخل عبارت موجود در خط 7 قرار می‌گیرد. در مثال زیر نحوه الحاق چندین رشته نمایش داده شده است :

   1: public class Program
   2: {
   3:     public static void Main(string[] args)
   4:     {
   5:         string firstName = "John";
   6:         string lastName  = "Smith";
   7:         int age = 20;
   8: 
   9:         Console.WriteLine($"His name is {firstName} {lastName} and his age is {age}.");
  10:     }
  11: }
His name is John Smith and his age is 20.

همانطور که در مثال بالا مشاهده می‌کنید، با استفاده از این ویژگی می‌توانیم متغیرهای غیر رشته‌ای را هم به رشته‌ها بچسبانیم. در مثال زیر تقریباً تمام حالات ممکن در الحاق رشته آمده است :

   1: namespace StringInterpolation
   2: {
   3:     public class Program
   4:     {
   5:         public static void Main(string[] args)
   6:         {
   7:             int num1 = 10;
   8:             int num2 = 20;
   9:             string message = "hello world";
  10:             Person person = new Person { FirstName = "John", LastName = "Smith" };
  11:             
  12:             Console.WriteLine($"The sum of num1 and num2 is {num1 + num2}");
  13:             Console.WriteLine($"num1 less 1 is {num1 - 1}");
  14:             Console.WriteLine($"num2 divided by num1 is {num2 / num1}");
  15: 
  16:             Console.WriteLine($"num1 is equal to num2? {num1 == num2}");
  17: 
  18:             Console.WriteLine($"{message} in all caps is {message.ToUpper()}");
  19:             Console.WriteLine($"num1 added by 100 is {Add100(num1)}");
  20: 
  21:             Console.WriteLine($"Full name is {person.FirstName + " " + person.LastName}");
  22:         }
  23: 
  24:         private static int Add100(int number)
  25:         {
  26:             return number + 100;
  27:         }
  28:     }
  29: 
  30:     public class Person
  31:     {
  32:         public string FirstName { get; set; }
  33:         public string LastName { get; set; }
  34:     }
  35: }
The sum of num1 and num2 is 30
num1 less 1 is 9
num2 divided by num1 is 2
num1 is equal to num2? False
hello world in all caps is HELLO WORLD
num1 added by 100 is 110
Full name is John Smith

در خطوط 12 – 14 از عبارات ساده ریاضی به عنوان عبارات الحاقی و در خط 16 از دستور شرطی که مقدار true یا false را بر می‌گرداند استفاده کرده‌ایم. در خطوط 18 و 19 از متدهایی استفاده شده که مقدار برگشتی از آنها در عبارات الحاقی قرار می‌گیرند. در خط 21 روش قدیمی الحاق رشته‌ها به کار برده شده است که شما می‌توانید از عبارات الحاقی به جای آن استفاده کنید.

قالب بندی عبارات الحاقی

می‌توان نتیجه یک عبارت الحاقی را قالب بندی کرد. برای این کار از کاراکترهای خاص که در درس قالب بندی رشته‌ها و اعداد آمده‌اند می‌توان به صورت زیر استفاده کرد :

$"some text {expression:format} some other text"

به عنوان مثال :

   1: public class Program
   2: {
   3:     public static void Main(string[] args)
   4:     {
   5:         double number = 100.1234;
   6:         DateTime today = DateTime.Now;
   7: 
   8:         Console.WriteLine($"Formatted to currency: {number:C}");
   9:         Console.WriteLine($"2 decimal places {number:F2}");
  10:         Console.WriteLine($"As percentage: {(number / 100):P}");
  11: 
  12:         Console.WriteLine($"Current Month {today:MM}");
  13:         Console.WriteLine($"Current Day {today:dd}");
  14:         Console.WriteLine($"Current Hour {today:hh}");
  15: 
  16:         Console.WriteLine($"Date today is {today:MM/dd/yyyy hh:mm:ss}");
  17:     }
  18: }
Formatted to currency: $100.12
2 decimal places 100.12
As percentage: 100.12 %
Current Month 08
Current Day 15
Current Hour 04
Date today is 08/15/2015 04:48:28

لیست کاراکترهای قالب بندی اعداد و تاریخ در لینک‌های زیر آمده است :

مشخص کردن طول فیلدها

تعیین طول فیلدها برای تراز بندی مقادیر مفید است، مخصوصاً اگر بخواهید که آنها را در ستون‌های مختلفی نمایش دهید :

$"some text {expression, fieldWidth} some other text"

این یک مثال ساده بود. فرض کنید که می‌خواهیم یک رشته یا عدد را تراز کنیم. برای اینکار می‌توانی از اعداد مثبت و منفی به صورتی که در مثال زیر آمده است، استفاده کنیم. عدد مثبت باعث اضافه شدن فضای خالی به سمت راست و عدد منفی باعث اضافه شدن فضای خالی به سمت چپ عدد یا رشته می‌شود. البته این تعداد فضای خالی به طول رشته یا عدد بستگی دارد. فرض کنید که یک رشته به طول 5 کاراکتر داریم و عدد 10 را برای اضافه کردن فضای خالی به سمت راست آن، به کار می‌بریم. در اینصورت 5 = 5 – 10 کاراکتر به سمت راست آن اضافه می‌شود. یعنی تعداد فضاهای خالی اضافه شده از تفاضل طولی فیلد و طول رشته به دست می‌آید :

   1: public static void Main(string[] args)
   2: {
   3:     int number = 100;
   4: 
   5:     Console.WriteLine("Using field width of 10.");
   6:     Console.WriteLine($"Start {number, 10} End");
   7: 
   8:     Console.WriteLine("\nUsing field width of -10.");
   9:     Console.WriteLine($"Start {number,-10} End");
  10: }
Using field width of 10.
Start 100        End

Using field width of -10.
Start        100 End

در مثال بالا طول رشته “100” سه کاراکتر است. بنابراین 7 فضای خالی به سمت راست یا چپ آن اضافه می‌شود. می‌توان از ترازبندی و قالب بندی به طور همزمان در یک عبارت الحاقی استفاده کرد :

$"some text {expression, fieldWidth:format} some other text"

در مثال زیر نحوه استفاده از ترازبندی و قالب بندی به طور همزمان نشان داده شده است :

   1: using System;
   2: using System.Collections.Generic;
   3: 
   4: namespace StringInterpolation
   5: {
   6:     public class Program
   7:     {
   8:         public static void Main(string[] args)
   9:         {
  10:             List<Product> products = new List<Product>
  11:             {
  12:                 new Product { ID = 1, Name = "Soap", Price = 5 },
  13:                 new Product { ID = 2, Name = "Toothpaste", Price = 20 },
  14:                 new Product { ID = 3, Name = "Portal Gun", Price = 999999999 }
  15:             };
  16: 
  17:             // Print the header
  18:             Console.WriteLine($"|{ "Code",-5}|{ "Name",-15 }|{ "Price", 20}|");
  19: 
  20:             foreach(var p in products)
  21:             {
  22:                 Console.WriteLine($"|{ p.ID, -5 }|{ p.Name, -15 }|{ p.Price, 20:C}|");
  23:             }
  24:         }
  25:     }
  26: 
  27:     public class Product
  28:     {
  29:         public int ID { get; set;}
  30:         public string Name { get; set; }
  31:         public decimal Price { get; set; }
  32:     }
  33: }
|Code |Name           |               Price|
|1    |Soap           |               $5.00|
|2    |Toothpaste     |              $20.00|
|3    |Portal Gun     |     $999,999,999.00|