স্ট্রিং.ফর্ম্যাট ভেরিয়েবল বনাম ইনলাইন ভেরিয়েবলের সাথে


9

ব্যবহার করার পক্ষে কী কী উপকারিতা / কনস (যদি থাকে)

string output; 
int i = 10;
output = string.Format("the int is {0}", i);

বনাম

string output; 
int i = 10;
output = "the int is " + i;

আমি সর্বদা উত্তরোত্তর উদাহরণটি ব্যবহার করেছি, তবে মনে হচ্ছে অনলাইন টিউটোরিয়ালের বেশিরভাগ অংশই স্ট্রিং.ফর্ম্যাট উদাহরণ ব্যবহার করে। আমি মনে করি না যে দক্ষতার দিক থেকে কোনও বাস্তব পার্থক্য আছে, আমার প্রাথমিক চিন্তাটি তাই কোডরকে ভেরিয়েবলগুলি সন্নিবেশ করার জন্য স্ট্রিং ভাঙতে হবে না।


8
মূল কারণটি হ'ল এটি অনুবাদটিকে আরও সহজ করে তোলে কারণ বিভিন্ন প্রোগ্রামের ভাষাগুলি যেভাবে তাদের বাক্যগুলি তৈরি করে তা আপনার প্রোগ্রামের বোঝার দরকার নেই। উদাহরণস্বরূপ, ফরাসি ভাষায় অনেক এক্সপ্রেশন এবং বাক্যাংশ তাদের ইংরেজী অনুবাদগুলির তুলনায় পিছনে-সামনে।
জনএল

উত্তর:


22

আপনি যদি আপনার প্রকল্পে অনুবাদটিকে গুরুত্বপূর্ণ মনে করেন, তবে প্রথম সিনট্যাক্সটি এটিতে সত্যই সহায়তা করবে।

উদাহরণস্বরূপ আপনার থাকতে পারে:

static final string output_en = "{0} is {1} years old.";
static final string output_fr = "{0} a {1} ans.";

int age = 10;
string name = "Henri";
System.out.println(string.Format(output_en, name, age));
System.out.println(string.Format(output_fr, name, age));

এছাড়াও নোট করুন যে আপনার ভেরিয়েবলগুলি বাক্যটিতে সর্বদা একই বাক্যটিতে একই বাক্যটিতে না থাকে:

static final string output_yoda = "{1} years {0} has.";

4
অবজেক্ট-সাবজেক্ট-ক্রিয়া সিনট্যাক্সের উদাহরণ হিসাবে ইয়োদা-স্পোক ব্যবহারের জন্য +1।
মাইক হ্যারিস

1
সি # এর সাথে আমাদের একটি নতুন বিকল্প রয়েছে:System.out.println($"{name} is {age} year's old.");
বারিন লরিটস


@ বেরিনলরিটস: দুর্ভাগ্যক্রমে, যা স্থানীয়করণের জন্য সম্পূর্ণ অপ্রয়োজনীয়।
ব্রায়ান বোয়েচার

@ ব্রায়ানবোটচার, বুঝতে পেরেছেন, কিন্তু আমি ওপিতে এমন কিছু দেখতে পাইনি যে তারা এগুলি সম্পাদন করার চেষ্টা করছে।
বেরিন লরিটস

8

Https://stackoverflow.com/questions/4671610/why-use-string-format এর প্রথম উত্তরটি দেখুন । এটি কেন আরও ভাল তা আমার মতে সমস্ত কিছু coversেকে দেয়।

এছাড়াও, প্রতিটি .NET সমাবেশে একটি ইন্টার্ন পুল রয়েছে, যেখানে অনন্য স্ট্রিংয়ের সংকলন রয়েছে। আপনার কোডটি সংকলিত হয়ে গেলে, আপনার কোডে উল্লেখ করা সমস্ত স্ট্রিং লিটারেলগুলি এই পুলটিতে যুক্ত করা হবে। আপনার যদি এমন কোনও কোড থাকে যা দেখতে এই জাতীয় দেখাচ্ছে:

"the int is " + i + " and the double is " + d

এটি পুলে এটি 2 স্ট্রিং করে।

যদি তোমার থাকে:

"the int is {0} and the double is {1}"

পুলটিতে আপনার কেবল একটি স্ট্রিং রয়েছে।

এটি একটি বিট আরো যখন জানতে স্ট্রিংস অন্তরীণ করা হয় জটিল, এবং যখন তারা না কম্পাইলার কিছু বুদ্ধি যখন স্ট্রিংস যে কখনও কখনও অন্তরীণ করা প্রয়োজন নাও হতে পারে সনাক্ত হয়েছে কারণ ... উদাহরণস্বরূপ পরীক্ষা করে দেখুন এই নিবন্ধটি যা এই মধ্যে আরো অন্তর্দৃষ্টি দেয় ব্যাপার।

