সি # তে স্ট্রিং এবং পূর্ণসংখ্যের ভেরিয়েবলগুলি সংযুক্ত করার সময় আমি কি টটস্ট্রিং () ব্যবহার করব?


19
int a = 1;
int b = 2;
int sum = a + b;
string expression = "Expression: " + a + " + " + b + " = " + sum;
Console.WriteLine(expression); //displays Expression 1 + 2 = 3

আমার ব্যবহার করা উচিত:

string expression = "Expression: " + a + " + " + b + " = " + sum;

অথবা

string expression = "Expression: " + a.ToString() + " + " + b.ToString() + " = " + result.ToString();

এটি ব্যবহার করার জন্য সুপারিশ করা হয় ToString()যখন concatenating stringএবং int?


6
ইন a + "" + b + ""বা "" + a + b + "", এটা কোন ব্যাপার না: এটা সব স্ট্রিং সংযুক্তকরণের আছে। ইন a + b + ""এটা কোন ব্যাপার: aএবং bপ্রথম যোগ করা হয়।
টিম এস

4
পার্শ্ব নোট: VB.NET- এ, স্পষ্ট স্ট্রিং কনটেনটেশন অপারেটর থাকার ফলে এই অস্পষ্টতা এড়ানো হয়েছে : "Expression: " + aএকটি সংকলন সময় ত্রুটি (অপশন "Expression: " & aস্ট্রাইক অন ​​দিয়ে) নিক্ষেপ করবে , স্ট্রিং কনটেনটেশন সম্পাদন করবে।
হেইনজি

প্রথম কোডটির ফলাফল বক্সিং (ইন্ট টু ইন্টার 32), দ্বিতীয়টি করে না। দ্বিতীয়টি স্পষ্টতই দ্রুত।
এলোমেলো বর্ণমালা

উত্তর:


33

ToString ব্যবহার

না, আপনার ToStringএখানে ব্যবহার করা উচিত নয় ।

স্ট্রিং কনটেনটেশন স্বয়ংক্রিয়ভাবে নন-স্ট্রিংগুলিকে স্ট্রিংয়ে রূপান্তরিত করে যার অর্থ আপনার দুটি রূপগুলি প্রায় অভিন্ন ical

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

উত্স: সি # ভাষা নির্দিষ্টকরণ: সংযোজন অপারেটর, এমএসডিএন

অন্যদিকে, প্রথমটি (ব্যতীত ToString):

  • লেখার চেয়ে কম
  • পড়তে খাটো,
  • বজায় রাখা সহজ এবং:
  • লেখকের ঠিক উদ্দেশ্যটি দেখায়: স্ট্রিংগুলি একত্রিত করতে।

সুতরাং প্রথমটিকে পছন্দ করুন।

ফণা অধীনে

কী আকর্ষণীয় তা হুডের নীচে কী ঘটে তা দেখা see এটি দেখার একটি উপায় হ'ল লিনকিপ্যাডের মধ্যে আইএল কোডটি দেখা। এই প্রোগ্রাম:

void Main()
{
    var a = 3;
    var b = " Hello";
    var c = a + b;
    Console.WriteLine(c);
}

নিম্নলিখিত আইএলে অনুবাদ করা হয়েছে:

IL_0001:  ldc.i4.3    
IL_0002:  stloc.0     // a
IL_0003:  ldstr       " Hello"
IL_0008:  stloc.1     // b
IL_0009:  ldloc.0     // a
IL_000A:  box         System.Int32
IL_000F:  ldloc.1     // b
IL_0010:  call        System.String.Concat
IL_0015:  stloc.2     // c
IL_0016:  ldloc.2     // c
IL_0017:  call        System.Console.WriteLine

দেখেন তো System.String.Concat? এর অর্থ হ'ল মূল কোডটিও সেভাবেই লেখা যায়, যা ঠিক একই আইএল অনুবাদ করে:

void Main()
{
    var a = 3;
    var b = " Hello";
    var c = string.Concat(a, b); // This is the line which was changed.
    Console.WriteLine(c);
}

আপনি যখন ডকুমেন্টেশনstring.Concat(object[]) পড়েন , আপনি এটি শিখতে পারেন:

পদ্ধতিটি সেই বস্তুর পরামিতি পদ্ধতিতে কল করে প্রতিটি বস্তুকে যুক্তিতে যুক্ত করে ToString; এটি কোনও সীমানা যুক্ত করে না।

এর অর্থ এটি ToStringঅনর্থক। এছাড়াও:

String.Empty অ্যারেতে কোনও নাল বস্তুর জায়গায় ব্যবহার করা হয়।

কোনটি অপারেন্ডগুলি শূন্য হয় এমন ক্ষেত্রে কে সুন্দরভাবে পরিচালনা করে (পাদটীকা 1 দেখুন)।

