স্ট্রিং.ফর্ম্যাট বনাম স্ট্রিং কনটেনটেশন কখন ব্যবহার করা ভাল?


120

আমি একটি ছোট কোড পেয়েছি যা এক্সেলে একটি সেল ইনপুট নির্ধারণের জন্য একটি সূচকের মানকে পার্স করে। এটা আমার চিন্তা আছে ...

এর মধ্যে পার্থক্য কী

xlsSheet.Write("C" + rowIndex.ToString(), null, title);

এবং

xlsSheet.Write(string.Format("C{0}", rowIndex), null, title);

এক অন্য চেয়ে ভাল? এবং কেন?



উত্তর:


115

সি # 6 এর আগে

সত্যি কথা বলতে, আমি মনে করি প্রথম সংস্করণটি আরও সহজ - যদিও আমি এটিকে আরও সহজ করব:

xlsSheet.Write("C" + rowIndex, null, title);

আমি সন্দেহ করি যে অন্যান্য জবাবগুলি পারফরম্যান্স হিট সম্পর্কে কথা বলতে পারে , তবে সত্যি বলতে যদি এটি উপস্থিত থাকে তবে এটি সর্বনিম্ন হবে - এবং এই সংমিশ্রিত সংস্করণটির বিন্যাসের স্ট্রিংটি পার্স করার দরকার নেই।

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

সি # 6 সহ

স্ট্রিং ইন্টারপোলেশন সি # 6 এ পড়া অনেকগুলি বিষয়কে সহজ করে তোলে এই ক্ষেত্রে, আপনার দ্বিতীয় কোডটি হয়ে যায়:

xlsSheet.Write($"C{rowIndex}", null, title);

আইএমও, যা সম্ভবত সেরা বিকল্প।



আমি জানি আমি জানি. এটি ঠাট্টা করে তৈরি করা হয়েছিল (বিটিডব্লিউ লিঙ্কটি আগে পড়েছি, যা ভাল পড়েছিল)
বিটিডব্লিউ নওফাল

জন। আমি সবসময় মিঃ রিখটারের ভক্ত হয়েছি, এবং ধর্মীয়ভাবে বক্সিং ইত্যাদি বিষয়ে গাইডেন্স অনুসরণ করেছি followed তবে আপনার (পুরানো) নিবন্ধটি পড়ার পরে আমি এখন একটি রূপান্তর a ধন্যবাদ
21:44

3
@ এমবম্ব ২০০7: এটি এখন কোডব্লগ.জোনস্কেট.উক / ২০০৮ / 10/08 / এ রয়েছে
জন স্কিটে

4
এখন যে সি # 6 উপলভ্য, আপনি যা আরও সহজ পঠনযোগ্য বলে মনে করেন তার জন্য আপনি নতুন স্ট্রিং ইন্টারপোলেশন সিনট্যাক্সটি ব্যবহার করতে পারেন:xlsSheet.Write($"C{rowIndex}", null, title);
হটএন

158

আমার প্রাথমিক পছন্দ (একটি সি ++ পটভূমি থেকে আসা) স্ট্রিং.ফোর্মেটের জন্য। নিম্নলিখিত কারণগুলির কারণে আমি এটি পরে ফেলেছি:

  • স্ট্রিং কনটেনটেশন যুক্তিযুক্তভাবে "নিরাপদ"। আমার সাথে ঘটেছিল (এবং আমি এটি অন্যান্য বেশ কয়েকটি বিকাশকারীকে ঘটতে দেখেছি) প্যারামিটারটি সরিয়ে ফেলতে, বা ভুলক্রমে প্যারামিটারের অর্ডারটি গণ্ডগোল করে। সংকলকটি বিন্যাসের স্ট্রিংয়ের বিরুদ্ধে পরামিতিগুলি পরীক্ষা করবে না এবং আপনি রানটাইম ত্রুটির সাথে সমাপ্ত হবেন (এটি আপনি যদি ভাগ্যবান হন তবে এটি কোনও অস্পষ্ট পদ্ধতিতে না পাওয়ার মতো, যেমন কোনও ত্রুটি লগইন করা)। সংক্ষিপ্তকরণের সাথে, একটি পরামিতি অপসারণ কম ত্রুটি প্রবণ হয়। আপনি তর্ক করতে পারেন ত্রুটি হওয়ার সম্ভাবনা খুব কম, তবে এটি হতে পারে।