সম্পাদনা: কিছুটা খনন করার পরে, আমি প্রশ্নের একটি আকর্ষণীয় উত্তরের মুখোমুখি হয়েছি স্ট্রিং.ফর্ম্যাট বনাম স্ট্রিং কনকেন্টেশন ব্যবহার করা কখন ভাল? । সংক্ষেপে, +30 ভোটের সাথে উত্তরের লেখক স্থানীয়করণের সাথে জড়িত না হলে স্ট্রিং কনটেনটেশনের পক্ষে একটি বাধ্যতামূলক যুক্তি তোলে।


2
আমি মনে করি, স্টাইলিস্টিকভাবে, এটি আমার মতো লোকদের সাথে অনুরণিত হয়, যারা সি থেকে প্রিন্টফ এবং স্প্রিন্টফ ব্যবহার করে।
জোনাথন হেনসন

আমার উত্তরটি ঠিক করার জন্য ডাউনটা কেন কেন তা জানতে আমি পছন্দ করতাম। ধন্যবাদ।
জালান

4

আমি প্রথম উপায়টিকে পছন্দ করি কারণ এটি আমাকে সঠিকভাবে দেখতে দেয় যে আউটপুট আসার পরে স্ট্রিংটি কেমন দেখাচ্ছে। কোনও স্থান যুক্ত করতে ভুলে যাওয়া বা কেবল স্ট্রিং যুক্ত করার সময় অতিরিক্ত ব্যবধান যুক্ত করা খুব সহজ to

আমি নিশ্চিত যে অতিরিক্ত স্ট্রিংগুলি তৈরি না করার কারণে প্রথম উপায়ে একটি পারফরম্যান্স সুবিধাও রয়েছে; তবে এটি আমার প্রাথমিক উদ্বেগ নয়।


2

প্রথম বিকল্পটি ব্যবহার করে আপনি একটি সাধারণভাবে ব্যবহৃত ফর্ম্যাট স্ট্রিং সংরক্ষণ করতে পারেন এবং প্রয়োজনীয় টাইপিং হ্রাস করতে পারেন এবং স্ট্রিংটি যে কোনও জায়গায় ব্যবহৃত তা আপডেট করা সহজ করে তুলতে পারেন। মূলত প্রথম বিকল্পটি DRY কে সহজেই প্রয়োগ করার অনুমতি দেয়। আপনার উল্লিখিত মতো, যদি স্ট্রিংয়ে একাধিক ভেরিয়েবলগুলি ব্যবহার করা প্রয়োজন হয় তবে এটি অনেক ভাল সিনট্যাক্স।


আহ, আমি অনুমান করি আমি উদাহরণটি ভাবি নি: স্ট্রিং.ফোর্ম্যাট ("ইনটটি is 0}। আবার এটি again 0}", ইনট);
জিম

1

আমি মনে করি string.Format()ফলাফলটি কী হতে চলেছে তা দেখতে এটি আরও সহজ (যাতে আপনার ভুলে যাওয়া জায়গাগুলি বা এর মতো কিছুতে সমস্যা হয় না), এবং এটি টাইপ এবং সংশোধন করাও সহজ।

আপনি যদি খুব সাধারণ বিন্যাস করতে চান তবে +প্লাস অপারেটরটি ব্যবহার করা আরও সহজ হতে পারে তবে আমি কেবল দুটি স্ট্রিং সংশ্লেষ করলেই এটি ব্যবহার করার প্রবণতা রাখি more

কিভাবে দেখাতে string.Format()সংশোধন করার সহজ, বিবেচনা করুন যে আপনি আপনার উদাহরণে বাক্যের শেষে একটি পূর্ণ স্টপ যোগ করতে চেয়েছিলেন: থেকে যাচ্ছে string.Format("The int is {0}", i)করার string.Format("The int is {0}.", i)মাত্র এক চরিত্র। কিন্তু থেকে যাচ্ছে "the int is " + iকরার "the int is " + i + '.'অনেক বেশী।

এর আরেকটি সুবিধা string.Format()হ'ল এটি আপনাকে সহজে ব্যবহারের মতো বিন্যাসটি নির্দিষ্ট করতে দেয় string.Format("The int is 0x{0:X}.", i)। তারিখের ফর্ম্যাট করার সময় এটি আরও বেশি গুরুত্বপূর্ণ।

দক্ষতার হিসাবে, string.Format()সম্ভবত সম্ভবত স্ট্রিং উপসংহার ধীর conc তবে এর মতো কোড সম্ভবত উত্তপ্ত পথে নয়, তাই এটি কোনও ব্যাপার নয়। এবং যদি এটি হয় তবে আপনি সম্ভবত ব্যবহারের চেয়ে আরও ভাল StringBuilder


স্ট্রিং.ফর্ম্যাট অভ্যন্তরীণভাবে কোনওভাবেই স্ট্রিংবিল্ডার ব্যবহার করে
ব্রায়ান

1

আপনার কোডটি সর্বাধিক পঠনযোগ্য করে তোলে এমনটি ব্যবহার করুন। কর্মক্ষমতা সম্পর্কে চিন্তা করবেন না।

