স্ট্রিংয়ের আগে $ এর অর্থ কী?


250

আমি ভারব্যাটিম স্ট্রিং ব্যবহার করতে যাচ্ছিলাম তবে আমি ভুল করে $পরিবর্তে টাইপ করেছি @

তবে সংকলক আমাকে কোনও ত্রুটি দেয় নি এবং সফলভাবে সংকলিত হয়েছে।

আমি এটি কী এবং এটি কী করে তা জানতে চাই। আমি এটি অনুসন্ধান করেছিলাম কিন্তু আমি কিছুই খুঁজে পেলাম না।

তবে এটি ভারব্যাটিম স্ট্রিংয়ের মতো নয় কারণ আমি লিখতে পারি না:

string str = $"text\";

$C # তে স্ট্রিংয়ের আগে কী দাঁড়ায় তা কি কেউ জানেন ।

string str = $"text";

আমি ভিজ্যুয়াল স্টুডিও 2015 সিটিপি ব্যবহার করছি।

উত্তর:


418

$এর স্বল্প হাত রয়েছে String.Formatএবং স্ট্রিং ইন্টারপোলেশনগুলির সাথে এটি ব্যবহৃত হয় যা সি # 6 এর একটি নতুন বৈশিষ্ট্য যা আপনার ক্ষেত্রে ব্যবহৃত হয়, এটি কিছুই করে না, ঠিক তেমন string.Format()কিছুই করবে না।

অন্যান্য মানগুলির রেফারেন্স সহ স্ট্রিং তৈরি করতে ব্যবহৃত হয় এটি নিজের মধ্যে আসে। আগে যা লিখতে হয়েছিল তা:

var anInt = 1;
var aBool = true;
var aString = "3";
var formated = string.Format("{0},{1},{2}", anInt, aBool, aString);

এখন হয়ে যায়:

var anInt = 1;
var aBool = true;
var aString = "3";
var formated = $"{anInt},{aBool},{aString}";

এর বিকল্প রয়েছে - কম পরিচিত - স্ট্রিং ইন্টারপোলেশন ব্যবহার করে $@ (দুটি চিহ্নের ক্রমটি গুরুত্বপূর্ণ)। এটি আপনার স্ট্রিং জুড়ে প্রয়োজন ছাড়াই স্ট্রিং ইন্টারপোলেশনগুলিকে সমর্থন @""করার জন্য একটি স্ট্রিংয়ের বৈশিষ্ট্যগুলি মিশ্রিত করতে $""দেয় \\। সুতরাং নিম্নলিখিত দুটি লাইন:

var someDir = "a";
Console.WriteLine($@"c:\{someDir}\b\c");

আউটপুট হবে:

c:\a\b\c

29
মনে রাখবেন এটি সত্যই স্ট্রিং.ফর্ম্যাট ব্যবহার করছে না, তবে এটি একটি সংকলক-ভিত্তিক বৈশিষ্ট্য, কোনও রানটাইম নয়।
শাহার প্রিশ

2
গৌণ নোট যে আমি আজ শিখেছি, আপনি যদি ব্যবহার করেন তবে আপনি ব্যবহার $@করে "চরিত্রটি থেকে বাঁচতে বাধ্য হবেন ""। আপনি যখন কেবল ব্যবহার করেন এটি ক্ষেত্রে নয় $
ফ্লটারে

3
@ ফ্লাটার এর সাথে $ প্রতীকটির কোনও যোগসূত্র নেই। $ প্রতীকটির অস্তিত্বের আগে যেমন ছিল তেমন আচরণ।
বিভেরনন

2
ভারব্যাটিমের ক্রম (@) এবং ইন্টারপোলেশন (symbol) প্রতীকটি গুরুত্বপূর্ণ হওয়ার ক্রমটি সম্পর্কে আপনার বক্তব্যটি, এটি সি # 8 এ সংশোধন করা হচ্ছে যাতে অর্ডারটি আর বিবেচনা করে না। দেখুন: devsanon.com/uncategorized/…
এলকাজ