- স্ট্রিং কনটেনটেশন নাল মানগুলির জন্য মঞ্জুরি দেয়, String.Formatতা করে না। " s1 + null + s2" লেখাটি ভেঙে যায় না, এটি কেবল স্ট্রিংয়ের মতো নাল মানকে বিবেচনা করে mp ঠিক আছে, এটি আপনার নির্দিষ্ট দৃশ্যের উপর নির্ভর করতে পারে - এমন কিছু ক্ষেত্রে রয়েছে যেখানে আপনি নালাম ফার্স্টনামটি চুপ করে উপেক্ষা করার পরিবর্তে কোনও ত্রুটি চান। তবে এমনকি এই পরিস্থিতিতে আমি ব্যক্তিগতভাবে নিজেকে নুলের জন্য পরীক্ষা করা এবং স্ট্রিং.ফর্ম্যাট থেকে প্রাপ্ত স্ট্যান্ডার্ড আর্গুমেন্টনাল এক্সসেপশনের পরিবর্তে নির্দিষ্ট ত্রুটি ছুঁড়ে দেওয়া পছন্দ করি।

  • স্ট্রিং কনটেনটেশন আরও ভাল পারফর্ম করে। উপরের কিছু পোস্ট ইতিমধ্যে এটি উল্লেখ করেছে (আসলে কেন তা ব্যাখ্যা না করেই, যা আমাকে এই পোস্টটি লিখতে দৃ determined় প্রতিজ্ঞ করেছিল :)।

আইডিয়া হ'ল। নেট সংকলক কোডটির এই অংশটিকে রূপান্তর করতে যথেষ্ট স্মার্ট:

public static string Test(string s1, int i2, int i3, int i4, 
        string s5, string s6, float f7, float f8)
{
    return s1 + " " + i2 + i3 + i4 + " ddd " + s5 + s6 + f7 + f8;
}

এটি:

public static string Test(string s1, int i2, int i3, int i4,
            string s5, string s6, float f7, float f8)
{
    return string.Concat(new object[] { s1, " ", i2, i3, i4, 
                    " ddd ", s5, s6, f7, f8 });
}

স্ট্রিং.কনক্যাট এর আড়ালে কী ঘটে তা অনুমান করা সহজ (রিফ্লেক্টর ব্যবহার করুন)। অ্যারেতে থাকা বস্তুগুলি ToString () এর মাধ্যমে তাদের স্ট্রিংয়ে রূপান্তরিত হয়। তারপরে মোট দৈর্ঘ্য গণনা করা হয় এবং কেবলমাত্র একটি স্ট্রিং বরাদ্দ করা হয় (মোট দৈর্ঘ্যের সাথে)। পরিশেষে, প্রতিটি স্ট্রিং কিছু অনিরাপদ কোডে wstrcpy এর মাধ্যমে ফলাফলের স্ট্রিংয়ে অনুলিপি করা হয়।

কারণগুলি String.Concatদ্রুততর? ঠিক আছে, আমরা সবাই কী String.Formatকরছে সেগুলি দেখে নিতে পারি - আপনি ফর্ম্যাট স্ট্রিংটি প্রক্রিয়া করার জন্য প্রয়োজনীয় পরিমাণের পরিমাণ দেখে অবাক হবেন। এর উপরে (আমি মেমরির ব্যবহার সম্পর্কে মন্তব্যগুলি দেখেছি), String.Formatঅভ্যন্তরীণভাবে একটি স্ট্রিংবিল্ডার ব্যবহার করে। এখানে কীভাবে:

StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));

সুতরাং প্রতিটি পাস যুক্তি জন্য, এটি 8 টি অক্ষর সংরক্ষণ করে। যদি যুক্তিটি এক-অঙ্কের মান হয় তবে খুব খারাপ, আমাদের কিছু নষ্ট স্থান রয়েছে। যদি আর্গুমেন্টটি কোনও কাস্টম অবজেক্ট হয় তবে কিছু দীর্ঘ পাঠ্য ফেরত দেওয়া হবেToString() , তবে কিছুটা পুনর্বিবেচনার প্রয়োজনও হতে পারে (অবশ্যই খারাপ পরিস্থিতি))

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