শেষ উদাহরণে, কনটেটেশনটির অনুবাদ করা হয়েছিল string.Concat, তবে কারওর সংকলন অপ্টিমাইজেশানগুলিও হাইলাইট করা উচিত:

var a = "Hello " + "World";

অনুবাদ করা হয়েছে:

ldstr       "Hello World"
stloc.0

অন্য দিকে:

var a = string.Concat("Hello ", "World");

অনুবাদ করা হয়েছে:

ldstr       "Hello "
ldstr       "World"
call        System.String.Concat
stloc.0

অন্যান্য বিকল্প

সি # তে অবজেক্টগুলির স্ট্রিং উপস্থাপনা একত্রিত করার অন্যান্য উপায় অবশ্যই রয়েছে।

  1. StringBuilderযখন আপনাকে প্রচুর পরিমাণে কনটেনটেশন অপারেশন করতে হয় এবং ব্যবহৃত মধ্যস্থতাকারীর স্ট্রিং সংখ্যা হ্রাস করতে সহায়তা করে তখন ব্যবহৃত হয়। আপনার একটি StringBuilderবা একটি সাধারণ কনটেন্টেশন ব্যবহার করা উচিত কিনা তা সিদ্ধান্ত নেওয়া সহজ হতে পারে না। কোনও প্রোফাইলার ব্যবহার করুন বা স্ট্যাক ওভারফ্লোতে প্রাসঙ্গিক উত্তরগুলির জন্য অনুসন্ধান করুন।

    StringBuilderকোডটি পড়া এবং বজায় রাখা কঠিন করে দেওয়ার ক্ষেত্রে ব্যবহারের একটি প্রধান ত্রুটি রয়েছে। আপনার প্রশ্নের সদৃশ হিসাবে সাধারণ মামলার ক্ষেত্রে StringBuilderকোডের পাঠযোগ্যতার জন্য কেবল ক্ষতিকারক নয়, পারফরম্যান্সের ক্ষেত্রে এটিও অকেজো।

  2. string.Join আপনার যখন ডিলিমিটার যুক্ত করতে হবে তখন ব্যবহার করা উচিত।

    স্পষ্টতই, string.Joinস্ট্রিংগুলি সংযুক্ত করার জন্য কোনও খালি ডিলিমিটার দিয়ে কখনও ব্যবহার করবেন না ।

  3. string.Formatস্ট্রিং টেম্প্লেটিং যখন স্ট্রিং কনকেনটেশনকে প্রাধান্য দেওয়া হয় তখন ব্যবহার করা যেতে পারে। আপনি যে ক্ষেত্রে পছন্দ করতে পারেন তার মধ্যে একটি হ'ল বার্তাটি স্থানীয়করণ করা যেতে পারে, যেমন কুঁথেতে জবাব দেওয়া হয়েছে।

    ব্যবহার string.Formatবিভিন্ন অপূর্ণতা তা আপনার মত সহজ ক্ষেত্রে জন্য অনুপযুক্ত করে তোলে আছে:

    • সাধারণ "{0}" স্থানধারক সহ, এটি প্রায়শই অস্পষ্ট থাকে যে কোন পরামিতিটি যায়। ভুলভাবে প্যারামিটারগুলি বিপরীত করা বা একটি ভুলে যাওয়া ঘন ঘন। ভাগ্যক্রমে, সি # 6 অবশেষে স্ট্রিং ইন্টারপোলেশন প্রবর্তন করে যা এই সমস্যার সমাধান করে।

    • রানটাইম পারফরম্যান্স হ্রাস পেতে পারে। অবশ্যই, ধরে নিই না string.Formatহয় সবসময় ধীর। যদি পারফরম্যান্সের বিষয়টি গুরুত্বপূর্ণ হয় তবে দুটি পদ্ধতির পরিমাপ করুন এবং অনুমানের পরিবর্তে আপনার প্রকৃত ফলাফলের ভিত্তিতে কোনটি দ্রুত তা নির্ধারণ করুন।

    • কোডটি লেখার জন্য কিছুটা দীর্ঘতর, পড়ার পক্ষে দীর্ঘতর এবং বজায় রাখা আরও শক্ত, যদিও এটি অত্যন্ত সামান্য এবং আপনাকে খুব বেশি বিরক্ত করা উচিত নয়।


The পার্থক্যটি প্রদর্শিত হয় যখন বস্তুর মধ্যে একটি হয় null। ছাড়া ToString, একটি nullখালি স্ট্রিং দ্বারা প্রতিস্থাপিত হয়। সঙ্গে ToString, একটি NullReferenceExceptionনিক্ষেপ করা হয়।