38

এটি একটি ইন্টারপোল্টেড স্ট্রিং তৈরি করে ।

এমএসডিএন থেকে

স্ট্রিং নির্মাণ করতে ব্যবহৃত হয়। একটি ইন্টারপোল্টেড স্ট্রিং এক্সপ্রেশনটি টেম্পলেট স্ট্রিংয়ের মতো দেখায় যার মধ্যে এক্সপ্রেশন থাকে। একটি অন্তরবিচ্ছিন্ন স্ট্রিং এক্সপ্রেশন এক্সপ্রেশন এর ফলাফলের ToString উপস্থাপনা সঙ্গে থাকা এক্সপ্রেশন প্রতিস্থাপন করে একটি স্ট্রিং তৈরি করে।

প্রাক্তন:

 var name = "Sam";
 var msg = $"hello, {name}";

 Console.WriteLine(msg); // hello, Sam

আপনি ইন্টারপোল্টেড স্ট্রিংয়ের মধ্যে এক্সপ্রেশন ব্যবহার করতে পারেন

 var msg = $"hello, {name.ToLower()}";
 Console.WriteLine(msg); // hello, sam

এটি সম্পর্কে দুর্দান্ত জিনিসটি হ'ল প্যারামিটারগুলির ক্রম হিসাবে আপনার যেমন করা উচিত তেমন চিন্তা করার দরকার নেই String.Format

  var s = String.Format("{0},{1},{2}...{88}",p0,p1,..,p88);

এখন আপনি যদি কিছু প্যারামিটারগুলি সরাতে চান তবে আপনাকে যেতে হবে এবং সমস্ত গণনা আপডেট করতে হবে, এটি আর নয়।

মনে রাখবেন যে string.formatআপনি যদি আপনার ফর্ম্যাটিংয়ে সাংস্কৃতিক তথ্য নির্দিষ্ট করতে চান তবে ভাল পুরানোটি এখনও প্রাসঙ্গিক ।


মনে রাখবেন যে আপনি সম্ভবত এখনও $সংস্কৃতি তথ্য ব্যবহার করতে পারেন এবং নির্দিষ্ট সংস্কৃতি ব্যবহার করে যদি আপনার ডেটাটিকে $অভিব্যক্তির অভ্যন্তরে স্ট্রিংয়ে রূপান্তর করেন তবে আপনি সংস্কৃতি তথ্য নির্দিষ্ট করতে পারেন {somevar.ToString(...,[Insert culture info here])}
jrh

18

উদাহরণ কোড

public class Person {
    public String firstName { get; set; }
    public String lastName { get; set; }
}

// Instantiate Person
var person = new Person { firstName = "Albert", lastName = "Einstein" };

// We can print fullname of the above person as follows
Console.WriteLine("Full-Name - " + person.firstName + " " + person.lastName);
Console.WriteLine("Full-Name - {0} {1}", person.firstName, person.lastName);
Console.WriteLine($"Full-Name - {person.firstName} {person.lastName}");

আউটপুট

Full-Name - Albert Einstein
Full-Name - Albert Einstein
Full-Name - Albert Einstein

এটি ইন্টারপোলটেড স্ট্রিংস । আপনি স্ট্রিং আক্ষরিক ব্যবহার করতে পারেন যে কোনও জায়গায় একটি বিভক্ত স্ট্রিং ব্যবহার করতে পারেন। যখন আপনার প্রোগ্রামটি চালিত হয় তখন কোডটি আন্তঃবিবাহিত স্ট্রিং আক্ষরিক দিয়ে চালিত করে, কোডটি ইন্টারপোলেশন এক্সপ্রেশনগুলির মূল্যায়ন করে একটি নতুন স্ট্রিং আক্ষরিক গণনা করে। এই গণনাটি প্রতিটি সময় ইন্টারপোল্টেড স্ট্রিং সহ কোডটি কার্যকর করে।

