সি # তে পরিবর্তনযোগ্য এবং অপরিবর্তনীয় স্ট্রিংয়ের মধ্যে পার্থক্য কী?
সি # তে পরিবর্তনযোগ্য এবং অপরিবর্তনীয় স্ট্রিংয়ের মধ্যে পার্থক্য কী?
উত্তর:
পরিবর্তনীয় এবং অপরিবর্তনীয় হ'ল ইংরেজি শব্দের অর্থ যথাক্রমে "পরিবর্তন করতে পারে" এবং "পরিবর্তন করতে পারে না"। আইটি প্রসঙ্গে শব্দের অর্থ একই; অর্থাত
অন্যান্য প্রোগ্রামিং ভাষা / পরিবেশের মতো সি # / .NET এ এই শব্দের অর্থ একই, যদিও (স্পষ্টতই) প্রকারের নামগুলি পৃথক হতে পারে, অন্যান্য বিবরণ হিসাবে।
রেকর্ড এর জন্য:
String মান সি # /। নেট অপরিবর্তনীয় স্ট্রিং টাইপ StringBuilder স্ট্যান্ডার্ড সি # /। নেট মিউটেবল স্ট্রিং টাইপ সি # হিসাবে উপস্থাপিত স্ট্রিংটিতে "পরিবর্তনকে প্রভাবিত করতে" Stringআপনি আসলে একটি নতুন Stringঅবজেক্ট তৈরি করেন । আসলটি Stringপরিবর্তন করা হয়নি ... কারণ এটি অপরিবর্তনীয়।
বেশিরভাগ ক্ষেত্রে এটি ব্যবহার করা ভাল Stringকারণ এটি তাদের সম্পর্কে সহজ কারণ; যেমন আপনার অন্য থ্রেড "আমার স্ট্রিং পরিবর্তন করতে পারে" এমন সম্ভাবনাটি বিবেচনা করার দরকার নেই। যাইহোক, আপনি যখন ক্রিয়াকলাপের ক্রম ব্যবহার করে একটি স্ট্রিং নির্মাণ বা সংশোধন করতে চান তখন এটি ব্যবহার করা আরও দক্ষ হতে পারে StringBuilder।
এবং শেষ অবধি, যারা এই দাবী করেন যে এগুলি StringBuilderস্ট্রিং নয় কারণ এটি অপরিবর্তনীয় নয়, মাইক্রোসফ্ট ডকুমেন্টেশনStringBuilder এইভাবে বর্ণনা করে:
" চরিত্রগুলির একটি পরিবর্তনীয় স্ট্রিং প্রতিনিধিত্ব করে This এই শ্রেণিটি উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে না" "
String অপরিবর্তনীয়
অর্থাত্ স্ট্রিংগুলি পরিবর্তন করা যায় না। আপনি যখন কোনও স্ট্রিং পরিবর্তন করেন (উদাহরণস্বরূপ এটি যুক্ত করে) আপনি আসলে একটি নতুন স্ট্রিং তৈরি করছেন।
কিন্তু StringBuilder পরিবর্তনযোগ্য নয় (বরং এটি পরিবর্তনীয়)
সুতরাং যদি আপনাকে অনেক বার স্ট্রিং পরিবর্তন করতে হয়, যেমন একাধিক কনক্যাটেনশনস, তবে ব্যবহার করুন StringBuilder।
O(N^2)আচরণে বাড়ে ...
কোনও বস্তু পরিবর্তনযোগ্য, যদি একবার তৈরি করা হয়, তার অবস্থার উপর বিভিন্ন ক্রিয়াকলাপ কল করে তার অবস্থার পরিবর্তন করা যেতে পারে, অন্যথায় তা পরিবর্তনযোগ্য নয়।
সি # (এবং .NET) এ একটি স্ট্রিং শ্রেণি সিস্টেম.স্ট্রিং দ্বারা প্রতিনিধিত্ব করা হয়। stringশব্দ এই শ্রেণীর জন্য একটি alias হয়।
সিস্টেম . স্ট্রিং ক্লাসটি অপরিবর্তনীয়, অর্থাৎ একবার তৈরি হয়ে গেলে এর রাজ্য পরিবর্তন করা যায় না ।
সমস্ত কাজকর্মের তাই তোমার মত স্ট্রিং উপর সঞ্চালন Substring, Remove, Replace, সংযুক্তকরণের ব্যবহার + অপারেটর ইত্যাদি একটি নতুন স্ট্রিং তৈরি করব এবং ফিরে আসতে হবে।
প্রদর্শনের জন্য নিম্নলিখিত প্রোগ্রামটি দেখুন -
string str = "mystring";
string newString = str.Substring(2);
Console.WriteLine(newString);
Console.WriteLine(str);
এটি যথাক্রমে 'স্ট্রিং' এবং 'মাইস্ট্রিং' প্রিন্ট করবে।
জন্য অপরিবর্তনীয়তা সুবিধাগুলো এবং কেন স্ট্রিং অপরিবর্তনীয় চেক হয় কেন .NET স্ট্রিং অপরিবর্তনীয় হয়?।
আপনি যদি এমন স্ট্রিং রাখতে চান যা আপনি প্রায়শই সংশোধন করতে চান আপনি StringBuilderক্লাসটি ব্যবহার করতে পারেন । উদাহরণস্বরূপ অপারেশনগুলি StringBuilder একই বস্তুকে সংশোধন করবে ।
সম্পর্কিত আরও পরামর্শের জন্য যখন ব্যবহার করতে StringBuilder পড়ুন StringBuilder ব্যবহার করতে কখন? ।
সমস্ত stringবস্তু সি # তে পরিবর্তনযোগ্য। শ্রেণীর অবজেক্টগুলি string, একবার তৈরি হয়ে গেলে, তারা যেগুলি নির্মিত হয়েছিল সেগুলি ছাড়া আর কোনও মান উপস্থাপন করতে পারে না। পরিবর্তে একটি স্ট্রিং "পরিবর্তন" করে বলে মনে হচ্ছে এমন সমস্ত ক্রিয়াকলাপগুলি একটি নতুন উত্পাদন করে। এটি মেমরির সাথে অকার্যকর, তবে এটি বিশ্বাস করতে সক্ষম হবেন যে আপনার অধীনে কোনও স্ট্রিং ফর্মের পরিবর্তন হবে না - কারণ আপনি যতক্ষণ আপনার রেফারেন্সটি পরিবর্তন করবেন না, ততক্ষণ স্ট্রিংটি কখনও পরিবর্তন হবে না।
একটি পরিবর্তনীয় অবজেক্ট, এর বিপরীতে, ডেটা ক্ষেত্র রয়েছে যা পরিবর্তন করা যায়। এর এক বা একাধিক পদ্ধতিতে অবজেক্টের বিষয়বস্তু পরিবর্তন হবে, বা এর এমন একটি সম্পত্তি রয়েছে যা এতে লেখা হয়, অবজেক্টের মান পরিবর্তন করে।
আপনার যদি কোনও পরিবর্তনীয় অবজেক্ট থাকে- স্ট্রিংয়ের সাথে সর্বাধিক অনুরূপ StringBuffer- তবে আপনি এটির একটি অনুলিপি তৈরি করতে হবে যদি আপনি একেবারে নিশ্চিত হতে চান যে এটি আপনার অধীনে থেকে পরিবর্তিত হবে না। এ কারণেই পরিবর্তনযোগ্য অবজেক্টগুলি যে কোনও আকারের কী হিসাবে ব্যবহার করা বিপজ্জনকDictionary বা সেট-এর -বস্তুগুলি নিজেরাই পরিবর্তিত হতে পারে এবং ডেটা স্ট্রাকচারটি জানার কোনও উপায় থাকবে না, ফলে আপনার প্রোগ্রামটি ক্র্যাশ হয়ে যাবে এবং দুর্নীতিগ্রস্ত ডেটা বাড়ে।
তবে আপনি এর বিষয়বস্তু পরিবর্তন করতে পারেন- সুতরাং এটি সম্পূর্ণ অনুলিপি করার চেয়ে অনেক বেশি মেমরির দক্ষ কারণ আপনি একটি একক অক্ষর বা এর অনুরূপ কিছু পরিবর্তন করতে চেয়েছিলেন।
সাধারণত, কাজটি করার সময় সঠিক জিনিসটি হ'ল পরিবর্তনযোগ্য অবজেক্টগুলি ব্যবহার করা এবং আপনি যখন কিছু শেষ করেন তখন অপরিবর্তনীয় বস্তুগুলি। এটি অবশ্যই অব্যবহারযোগ্য অবজেক্টগুলিতে প্রযোজ্য; সংগ্রহগুলি বেশিরভাগই করে না। সংগ্রহের কেবল পঠনযোগ্য ফর্মগুলি সরবরাহ করা প্রায়শই দরকারী, যদিও এটি আপনার সংগ্রহের অভ্যন্তরীণ পরিস্থিতি অন্য প্রসঙ্গে প্রেরণ করার সময় অপরিবর্তনীয় সমতুল্য - অন্যথায়, কোনও কিছু সেই রিটার্নের মান নিতে পারে, এটিতে কিছু করতে পারে এবং আপনার দুর্নীতিগ্রস্থ করে তোলে ডেটা।
অপরিবর্তনীয়:
আপনি যখন কোনও অবজেক্টে কিছু অপারেশন করেন, এটি একটি নতুন অবজেক্ট তৈরি করে তাই স্ট্রিংয়ের ক্ষেত্রে রাষ্ট্রটি পরিবর্তনযোগ্য নয়।
চপল
আপনি যখন কোনও বস্তুর উপর কিছু ক্রিয়াকলাপ সম্পাদন করেন, তখন স্ট্রিংবিল্ডারের ক্ষেত্রে অবজেক্ট নিজেই কোনও নতুন পর্যবেক্ষণ তৈরি করে না
ইন নেট সিস্টেম। স্ট্রিং (ওরফে স্ট্রিং) একটি অপরিবর্তনীয় বস্তু। এর অর্থ আপনি যখন কোনও বস্তু তৈরি করেন আপনি তার মানটি পরে পরিবর্তন করতে পারবেন না। আপনি কেবল একটি অপরিবর্তনীয় বস্তুকে পুনরায় তৈরি করতে পারেন।
System.Text.StringBuilder হ'ল System.String এর সমান্তরাল সমতুল্য এবং আপনি এর মানটি চ্যান করতে পারেন
উদাহরণ স্বরূপ:
class Program
{
static void Main(string[] args)
{
System.String str = "inital value";
str = "\nsecond value";
str = "\nthird value";
StringBuilder sb = new StringBuilder();
sb.Append("initial value");
sb.AppendLine("second value");
sb.AppendLine("third value");
}
}
এমএসআইএল নিম্নলিখিত উত্পন্ন করে: আপনি যদি কোডটি তদন্ত করেন। আপনি দেখতে পাবেন যে যখনই আপনি সিস্টেমের কোনও বস্তুকে চান করেন ring স্ট্রিং আপনি আসলে নতুন তৈরি করছেন। কিন্তু System.Text.StringBuilder এ যখনই আপনি পাঠ্যের মান পরিবর্তন করেন আপনি বস্তুকে পুনরায় তৈরি করবেন না।
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 62 (0x3e)
.maxstack 2
.locals init ([0] string str,
[1] class [mscorlib]System.Text.StringBuilder sb)
IL_0000: nop
IL_0001: ldstr "inital value"
IL_0006: stloc.0
IL_0007: ldstr "\nsecond value"
IL_000c: stloc.0
IL_000d: ldstr "\nthird value"
IL_0012: stloc.0
IL_0013: newobj instance void [mscorlib]System.Text.StringBuilder::.ctor()
IL_0018: stloc.1
IL_0019: ldloc.1
IL_001a: ldstr "initial value"
IL_001f: callvirt instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string)
IL_0024: pop
IL_0025: ldloc.1
IL_0026: ldstr "second value"
IL_002b: callvirt instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::AppendLine(string)
IL_0030: pop
IL_0031: ldloc.1
IL_0032: ldstr "third value"
IL_0037: callvirt instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::AppendLine(string)
IL_003c: pop
IL_003d: ret
} // end of method Program::Main
স্ট্রিংগুলি পার্শ্ব পরিবর্তনযোগ্য কারণ .NET দৃশ্যের পিছনে স্ট্রিং পুল ব্যবহার করে। এর অর্থ:
string name = "My Country";
string name2 = "My Country";
নাম এবং নাম 2 উভয়ই স্ট্রিং পুল থেকে একই মেমরি অবস্থানের উল্লেখ করছে। এখন ধরুন আপনি নাম 2 এ পরিবর্তন করতে চান:
name2 = "My Loving Country";
এটি "আমার ভালবাসার দেশ" স্ট্রিংয়ের জন্য স্ট্রিং পুলে সন্ধান করবে, যদি আপনি এটির রেফারেন্স পাবেন তবে স্ট্রিং পুলে অন্য বিজ্ঞ নতুন স্ট্রিং "মাই লাভিং কান্ট্রি" তৈরি হবে এবং নাম 2 এর রেফারেন্স পাবে। তবে এই পুরো প্রক্রিয়াটি " আমার দেশ " পরিবর্তন করা হয়নি কারণ নামের মতো অন্যান্য পরিবর্তনশীল এখনও এটি ব্যবহার করে। এবং যে কারণে স্ট্রিং হয় অপরিবর্তনীয় ।
স্ট্রিংবিল্ডার বিভিন্নভাবে কাজ করে এবং স্ট্রিং পুল ব্যবহার করবেন না। যখন আমরা স্ট্রিংবিল্ডারের কোনও উদাহরণ তৈরি করি:
var address = new StringBuilder(500);
এটি এই উদাহরণের জন্য 500 বাইট আকারের মেমরি খণ্ড বরাদ্দ করে এবং সমস্ত ক্রিয়াকলাপটি কেবল এই মেমরির অবস্থানটি পরিবর্তন করে এবং এই মেমরিটি অন্য কোনও বস্তুর সাথে ভাগ করে নি। এবং যে কারণে হয় StringBuilder হয় চপল ।
আমি আশা করি এটি সাহায্য করবে
আসলে কিছুই নেই। স্ট্রিং ক্লাসটি পরিবর্তনীয়।
unsafe
{
string foo = string.Copy("I am immutable.");
fixed (char* pChar = foo)
{
char* pFoo = pChar;
pFoo[5] = ' ';
pFoo[6] = ' ';
}
Console.WriteLine(foo); // "I am mutable."
}
স্ট্রিং এবং স্ট্রিংবিল্ডার ক্লাসে এই ধরণের যুক্তি সর্বদা করা হয়। আপনি যখন কনক্যাট, সাবস্ট্রিং ইত্যাদি কল করবেন তখনই তারা কেবল নতুন স্ট্রিং বরাদ্দ করে এবং নতুন স্ট্রিংয়ে অনুলিপি করতে পয়েন্টার গাণিতিক ব্যবহার করে। স্ট্রিংগুলি কেবল নিজেদেরকে পরিবর্তন করে না, তাই কেন তারা "অপরিবর্তনীয়" হিসাবে বিবেচিত হয়।
উপায় দ্বারা, স্ট্রিং আক্ষরিক দিয়ে এটি চেষ্টা করবেন না বা আপনি আপনার প্রোগ্রামকে খারাপভাবে জড়িয়ে ফেলবেন:
string bar = "I am a string.";
fixed (char* pChar = bar)
{
char* pBar = pChar;
pBar[2] = ' ';
}
string baz = "I am a string.";
Console.WriteLine(baz); // "I m a string."
এর কারণ স্ট্রিং লিটারালগুলি ডেস্কটপে অভ্যন্তরীণ হয় N নেট ফ্রেমওয়ার্ক; অন্য কথায়, barএবং bazঠিক একই পংক্তির দিকে নির্দেশ করুন, সুতরাং একটিকে পরিবর্তন করে অন্যটিকে পরিবর্তন করতে হবে। যদিও আপনি উইনআরটি-র মতো একটি পরিচালনা না করা প্ল্যাটফর্ম ব্যবহার করছেন, এতে স্ট্রিং ইন্টার্নিংয়ের অভাব রয়েছে, তবে এটি সমস্ত সূক্ষ্ম এবং জঘন্য।
পরিষ্কার করার জন্য সি # তে (বা সাধারণভাবে নেটও) পরিবর্তিত স্ট্রিংয়ের মতো কোনও জিনিস নেই। অন্যান্য ল্যাঙ্গুয়েস্টগুলি পরিবর্তনীয় স্ট্রিংগুলিকে সমর্থন করে (স্ট্রিং যা পরিবর্তন করতে পারে) তবে। নেট ফ্রেমওয়ার্কটি দেয় না।
সুতরাং আপনার প্রশ্নের সঠিক উত্তর হ'ল সমস্ত স্ট্রিং সি # তে অপরিবর্তনীয়।
স্ট্রিং এর একটি নির্দিষ্ট অর্থ রয়েছে। "স্ট্রিং" লোয়ারকেস কীওয়ার্ড হ'ল কেবলমাত্র সিস্টেম.স্ট্রিং ক্লাস থেকে ইনস্ট্যান্টেশনযুক্ত কোনও সামগ্রীর শর্টকাট। স্ট্রিং ক্লাস থেকে তৈরি সমস্ত বস্তু সর্বদাই অপরিবর্তনীয়।
আপনি যদি পাঠ্যের পরিবর্তনীয় উপস্থাপনা চান তবে আপনার স্ট্রিংবিল্ডারের মতো অন্য একটি ক্লাস ব্যবহার করা উচিত। স্ট্রিংবিল্ডার আপনাকে পুনরাবৃত্তভাবে 'শব্দের' সংকলন তৈরি করতে দেয় এবং তারপরে এটিকে স্ট্রিংয়ে রূপান্তর করে (আবার অচল করে)।
StringBuilderবিপরীতে রয়েছে: দেখুন এমএসডিএন.ইমক্রোসফটকম
তথ্য মান পরিবর্তন করা যাবে না। দ্রষ্টব্য: পরিবর্তনশীল মানটি পরিবর্তিত হতে পারে, তবে আসল অপরিবর্তনীয় ডেটা মানটি বাতিল করা হয়েছিল এবং মেমরিতে একটি নতুন ডেটা মান তৈরি করা হয়েছিল।
Http://yasserhaikh.com/ কি-is-the-differences-between-strings-and-stringbuilder-in-c-net/ থেকে
সংক্ষিপ্ত উত্তর: স্ট্রিং পরিবর্তনযোগ্য - যেখানে স্ট্রিংবিল্ডার পরিবর্তনযোগ্য mut
ওটার মানে কি ? উইকি বলেছেন: অবজেক্ট-ওরিয়েন্টডে, অপরিবর্তনীয় বস্তু এমন একটি বস্তু, যার অবস্থা তৈরির পরে তার রাজ্যটি পরিবর্তন করা যায় না। এটি কোনও পরিবর্তনীয় বস্তুর বিপরীতে, যা তৈরি হওয়ার পরে এটি পরিবর্তন করা যেতে পারে।
স্ট্রিংবিল্ডার ক্লাস ডকুমেন্টেশন থেকে:
স্ট্রিং অবজেক্টটি অপরিবর্তনীয়। প্রতিবার আপনি সিস্টেম. স্ট্রিং ক্লাসে যে কোনও একটি পদ্ধতি ব্যবহার করুন, আপনি মেমরিতে একটি নতুন স্ট্রিং অবজেক্ট তৈরি করেন, যার জন্য সেই নতুন বস্তুর জন্য নতুন বরাদ্দ প্রয়োজন requires
আপনি যখন স্ট্রিংয়ে বার বার সংশোধন করার প্রয়োজন সেখানে একটি নতুন স্ট্রিং অবজেক্ট তৈরির সাথে যুক্ত ওভারহেড ব্যয়বহুল হতে পারে।
যখন আপনি একটি নতুন অবজেক্ট তৈরি না করে স্ট্রিং সংশোধন করতে চান তখন সিস্টেম.টেক্সট.স্ট্রিংবিল্ডার ক্লাসটি ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, স্ট্রিংবিল্ডার ক্লাসটি লুপে একসাথে অনেকগুলি স্ট্রিং সংমিশ্রণ করার সময় কর্মক্ষমতা বাড়িয়ে তুলতে পারে।
অপরিবর্তনীয় স্ট্রিং এবং মিউটেবল স্ট্রিং বিল্ডারের উদাহরণ এখানে
Console.WriteLine("Mutable String Builder");
Console.WriteLine("....................................");
Console.WriteLine();
StringBuilder sb = new StringBuilder("Very Good Morning");
Console.WriteLine(sb.ToString());
sb.Remove(0, 5);
Console.WriteLine(sb.ToString());
Console.WriteLine();
Console.WriteLine("Immutable String");
Console.WriteLine("....................................");
Console.WriteLine();
string s = "Very Good Morning";
Console.WriteLine(s);
s.Substring(0, 5);
Console.WriteLine(s);
Console.ReadLine();
সি # তে স্ট্রিং অপরিবর্তনীয়। আপনি যদি কোনও স্ট্রিং দিয়ে এটি যুক্ত করেন তবে আপনি আসলে একটি নতুন স্ট্রিং তৈরি করছেন, এটি নতুন স্ট্রিং অবজেক্ট! তবে স্ট্রিংবিল্ডার মিউটেটেবল স্ট্রিং তৈরি করে।
স্ট্রিংবিল্ডার একটি বিশাল ডেটা স্ট্রিংকে সংঘবদ্ধ করার জন্য একটি ভাল বিকল্প কারণ স্ট্রিংবিল্ডার একটি পরিবর্তনীয় স্ট্রিং টাইপ এবং স্ট্রিংবিল্ডার অবজেক্ট একটি অপরিবর্তনীয় প্রকার, যার অর্থ স্ট্রিংবিল্ডার স্ট্রিংকে একত্রিত করার সময় কখনই বস্তুর কোনও নতুন উদাহরণ তৈরি করে না।
যদি আমরা স্ট্রিংবিল্ডারের পরিবর্তে স্ট্রিংবিল্ডারের পরিবর্তে স্ট্রিং ব্যবহার করতে পারি তবে এটি প্রতিবার মেমরিতে নতুন উদাহরণ তৈরি করবে।