আপনার নীচের উদাহরণের জন্য আমি বি পছন্দ করি কারণ এটি কেবল আরও পাঠযোগ্য। তবে উপরের ভাষার অনুবাদগুলিও বোঝায়। কাউকে আপনাকে স্ট্রিং ব্যবহার করার জন্য জোর না করে। ফর্ম্যাট করুন, পরিবর্তে মাইক্রো অপটিমাইজেশন থিয়েটারের স্যাড ট্র্যাজেডি জেফ অ্যাটউডস দুর্দান্ত ব্লগটি পড়ুন এবং নির্দেশ করুন

উত্তর:

string output; 
int i = 10;
output = string.Format("the int is {0}", i);

বনাম

খ:

string output; 
int i = 10;
output = "the int is " + i;

-1

রেফ: স্ট্রিং আউটপুট: ফর্ম্যাট বা সি # তে কনক্যাট?

এই কোড বিবেচনা করুন।

এটি আপনার কোডের একটি সামান্য পরিবর্তিত সংস্করণ।

  1. আমি কনসোল.ওরাইটলাইনকে সরিয়েছি কারণ এটি পরিমাপ করার চেষ্টা করছি তার চেয়ে কম মাত্রার মাত্রা কম orders
  2. আমি লুপের আগে স্টপওয়াচটি পর্যবসিত করছি এবং ঠিক পরে এটি বন্ধ করছি, ফাংশনটি উদাহরণস্বরূপ 26.4 টিকগুলি কার্যকর করতে যদি গ্রহণ করে তবে আমি নির্ভুলতা হারাচ্ছি না।
  3. পুনরাবৃত্তির সংখ্যার দ্বারা আপনি যেভাবে ফলাফল ভাগ করেছেন তা ভুল ছিল। আপনার যদি 1000 মিলি সেকেন্ড এবং 100 মিলিসেকেন্ড থাকে তবে কী ঘটবে তা দেখুন। উভয় পরিস্থিতিতে এটি 1000000 দ্বারা ভাগ করার পরে আপনি 0 এমএস পাবেন।
Stopwatch s = new Stopwatch();

var p = new { FirstName = "Bill", LastName = "Gates" };

int n = 1000000;
long fElapsedMilliseconds = 0, fElapsedTicks = 0, cElapsedMilliseconds = 0, cElapsedTicks = 0;

string result;
s.Start();
for (var i = 0; i < n; i++)
    result = (p.FirstName + " " + p.LastName);
s.Stop();
cElapsedMilliseconds = s.ElapsedMilliseconds;
cElapsedTicks = s.ElapsedTicks;
s.Reset();
s.Start();
for (var i = 0; i < n; i++)
    result = string.Format("{0} {1}", p.FirstName, p.LastName);
s.Stop();
fElapsedMilliseconds = s.ElapsedMilliseconds;
fElapsedTicks = s.ElapsedTicks;
s.Reset();


Console.Clear();
Console.WriteLine(n.ToString()+" x result = string.Format(\"{0} {1}\", p.FirstName, p.LastName); took: " + (fElapsedMilliseconds) + "ms - " + (fElapsedTicks) + " ticks");
Console.WriteLine(n.ToString() + " x result = (p.FirstName + \" \" + p.LastName); took: " + (cElapsedMilliseconds) + "ms - " + (cElapsedTicks) + " ticks");
Thread.Sleep(4000);

এগুলি আমার ফলাফল:

1000000 x result = string.Format("{0} {1}", p.FirstName, p.LastName); took: 618ms - 2213706 ticks
1000000 x result = (p.FirstName + " " + p.LastName); took: 166ms - 595610 ticks

1
প্রথম কোড উদাহরণ বা দ্বিতীয় কোড উদাহরণটি যদি আরও ভাল নকশা হয় তবে এর দিকগুলি কীভাবে উত্তর দেয়? যদি কোনও ব্যক্তির পক্ষে এটি রক্ষণাবেক্ষণের পক্ষে সহজ কোড হয় বা না হয় তবে 1M পুনরাবৃত্তির ওপরে অর্ধেক সেকেন্ড কীভাবে অ্যাকাউন্ট করে?

জিম জিজ্ঞাসা করলেন, "কী কী উপকারিতা এবং বিপরীতে?" এটি দেখায় যে অনেকগুলি পুনরাবৃত্তির উপরে স্ট্রিং For ফর্ম্যাটটি দ্রুত।
jp2code

আপনার উত্তরটিতে এটিকে কোডের ব্লক এবং অপের কোডের থেকে পৃথকীকরণের পরিবর্তে পুরোপুরি যুক্ত করার কথা বিবেচনা করা উচিত। যেমনটি দাঁড়িয়েছে, আপনার উত্তরটি ইংরেজিতে ওপি-র প্রশ্নের উত্তর দেয় না। অন্যান্য উত্তর দেখুন। এগুলি থেকে সমস্ত কোড সরিয়ে ফেলা সম্ভব হবে এবং এখনও ওপি-র প্রশ্নের উত্তর থাকবে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.