আমি স্ট্রিংয়ের জন্য যাচ্ছি শুধুমাত্র কারণ For ফর্ম্যাটটি যখন স্থানীয়করণ জড়িত থাকে। সংস্থানগুলিতে বিন্যাসের স্ট্রিংগুলি কোডের সাথে বিশৃঙ্খলা না করেই আপনাকে বিভিন্ন ভাষায় সমর্থন করার অনুমতি দেয় (ফর্ম্যাট করা মানগুলি ভাষার উপর নির্ভর করে ক্রম পরিবর্তন করে, যেমন "{0} ঘন্টা এবং {1} মিনিটের পরে" জাপানি ভাষায় বেশ আলাদা দেখাবে: )।


আমার প্রথম (এবং বেশ দীর্ঘ) পোস্টটি সংক্ষিপ্ত করতে:

  • আমার পক্ষে সেরা উপায় (পারফরম্যান্সের তুলনায় বনাম রক্ষণাবেক্ষণ / পাঠযোগ্যতার ক্ষেত্রে) কোনও ToString()কল ছাড়াই স্ট্রিং কনটেনটেশন ব্যবহার করছে
  • আপনি যদি পারফরম্যান্সের পরে থাকেন তবে ToString()বক্সিং এড়ানোর জন্য নিজেকে কল করুন (আমি পড়ার সামর্থ্যের দিকে কিছুটা পক্ষপাতিত্বশীল) - আপনার প্রশ্নের প্রথম বিকল্প হিসাবে একই
  • আপনি যদি ব্যবহারকারীকে স্থানীয়করণের স্ট্রিংগুলি দেখান (এখানে কেস নয়), String.Format()এর একটি কিনারা রয়েছে।

5
1) string.Formatরিশার্পার ব্যবহার করার সময় "নিরাপদ"; এটি, এটি অন্য কোনও কোডের মতোই নিরাপদ যা [ভুলভাবে] ব্যবহার করা যায়। 2) string.Format নেই একটি "নিরাপদ" জন্য অনুমতি null: string.Format("A{0}B", (string)null)"এবি" এ ফলাফল নেই। 3) আমি এই স্তরের পারফরম্যান্স সম্পর্কে খুব কমই যত্ন করি (এবং শেষ পর্যন্ত, আমি যখন StringBuilder

2 এ সম্মত), আমি পোস্টটি সম্পাদনা করব। এটি 1.1 এ ফিরে নিরাপদ ছিল কিনা তা যাচাই করতে পারে না, তবে সর্বশেষতম কাঠামোটি অবশ্যই নাল-নিরাপদ।
ড্যান সি

স্ট্রিং.কনক্যাটটি কি এখনও ব্যবহার করা হয় যদি অপারেন্ডগুলির মধ্যে একটি প্যারামিটার বা পরিবর্তনশীল না হয়ে রিটার্ন মান সহ একটি মেথড কল হয়?
রিচার্ড কললেট

2
@ রিচার্ডকোললেট হ্যাঁ, স্ট্রিং.কনক্যাট এমনকি আপনার মধ্যে পদ্ধতি কলগুলির রিটার্ন মানগুলি সম্মতিযুক্ত ব্যবহার করা হয়, যেমন রিলিজ মোডে string s = "This " + MyMethod(arg) + " is a test";একটি String.Concat()কল সংকলিত হয় ।
ড্যান সি

চমত্কার উত্তর; খুব ভাল লেখা এবং ব্যাখ্যা।
ফ্র্যাঙ্ক ভি

6

আমি মনে করি প্রথম বিকল্পটি আরও পঠনযোগ্য এবং এটি আপনার প্রাথমিক উদ্বেগ হওয়া উচিত।

xlsSheet.Write("C" + rowIndex.ToString(), null, title);

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