1
ঠিক এই কারণে (অপ্রত্যাশিত আচরণ), এর সাথে কংক্রিটিং স্ট্রিং +বেশিরভাগ ভাষায় খারাপ অভ্যাস হিসাবে বিবেচিত হয়। এই ক্ষেত্রে আমি ব্যবহার করব string.Concat, অনেক ক্ষেত্রে string.Formatভাল। এটি অবশ্যই ব্যবহার করার জন্য পাইথোনিক নয় +, এবং যেহেতু পিইপি 3101 %এর পক্ষেও নিরুত্সাহিত হয়েছে str.format
আর্দা শি

2
nullসত্যই "এটি সুন্দরভাবে পরিচালনা" এর জন্য কি কোনও খালি স্ট্রিং প্রতিস্থাপন করা হচ্ছে ? ঠিক আছে, এটি "ত্রুটি পুনরায় শুরু করার পরের" এর মতো খারাপ নয় ... ...
অনুচ্ছেদে

ফণা অধীন, যদি আপনি) .ToString (কলিং ছাড়া কনক্যাটেনেট, বক্সিং ঘটবে ..., এবং Concat(object[])পরিবর্তে ব্যবহার করা হবে Concat(string[])। তাই "string " + iআসলে একই নয়"string " + i.ToString()
এলোমেলো বর্ণমালা

@ র্যান্ডমআল্ফ্যাটস: বৈধ পয়েন্ট। তবে, পার্থক্যটি কেবলমাত্র এর অবস্থান ToString(): এক ক্ষেত্রে ওপির কোড, System.String.Concatঅন্য ক্ষেত্রে এর প্রয়োগ implementation সুতরাং, উত্তরটি বৈধ থাকবে: কোনও কোড নেই এমন কোডটি লিখবেন না।
আর্সেনী মরজেনকো

15

পরিবর্তে, আপনার স্ট্রিং বিন্যাস ব্যবহার করা উচিত। আপনার সংখ্যাটিকে স্ট্রিং প্রতিনিধিত্ব বা স্থানীয়করণে ফর্ম্যাট করা সহজ। উদাহরণ:

string expression = string.Format("Expression: {0} + {1} = {2}", a, b, sum);

এমএসডিএন- তে আরও তথ্য ।

তবে স্ট্রিং বিন্যাসের চেয়ে স্ট্রিং ফর্ম্যাটর কম পঠনযোগ্য (এবং হতে পারে পারফরম্যান্স )ও।


6
এই বিকল্পটি আরও ভাল কেন তা বোঝানোর জন্য যত্নশীল?
বিশ্ব প্রকৌশলী

@ ওয়ার্ল্ড ইঞ্জিনিয়ার: আমি ব্যাখ্যাটি আপডেট করেছি।
কুঁথেতে

12
আমি অন্য সবার সম্পর্কে জানি না, তবে আমি আসলে এটি আরও পাঠযোগ্য find হয়তো কারণ আমি সি দিয়ে বড় হয়েছি যেখানে এস [এন] প্রিন্টফ এই ধরণের কোডের একমাত্র বাস্তবসম্মত বিকল্প।
জুলাই

2
তবে এই উপায়টি একের পরিবর্তে তিনটি ভুলের উত্স দেয়। আপনি যখন স্ট্রিংয়ে কিছু যুক্ত করেন, আপনার 1) ফর্ম্যাট স্ট্রিংটি পরিবর্তন করতে হবে, 2) তালিকায় নতুন প্যারামিটার যুক্ত করতে ভুলবেন না, 3) নতুন পরামিতি স্থাপন করা উচিত তালিকার সঠিক স্থানটি বেছে নেওয়ার চেষ্টা করুন।
রুসলান

2
কেবল চিম ইন করতে চান এবং আসন্ন স্ট্রিং ইন্টারপোলেশন বৈশিষ্ট্যটি C # 6 এ আপনাকে জানাতে .. একই ফলাফলটি পেতে আপনি "এক্সপ্রেশন: \ {a} + \ {b} = \ {যোগ}" লিখবেন। কোডেপ্রজেক্ট
আর্টিকেলগুলি /

-2

যদি আপনি সংক্ষিপ্তকরণ ব্যবহার করেন তবে +এটি নিজেই String.Concatপদ্ধতি ব্যবহার করে । স্ট্রিং নিজেই একটি + অপারেটর প্রকাশ করে না।

উদাহরণ স্বরূপ:

int i = 10;
string str = "hello" + i;

সংকলিত হয়:

int i = 10;
object o1 = "hello";
object o2 = i; // Note boxing
string str = string.Concat(o1, o2);

আপনি যদি সরাসরি কল করেন তবে ToStringএটি বক্সিং এড়ানো এবং Concat(string, string)ওভারলোডকে কল করবে । অতএব ToStringকলটি যথেষ্ট পরিমাণে তাত্পর্যপূর্ণ না হলেও কিছুটা দক্ষ হবে। আপনি যে উদাহরণটি বেশি পাঠযোগ্য বলে মনে করেন আপনি তা আরও ভাল করে যেতে পারেন।


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