নিম্নলিখিত উদাহরণটি একটি স্ট্রিং মান তৈরি করে যেখানে সমস্ত স্ট্রিং অন্তঃকরণের মানগুলি গণনা করা হয়েছে। এটি চূড়ান্ত ফলাফল এবং টাইপ স্ট্রিং রয়েছে। ডাবল কোঁকড়া ধনুর্বন্ধনী সব ঘটনা (“{{“ and “}}”)একক কোঁকড়া ধনুর্বন্ধনী মধ্যে রূপান্তরিত হয়।

string text = "World";
var message = $"Hello, {text}";

2 লাইনের উপরে কার্যকর করার পরে ভেরিয়েবলটিতে message"হ্যালো, ওয়ার্ল্ড" রয়েছে।

Console.WriteLine(message); // Prints Hello, World

রেফারেন্স - এমএসডিএন


10

দুর্দান্ত বৈশিষ্ট্য। আমি কেবল স্ট্রিং.ফর্ম্যাটের চেয়ে ভাল কেন এটি জোরটি উল্লেখ করতে চাই যদি এটি কিছু লোকের কাছে প্রকাশ না হয়।

আমি প্যারামিটারগুলির সাথে মেলে "{0} {1} {2}" অর্ডার স্ট্রিং। ফর্ম্যাট বলছে এমন কাউকে পড়েছি। আপনাকে স্ট্রিং.ফর্ম্যাটটিতে "{0} {1} {2}" অর্ডার করতে বাধ্য করা হবে না, আপনি "{2} {0} {1}" করতেও পারেন। তবে, যদি আপনার 20 টির মতো অনেকগুলি প্যারামিটার থাকে তবে আপনি সত্যিই স্ট্রিংটিকে "} 0} {1} {2} ... {19}" তে সিকোয়েন্স করতে চান। যদি এটি একটি বদলে যাওয়া জগাখিচুড়ি হয় তবে আপনার প্যারামিটারগুলি সারিয়ে তুলতে আপনার খুব কষ্ট হবে।

$ এর সাহায্যে আপনি আপনার পরামিতিগুলি গণনা না করে প্যারামিটার ইনলাইন যুক্ত করতে পারেন। এটি কোডটি পড়া এবং বজায় রাখা আরও সহজ করে তোলে।

The এর ডাউনসাইডটি হ'ল, আপনি স্ট্রিংটিতে প্যারামিটারটি সহজেই পুনরায় করতে পারবেন না, আপনাকে এটি টাইপ করতে হবে। উদাহরণস্বরূপ, আপনি যদি সিস্টেম টাইপ করে ক্লান্ত হন E তবে, $ এ, আপনাকে এটি পুনরাবৃত্তি করতে হবে। আপনি $ "{0}" করতে পারবেন না এবং স্ট্রিং.ফোমেটে এটি পাস করতে পারবেন না কারণ $ "{0}" "0" প্রদান করে।

পার্শ্ব নোটে, আমি অন্য সদৃশ টিপোমিকের একটি মন্তব্য পড়েছি। আমি মন্তব্য করতে পারিনি, সুতরাং, এটি এখানে। সে বলল যে

string msg = n + " sheep, " + m + " chickens";

একাধিক স্ট্রিং অবজেক্ট তৈরি করে। এটি আসলে সত্য নয়। আপনি যদি একক লাইনে এটি করেন তবে এটি কেবল একটি স্ট্রিং তৈরি করে স্ট্রিং ক্যাশে রাখে।

1) string + string + string + string;
2) string.format()
3) stringBuilder.ToString()
4) $""

তাদের সমস্ত একটি স্ট্রিং ফিরে এবং ক্যাশে শুধুমাত্র একটি মান তৈরি করে।

অন্য দিকে:

string+= string2;
string+= string2;
string+= string2;
string+= string2;

ক্যাশে 4 টি পৃথক মান তৈরি করে কারণ সেখানে 4 ";" থাকে।