যে কোনও উপায়ে, প্রথমে পাঠযোগ্যতার জন্য লিখুন এবং তারপরে আপনার হটস্পটগুলি সনাক্ত করতে কোনও পারফরম্যান্স প্রোফাইলার ব্যবহার করুন যদি আপনি সত্যিই ভাবেন যে আপনার পারফরম্যান্সের উদ্বেগ রয়েছে have



5

এটি একটি সাধারণ ক্ষেত্রে যেখানে এটি একটি সাধারণ একক যুক্তি, আমি অনুভব করি যে এটির জটিলতার পক্ষে মূল্য নেই string.Format(এবং আমি পরীক্ষাও করি নি, তবে আমি সন্দেহ করি যে এর মতো সরল মামলার জন্য কিছুটা ধীর string.Format হতে পারে, ফরম্যাটের স্ট্রিং পার্সিংয়ের সাথে কী হবে) এবং সব). জন স্কিটির মতো আমিও স্পষ্টভাবে কল করতে পছন্দ করি না .ToString(), যেহেতু এটি string.Concat(string, object)ওভারলোড দ্বারা স্পষ্টভাবে করা হবে এবং আমি মনে করি কোডটি পরিচ্ছন্ন চেহারা এবং এটি ছাড়া পড়া সহজ read

তবে কয়েকটি কনটেন্টেশনেরও বেশি (কতটি বিষয়গত) এটি আমি অবশ্যই পছন্দ করি string.Format। একটি নির্দিষ্ট সময়ে আমি মনে করি যে পাঠযোগ্যতা এবং কর্মক্ষমতা উভয়ই সংক্ষিপ্ততার সাথে অকারণে ভোগে।

যদি ফর্ম্যাট স্ট্রিংয়ের অনেকগুলি পরামিতি থাকে (আবার, "অনেকগুলি" বিষয়গত হয়) তবে আমি সাধারণত প্রতিস্থাপন যুক্তিগুলিতে মন্তব্য সূচকগুলি অন্তর্ভুক্ত করতে পছন্দ করি, পাছে কোন মানটি কোন পরামিতিতে যায় তার ট্র্যাকটি আমি হারিয়ে ফেলব। একটি স্বীকৃত উদাহরণ:

Console.WriteLine(
    "Dear {0} {1},\n\n" +

    "Our records indicate that your {2}, \"{3}\", is due for {4} {5} shots.\n" +
    "Please call our office at 1-900-382-5633 to make an appointment.\n\n" +

    "Thank you,\n" +
    "Eastern Veterinary",

    /*0*/client.Title,
    /*1*/client.LastName,
    /*2*/client.Pet.Animal,
    /*3*/client.Pet.Name,
    /*4*/client.Pet.Gender == Gender.Male ? "his" : "her",
    /*5*/client.Pet.Schedule[0]
);

হালনাগাদ

এটি আমার কাছে ঘটেছিল যে আমি যে উদাহরণটি দিয়েছি তা কিছুটা বিভ্রান্তিকর, কারণ এটি প্রদর্শিত হয় যে আমি উভয় এবং string.Formatএখানে উভয়ই ব্যবহার করেছি । এবং হ্যাঁ, যুক্তিযুক্ত ও অলক্ষিতভাবে, আমি এটি করেছি। সংকলক 1 দ্বারা কনকাটেশনগুলি সমস্তই অপ্টিমাইজ হবে , যেহেতু তারা সমস্ত স্ট্রিং আক্ষরিক। সুতরাং রান-টাইমে, একটি একক স্ট্রিং থাকবে। সুতরাং আমার অনুমান যে আমার বলা উচিত যে আমি রান সময়ে অনেকগুলি কনটেন্টেশন এড়াতে পছন্দ করি ।

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

Console.WriteLine(
    $"Dear {client.Title} {client.LastName},\n\n" +

    $"Our records indicate that your {client.Pet.Animal}, \"{client.Pet.Name}\", " +
    $"is due for {(client.Pet.Gender == Gender.Male ? "his" : "her")} " +
    $"{client.Pet.Schedule[0]} shots.\n" +
    "Please call our office at 1-900-382-5633 to make an appointment.\n\n" +

    "Thank you,\n" +
    "Eastern Veterinary"
);

আপনি এইভাবে সংকলন-সময় কনকনেটেশন হারাবেন। প্রতিটি ইন্টারপোল্টেড স্ট্রিং string.Formatসংকলক দ্বারা একটি কল রূপান্তরিত হয় , এবং তাদের ফলাফল রান সময় সংক্ষিপ্ত করা হয়। তার অর্থ এটি পাঠযোগ্যতার জন্য রান-টাইম পারফরম্যান্সের ত্যাগ। বেশিরভাগ সময়, এটি একটি সার্থক ত্যাগ, কারণ রান-টাইম পেনাল্টি নগন্য নয়। পারফরম্যান্সের সমালোচনামূলক কোডে তবে আপনাকে বিভিন্ন সমাধানের প্রোফাইলের প্রয়োজন হতে পারে।


1 আপনি এটি সি # নির্দিষ্টকরণে দেখতে পারেন :

... ধ্রুবক মত প্রকাশের জন্য নিম্নলিখিত নির্মাণগুলি অনুমোদিত:

...

  • পূর্বনির্ধারিত + ... বাইনারি অপারেটর ...

আপনি এটি একটি সামান্য কোড দিয়ে যাচাই করতে পারেন:

const string s =
    "This compiles successfully, " +
    "and you can see that it will " +
    "all be one string (named `s`) " +
    "at run time";

1
fyi, আপনি সমস্ত যুক্তিগুলির পরিবর্তে @ "... বহু লাইন স্ট্রিং" ব্যবহার করতে পারেন।
অ্যারন পামার

হ্যাঁ, তবে তারপরে আপনাকে আপনার স্ট্রিংটি বাম-ন্যায়সঙ্গত করতে হবে। @ স্ট্রিংগুলিতে উদ্ধৃতিগুলির মধ্যে সমস্ত নতুন লাইন এবং ট্যাব অক্ষর অন্তর্ভুক্ত রয়েছে।
পি ড্যাডি

আমি জানি এটি পুরানো, তবে এটি এমন একটি ক্ষেত্রে যেখানে আমি বলব ফর্ম্যাট স্ট্রিংটিকে একটি রেক্স ফাইলটিতে রেখে দিন।
অ্যান্ডি

2
বাহ, প্রত্যেকের বিষয়টির হৃদয়ের পরিবর্তে স্ট্রিং আক্ষরিকের দিকে মনোনিবেশ করা।
পি ড্যাডি

হেইহে - আমি কেবল আপনার ভিতরে স্ট্রিং কনটেনটেশনটি লক্ষ্য করছিলামString.Format()
ক্রিস্টোফার

3

যদি আপনার স্ট্রিংটি আরও ভেরিয়েবলের সাথে আরও জটিল হয়ে থাকে তবে আমি স্ট্রিংটি বেছে নেব For ফর্ম্যাট ()। তবে আপনার ক্ষেত্রে স্ট্রিংয়ের আকার এবং ভেরিয়েবলগুলির সংখ্যার জন্য আমি আপনার প্রথম সংস্করণটি সহ যাব, এটি আরও স্পার্টান


3

আমি স্ট্রিং.ফোর্মেট (রিফ্লেক্টর ব্যবহার করে) এ একবার দেখেছি এবং এটি আসলে একটি স্ট্রিংবিল্ডার তৈরি করে তারপরে এটিতে অ্যাপেন্ডফর্ম্যাট কল করে। সুতরাং একাধিক আলোড়নের জন্য এটি কনক্যাটের চেয়ে দ্রুত। দ্রুততম (আমি বিশ্বাস করি) একটি স্ট্রিংবিল্ডার তৈরি করবে এবং ম্যানুয়ালি সংযোজনে কল করবে। অনুমান করার জন্য অবশ্যই "অনেকের" সংখ্যা রয়েছে। আপনার উদাহরণের মতো সাধারণ কিছু জন্য আমি + (প্রকৃতপক্ষে & বেকুয়েজ আমি বেশিরভাগ ভিবি প্রোগ্রামার)) ব্যবহার করব। যেহেতু এটি আরও জটিল হয় আমি স্ট্রিং.ফর্ম্যাটটি ব্যবহার করি। যদি ভেরিয়েবলের প্রচুর পরিমাণ থাকে তবে আমি একটি স্ট্রিংবিল্ডার এবং সংযোজন করব, উদাহরণস্বরূপ, আমাদের কাছে কোড রয়েছে যা কোড তৈরি করে, সেখানে আমি উত্পন্ন কোডের এক লাইন আউটপুট করতে প্রকৃত কোডের একটি লাইন ব্যবহার করি।