সুতরাং, নীচের মত কোড লেখা আরও সহজ হবে, তবে কার্লোস মুউোজ সংশোধন করার সাথে সাথে আপনি পাঁচটি ইন্টারপোল্টেড স্ট্রিং তৈরি করবেন:

string msg = $"Hello this is {myName}, " +
  $"My phone number {myPhone}, " +
  $"My email {myEmail}, " +
  $"My address {myAddress}, and " +
  $"My preference {myPreference}.";

আপনার কোড পড়তে খুব সহজ অবস্থায় এটি ক্যাশে একটি একক স্ট্রিং তৈরি করে। আমি পারফরম্যান্স সম্পর্কে নিশ্চিত নই, তবে, আমি নিশ্চিত এমএস ইতিমধ্যে এটি না করা থাকলে এটি অপ্টিমাইজ করবে।


1
আপনার শেষ উদাহরণটি ভুল: আসলে আপনি দুটি স্ট্রিং আঁকছেন: একটি ইন্টারপোল্টেড স্ট্রিং থেকে এবং অন্যটি স্ট্রিং থেকে অন্যটি। খেয়াল করুন যে {myName with সহ কেবলমাত্র একটি অন্তরবিচ্ছিন্ন, অন্যরা প্রত্যাশা অনুযায়ী কাজ করেন না।
কার্লোস Muñoz

1
এবং যদি আপনি str টি স্ট্রিংয়ের জন্য prep প্রতিস্থাপিত করে থাকেন তবে এটির পরে প্রতিটি নিজেরাই 5 টি স্বরযুক্ত স্ট্রিং তৈরি করে String.Format()এবং এর সাথে রানটাইমে সংক্ষেপিত হয় String.Concat। সুতরাং এটি ভাল যে আপনি এটিকে একাধিক লাইনে ভাগ করবেন না
কার্লোস Muñoz

1
আপনি ঠিক বলেছেন কার্লোস মুউজ, আমি এটি সংশোধন করেছি। ভুল ধরার জন্য ধন্যবাদ
বোবোদেভ 7:38

8

নোট করুন যে আপনি দুটিও একত্রিত করতে পারেন, যা বেশ দুর্দান্ত (যদিও এটি দেখতে কিছুটা অদ্ভুত দেখাচ্ছে):

// simple interpolated verbatim string
WriteLine($@"Path ""C:\Windows\{file}"" not found.");

5
আপনি যদি কেবল যে ক্রমটি টাইপ করেছেন $@বা ঠিক করেছেন তা ঠিক করতে পারলে @$। দুর্ভাগ্যক্রমে এটি হতে পারে$@
বাউস

2
@ বাউস এটি উপলব্ধি করে। @আক্ষরিক স্ট্রিং উপস্থাপন করার জন্য সংজ্ঞা দেয়। $এর জন্য একটি শর্টকাট string.Format। এটি হিসাবে $(@"");
ভাবেন

এটি আসলে কোনও শর্টকাট নয় string.Format। এটি এমন একটি মান উপস্থাপনের জন্য চিনিযুক্ত যা একটিতে পার্স হয়ে যায় string.Format, সুতরাং এটি আংশিকভাবে বোঝায়, তবে পুরোপুরি নয়।
বাউস

3
আমি কেবল বলছি $মূলত একটি অন্তর্নিহিত ফাংশন কল যেখানে @আক্ষরিক অংশ, ঠিক mদশমিক আক্ষরিক মতো। সে কারণেই কেবলমাত্র একটি যৌক্তিক আদেশ রয়েছে।
মার্জ করুন

2
আমি জানি এটি বেশিরভাগই এখানে প্রদর্শিত হয়েছিল $, তবে সর্বাধিক সামঞ্জস্যের জন্য এবং ডিরেক্টরি বিভাজক '/' বা '\' কিনা তা কঠোর কোডিংয়ের জন্য নয়, এবং ডাবল স্ল্যাশ বা অনুপস্থিত স্ল্যাশ সৃষ্টি করতে হবে যেখানে সেখানে হওয়া উচিত এক হয়েছে, আমি Path.Combine()ডিরেক্টরি এবং ফাইলগুলির সাথে কাজ করার সময় স্ট্রিং কনটেনটেশন ব্যবহার না করে ব্যবহার করার পরামর্শ দিই ।
জুন 14

6

এটি স্ট্রিংয়ের চেয়ে বেশি সুবিধাজনক For ফর্ম্যাট এবং আপনি এখানেও ইন্টেলিজেন্স ব্যবহার করতে পারেন।

এখানে চিত্র বর্ণনা লিখুন

এবং এখানে আমার পরীক্ষা পদ্ধতি:

[TestMethod]
public void StringMethodsTest_DollarSign()
{
    string name = "Forrest";
    string surname = "Gump";
    int year = 3; 
    string sDollarSign = $"My name is {name} {surname} and once I run more than {year} years."; 
    string expectedResult = "My name is Forrest Gump and once I run more than 3 years."; 
    Assert.AreEqual(expectedResult, sDollarSign);
}

6

এটি স্ট্রিং অন্তরঙ্গকরণের ইঙ্গিত দেয়।

এটি আপনাকে রক্ষা করবে কারণ এটি স্ট্রিং মূল্যায়নে সংকলন সময় সুরক্ষা যোগ করছে।

আপনি আর এর সাথে ব্যতিক্রম পাবেন না string.Format("{0}{1}",secondParamIsMissing)


6

নীচের উদাহরণটি string.Format()পরিষ্কার-পরিচ্ছন্নতা এবং পঠনযোগ্যতা যতটা যায় ততক্ষণ আন্তঃবিবাহিত স্ট্রিংগুলি ব্যবহার করার বিভিন্ন সুবিধাকে হাইলাইট করে । এটি এটি দেখায় যে কোডটি {}অন্য কোনও ফাংশন আর্গুমেন্টের মতো মূল্যায়ন করে, ঠিক যেমন string.Format()আমাদের বলা হচ্ছে।

using System;

public class Example
{
   public static void Main()
   {
      var name = "Horace";
      var age = 34;
      // replaces {name} with the value of name, "Horace"
      var s1 = $"He asked, \"Is your name {name}?\", but didn't wait for a reply.";
      Console.WriteLine(s1);

      // as age is an integer, we can use ":D3" to denote that
      // it should have leading zeroes and be 3 characters long
      // see https://docs.microsoft.com/en-us/dotnet/standard/base-types/how-to-pad-a-number-with-leading-zeros
      //
      // (age == 1 ? "" : "s") uses the ternary operator to 
      // decide the value used in the placeholder, the same 
      // as if it had been placed as an argument of string.Format
      //
      // finally, it shows that you can actually have quoted strings within strings
      // e.g. $"outer { "inner" } string"
      var s2 = $"{name} is {age:D3} year{(age == 1 ? "" : "s")} old.";
      Console.WriteLine(s2); 
   }
}
// The example displays the following output:
//       He asked, "Is your name Horace?", but didn't wait for a reply.
//       Horace is 034 years old.

6

$ সিনট্যাক্সটি দুর্দান্ত তবে একদিকে খারাপ দিক দিয়ে।

আপনার যদি স্ট্রিং টেমপ্লেটের মতো কিছু প্রয়োজন হয় তবে তা শ্রেণিক স্তরের হিসাবে ক্ষেত্র হিসাবে ঘোষণা করা হয় ... ঠিক একই জায়গায় হওয়া উচিত।

তারপরে আপনাকে একই স্তরে ভেরিয়েবলগুলি ঘোষণা করতে হবে ... যা সত্যিই দুর্দান্ত নয়।

স্ট্রিংটি ব্যবহার করা অনেক সুন্দর। এই জাতীয় জিনিসের জন্য ফর্ম্যাট সিনট্যাক্স

class Example1_StringFormat {
 string template = $"{0} - {1}";

 public string FormatExample1() {
   string some1 = "someone";
   return string.Format(template, some1, "inplacesomethingelse");
 }

 public string FormatExample2() {
   string some2 = "someoneelse";
   string thing2 = "somethingelse";
   return string.Format(template, some2, thing2);
 }
}

গ্লোবালগুলির ব্যবহার সত্যিই ঠিক নয় এবং এর পাশাপাশি - এটি গ্লোবালগুলির সাথেও কাজ করে না

 static class Example2_Format {
 //must have declaration in same scope
 static string some = "";
 static string thing = "";
 static string template = $"{some} - {thing}";

//This returns " - " and not "someone - something" as you would maybe 
//expect
 public static string FormatExample1() {
   some = "someone";
   thing = "something";
   return template;
 }

//This returns " - " and not "someoneelse- somethingelse" as you would 
//maybe expect
 public static string FormatExample2() {
   some = "someoneelse";
   thing = "somethingelse";
   return template;
 }
}

এই উত্তরটি গুরুত্বপূর্ণ কারণ এটি উল্লেখ করেছে যে আপনি যখন declare স্ট্রিংটি "কল" করেন, তখন আপনি এটি ঘোষণার সময় নয় the
dx_over_dt

1
ক্লাস স্কোপে আপনার ইন্টারপোলেশন ভেরিয়েবলগুলি ঘোষণার অ্যান্টি-প্যাটার্ন সম্পর্কে আপনি ঠিক বলেছেন, তবে যদি সেই ভেরিয়েবলগুলি ইতিমধ্যে শ্রেণীর সম্পত্তি হিসাবে অন্তর্ভুক্ত থাকে তবে এই প্যাটার্নটি ভাল কাজ করে।
dx_over_dt

@dx_over_dt আপনি ভুল বলেছেন। ইন্টারপোলটেড স্ট্রিংগুলি ঘোষণার সময় মূল্যায়ন করা হয়। সে কারণেই নমুনা কোডটি কোনও অর্থ দেয় না। এটি সংকলনও করবে না।
নাইনবেরি

@ নাইনবেরি আপনি উভয়ই সঠিক বলেছেন যে ইন্টারপোল্টেড স্ট্রিংগুলি ঘোষিত হওয়ার সময় মূল্যায়ন করা হয় এবং উদাহরণ_ সম্পর্কে $ ফর্ম্যাটটি সংকলন করে না এবং নমুনা কোড সম্পর্কে কোনও ধারণা আসে না :) আমি আরও ভাল করে ব্যাখ্যা করার জন্য নমুনাটি সংশোধন করেছি।
টম