এই প্রতিটি ক্রিয়াকলাপের জন্য কতগুলি স্ট্রিং তৈরি হয় সে সম্পর্কে কিছু জল্পনা রয়েছে বলে মনে হয়, সুতরাং কয়েকটি সহজ উদাহরণ নেওয়া যাক।

"C" + rowIndex.ToString();

"সি" ইতিমধ্যে একটি স্ট্রিং।
rowIndex.ToString () অন্য স্ট্রিং তৈরি করে। (@ মানোহার্ড - রো-ইন্ডেক্সের কোনও বক্সিং আসবে না)
তারপরে আমরা চূড়ান্ত স্ট্রিংটি পাই।
আমরা উদাহরণ নিলে

String.Format("C(0)",rowIndex);

তারপরে আমাদের কাছে "C {0}" স্ট্রিং
সারি হিসাবে ইনডেক্সটি ফাংশনে পাস করার জন্য বক্স হয়ে যায়
একটি নতুন স্ট্রিংবিল্ডার তৈরি
হয় স্ট্রিং বিল্ডারে অ্যাপেন্ডফর্ম্যাট ডাকা হয় - আমি অ্যাপেন্ডফর্ম্যাট ফাংশনগুলির বিশদ জানি না তবে এটি অনুমান করি যে এটি কীভাবে হয় অতি দক্ষ, এটি এখনও বাক্সযুক্ত রো-ইন্ডেক্সকে একটি স্ট্রিংয়ে রূপান্তর করতে চলেছে।
তারপরে স্ট্রিংবিল্ডারকে একটি নতুন স্ট্রিংয়ে রূপান্তর করুন।
আমি জানি যে স্ট্রিংবিল্ডাররা অর্থহীন মেমরির অনুলিপিগুলি সংঘটিত হওয়া থেকে বিরত রাখার চেষ্টা করে তবে স্ট্রিং For ফর্ম্যাট প্লেইন কনটেন্টেশনের তুলনায় অতিরিক্ত ওভারহেড দিয়ে এখনও শেষ হয়।

এখন যদি আমরা আরও কয়েকটি স্ট্রিং দিয়ে উদাহরণ নিই

"a" + rowIndex.ToString() + "b" + colIndex.ToString() + "c" + zIndex.ToString();

আমাদের সাথে শুরু করতে 6 টি স্ট্রিং রয়েছে, যা সমস্ত ক্ষেত্রে একই হবে।
সংক্ষিপ্তকরণ ব্যবহার করে আমাদের কাছে 4 টি মধ্যবর্তী স্ট্রিং প্লাস চূড়ান্ত ফলাফল রয়েছে। এটি সেই মধ্যবর্তী ফলাফল যা স্ট্রিং, ফর্ম্যাট (বা একটি স্ট্রিংবিল্ডার) ব্যবহার করে মুছে ফেলা হয়।
মনে রাখবেন যে প্রতিটি মধ্যবর্তী স্ট্রিং তৈরি করতে, পূর্ববর্তীটি অবশ্যই একটি নতুন মেমরির স্থানে অনুলিপি করা উচিত, এটি কেবল মেমরির বরাদ্দ নয় যা সম্ভাব্য ধীরে ধীরে।


4
Nitpick। "এ" + ... + "বি" + ... + "সি" + ... তে আপনার কাছে আসলে 4 টি মাঝারি স্ট্রিং থাকবে না। সংকলক স্ট্রিং.কনক্যাট (প্যারামস স্ট্রিং [] মানগুলি) স্থিতিশীল পদ্ধতিতে একটি কল উত্পন্ন করবে এবং সেগুলি একসাথে একত্রিত হবে। যদিও আমি পঠনযোগ্যতার জন্য স্ট্রিংটি পছন্দ করি read
পি ড্যাডি

2

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

লুপের অভ্যন্তরে বা বড় স্ট্রিংগুলিতে কনটেক্সেটেশনগুলির জন্য আপনার স্ট্রিংবিল্ডার ক্লাসটি সর্বদা ব্যবহার করার চেষ্টা করা উচিত।


2

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

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


1

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

অর্থাৎ আমার একটি বার্তা আছে "The user is not authorized for location " + locationবা "The User is not authorized for location {0}"

যদি আমি কখনও এই বার্তাটি পরিবর্তন করতে চেয়েছিলাম: location + " does not allow this User Access"বা "{0} does not allow this User Access"

স্ট্রিং সহ।ফর্ম্যাটটি হ'ল স্ট্রিং পরিবর্তন করতে হবে। কনক্যাটেনেশনের জন্য আমাকে সেই বার্তাটি সংশোধন করতে হবে

একাধিক জায়গায় ব্যবহার করা হলে সময় বরাদ্দ বাঁচাতে পারে।


1

আমি এই ছাপে ছিলাম যে স্ট্রিং.ফর্ম্যাটটি দ্রুত ছিল এটি এই পরীক্ষায় 3 এক্স ধীর হতে পারে বলে মনে হচ্ছে

string concat = "";
        System.Diagnostics.Stopwatch sw1 = new System.Diagnostics.Stopwatch    ();
        sw1.Start();
        for (int i = 0; i < 10000000; i++)
        {
            concat = string.Format("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}","1", "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "10" , i);
        }
        sw1.Stop();
        Response.Write("format: "  + sw1.ElapsedMilliseconds.ToString());
        System.Diagnostics.Stopwatch sw2 = new System.Diagnostics.Stopwatch();
        sw2.Start();
        for (int i = 0; i < 10000000; i++)
        {
            concat = "1" + "2" + "3" + "4" + "5" + "6" + "7" + "8" + "9" + "10" + i;
        }
        sw2.Stop();

স্ট্রিং.ফর্ম্যাটটি 4.6 সেকেন্ড সময় নিয়েছিল এবং '+' ব্যবহার করার সময় এটি 1.6 সেকেন্ড সময় নেয়।


7
"1" + "2" + "3" + "4" + "5" + "6" + "7" + "8" + "9" + "10""12345678910" + istring.Format(...)
সংকলকটি

0

স্ট্রিং. ফর্ম্যাটটি সম্ভবত একটি আরও ভাল পছন্দ যখন বিন্যাস টেম্পলেট ("সি {0}") একটি কনফিগারেশন ফাইলে সংরক্ষণ করা হয় (যেমন Web.config / App.config)


0

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



-1

স্ট্রিং.ফর্ম্যাটটির তুলনায় স্ট্রিং কনটেনটেশন আরও মেমরি নেয়। স্ট্রিংগুলি সংঘবদ্ধ করার সর্বোত্তম উপায় হ'ল স্ট্রিং.ফর্ম্যাট বা System.Text.StringBuilder অবজেক্ট।

আসুন প্রথম কেসটি নেওয়া যাক: "সি" + রোউইনডেক্স। টুস্ট্রিং () আসুন ধরে নেওয়া যাক রোইইন্ডেক্স একটি মান টাইপ তাই টুস্ট্রিং () পদ্ধতিটি বাক্সে মানকে স্ট্রিংয়ে রূপান্তর করতে হয় এবং তারপরে সিএলআর দুটি স্ট্রিংয়ের জন্য নতুন স্ট্রিংয়ের জন্য মেমরি তৈরি করে।

স্ট্রিং হিসাবে। ফর্ম্যাটটি অবজেক্টের প্যারামিটারের প্রত্যাশা করে এবং রো-ইন্ডেক্সকে একটি বস্তুরূপে গ্রহণ করে এবং এটিকে অভ্যন্তরীণভাবে অফকোর্সে স্ট্রিংয়ে রূপান্তরিত করে সেখানে বক্সিং থাকবে তবে এটি অভ্যন্তরীণ এবং এটি প্রথম ক্ষেত্রে যেমন মেমরিও গ্রহণ করবে না।

সংক্ষিপ্ত স্ট্রিংয়ের জন্য এটি আমার অনুমানের মতো ততটা গুরুত্বপূর্ণ হবে না ...

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