5

এটি কীভাবে কাজ করে তা আমি জানি না, তবে আপনি নিজের মানগুলি ট্যাব করতেও এটি ব্যবহার করতে পারেন!

উদাহরণ:

Console.WriteLine($"I can tab like {"this !", 5}.");

অবশ্যই, আপনি "এটি!" প্রতিস্থাপন করতে পারেন আপনি যেমন ট্যাব পরিবর্তন করতে পারেন ঠিক তেমন কোনও ভেরিয়েবল বা অর্থবহ কিছু দিয়ে।


হ্যাঁ আপনার কাছে স্ট্রিং ফরম্যাট করতে পারেন msdn.microsoft.com/en-us/library/dn961160.aspx
M.kazem Akhgary

0

স্ট্রিংয়ের $ সাইনটি ইন্টারপোলেশন স্ট্রিংয়ের সংজ্ঞায়নের জন্য যা স্ট্রিংকে ইন্টারপোলেট করতে সি # তে একটি বৈশিষ্ট্য হ'ল "সত্যিকারের স্ট্রিং" যা এতে অন্তরবিচ্ছিন্ন এক্সপ্রেশন থাকতে পারে

আরও তথ্যের জন্য এটি উত্তর এবং উদাহরণের উত্স: https://docs.microsoft.com/en-us/dotnet/csharp/language-references/tokens/interpolated

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.