সি # তে কেন স্ট্রিং একটি রেফারেন্স টাইপ যা মান ধরণের মতো আচরণ করে?


371

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

স্ট্রিং কেন তখন কেবল একটি মান প্রকার নয়?


যেহেতু অপরিবর্তনীয় ধরণের ক্ষেত্রে পার্থক্যটি বেশিরভাগ ক্ষেত্রে বাস্তবায়ন-বিশদ ( isপরীক্ষাগুলি বাদ রেখে), উত্তর সম্ভবত "historicalতিহাসিক কারণে" is অনুলিপিযোগ্য বস্তুগুলি শারীরিকভাবে অনুলিপি করার প্রয়োজন নেই বলে অনুলিপি করার কার্যকারিতা কারণ হতে পারে না। এখন ব্রেকিং কোড ব্যতীত পরিবর্তন করা অসম্ভব যা প্রকৃতপক্ষে isচেক (বা অনুরূপ সীমাবদ্ধতা) ব্যবহার করে।
এলাজার

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

উত্তর:


333

স্ট্রিংগুলি মূল্য ধরণের নয় যেহেতু এগুলি বিশাল হতে পারে এবং এগুলি স্তূপে সংরক্ষণ করা দরকার। মান ধরণের স্ট্যাকগুলিতে (এখনও সিএলআরের সমস্ত প্রয়োগে) সঞ্চিত রয়েছে। স্ট্যাক বরাদ্দকরণের স্ট্রিংগুলি সমস্ত ধরণের জিনিসকে ভেঙে ফেলবে: স্ট্যাকটি 32-বিটের জন্য কেবল 1MB এবং M৪-বিটের জন্য 4MB, আপনাকে প্রতিটি স্ট্রিং বক্স করতে হবে, একটি অনুলিপি জরিমানা সহ, আপনি স্ট্রিংগুলি এবং মেমরির ব্যবহার করতে পারবেন না বেলুন ইত্যাদি ...

(সম্পাদনা করুন: মানের ধরণের স্টোরেজটি একটি বাস্তবায়ন বিশদ হিসাবে যুক্ত হওয়া সম্পর্কে স্পষ্টতা যুক্ত হয়েছিল, যা আমাদের এই পরিস্থিতিতে নিয়ে যায় যেখানে সিস্টেম.ভ্যালু টাইপ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত মূল্য সেমেটিক সহ আমাদের একটি প্রকার নেই। ধন্যবাদ বেন।)


75
আমি এখানে নীটপিক করছি, তবে কেবল কারণ এটি আমাকে প্রশ্নের সাথে সম্পর্কিত একটি ব্লগ পোস্টের সাথে লিঙ্ক করার সুযোগ দেয়: মানের ধরণগুলি স্ট্যাকের মধ্যে প্রয়োজনীয়ভাবে সংরক্ষণ করা হয় না। এটি প্রায়শই এমএসএন নেট-এ সত্য, তবে সিএলআই স্পেসিফিকেশন দ্বারা নির্দিষ্ট করা হয় না। মান এবং রেফারেন্স প্রকারের মধ্যে প্রধান পার্থক্য হ'ল, যে রেফারেন্স প্রকারগুলি অনুলিপি দ্বারা কপিরাইট-বাই-মান শব্দার্থতাকে অনুসরণ করে। দেখুন blogs.msdn.com/ericlippert/archive/2009/04/27/... এবং blogs.msdn.com/ericlippert/archive/2009/05/04/...
বেন Schwehn

8
@ কিওয়ার্টি: Stringপরিবর্তনশীল আকার নয়। আপনি যখন এতে যুক্ত হন, আপনি আসলে অন্য একটি Stringবস্তু তৈরি করছেন , এর জন্য নতুন মেমরি বরাদ্দ করছেন।
কোডকাইজন

5
এটি বলেছিল যে তাত্ত্বিকভাবে একটি স্ট্রিং একটি মান ধরণের (স্ট্রাক্ট) হতে পারে তবে "মান" স্ট্রিংয়ের রেফারেন্স ছাড়া আর কিছু হতে পারত না। .NET ডিজাইনাররা স্বাভাবিকভাবেই মধ্যস্থতাকে কেটে ফেলার সিদ্ধান্ত নিয়েছিল (স্ট্যান্ড হ্যান্ডলিং। নেট 1.0 এ অক্ষম ছিল এবং জাভা অনুসরণ করা স্বাভাবিক ছিল, যেখানে স্ট্রিংগুলি আদিম, টাইপের পরিবর্তে ইতিমধ্যে একটি রেফারেন্স হিসাবে সংজ্ঞায়িত করা হয়েছিল। একটি মান প্রকারের পরে এটিকে অবজেক্টে রূপান্তরিত করার জন্য এটি বক্স করা দরকার, একটি অযথা অদক্ষতা)।
কিওয়ার্টি

7
@ কোডেকাইজেন কিওয়ার্টি ঠিক আছে তবে আমি মনে করি শব্দটি বিভ্রান্তিকর ছিল। একটি স্ট্রিং অন্য স্ট্রিংয়ের চেয়ে আলাদা আকারের হতে পারে এবং এইভাবে, সত্য মানের মানের থেকে পৃথক, সংকলকটি স্ট্রিংয়ের মান সংরক্ষণের জন্য কত স্থান বরাদ্দ করতে পারে তা আগেই জানতে পারত না। উদাহরণস্বরূপ, একটি Int32সর্বদা 4 বাইট হয়, এইভাবে সংকলক 4 বার বাইট বরাদ্দ করে যে কোনও সময় আপনি স্ট্রিং ভেরিয়েবল সংজ্ঞায়িত করেন। কম্পাইলারটি যখন কোনও intভেরিয়েবলের মুখোমুখি হয় (যদি এটি কোনও মান ধরণের ছিল) তখন কত মেমরি বরাদ্দ করা উচিত ? বুঝতে হবে যে সেই সময়টিতে এখনও মান নির্ধারিত হয়নি।
কেভিন ব্রক

2
দুঃখিত, আমার মন্তব্যে এমন একটি টাইপ যা আমি এখনই ঠিক করতে পারি না; এটি হওয়া উচিত ছিল .... উদাহরণস্বরূপ, একটি Int32সর্বদা 4 বাইট হয়, এইভাবে সংকলক আপনি যখন কোনও intভেরিয়েবল সংজ্ঞায়িত করেন তখন 4 বাইট বরাদ্দ করে । কম্পাইলারটি যখন কোনও stringভেরিয়েবলের মুখোমুখি হয় (যদি এটি কোনও মান ধরণের ছিল) তখন কত মেমরি বরাদ্দ করা উচিত ? বুঝতে হবে যে সেই সময়টিতে এখনও মান নির্ধারিত হয়নি।
কেভিন ব্রক

57

এটি কোনও মান ধরণের নয় কারণ কর্মক্ষমতা (স্থান এবং সময়!) ভয়ানক হবে যদি এটি কোনও মান ধরণের হয় এবং প্রতিবার পদ্ধতিতে পাঠানো এবং ফিরে আসার সময় এর মান অনুলিপি করা হত had

বিশ্বকে বুদ্ধিমান করে তোলার জন্য এর মূল্যবোধ রয়েছে। আপনি যদি ধারণা করতে পারেন যে কোডটি করা কতটা কঠিন হবে

string s = "hello";
string t = "hello";
bool b = (s == t);

সেট bহতে false? কল্পনা করুন যে কোনও অ্যাপ্লিকেশন সম্পর্কে কোডিং কতটা কঠিন হবে।


44
জাভা পিঠির জন্য পরিচিত নয়।
জেসন

3
@ ম্যাট: ঠিক আমি যখন সি # তে স্যুইচ করেছি তখন এটি বিভ্রান্তির মতো ছিল, যেহেতু আমি সর্বদা (কখনও কখনও করণীয়) .সামগ্রী (..) স্ট্রিংয়ের সাথে তুলনা করার জন্য ব্যবহার করি যখন আমার সতীর্থরা কেবল "==" ব্যবহার করেছিলেন। আমি কখনই বুঝতে পারি নি যে তারা কেন রেফারেন্সগুলি তুলনা করতে "==" ছাড়েন না, যদিও আপনি যদি মনে করেন, 90% সময় আপনি সম্ভবত স্ট্রিংয়ের রেফারেন্স নয় বরং সামগ্রীটি তুলনা করতে চাইবেন।
জুড়ি

7
@ জুড়ি: আসলে আমি মনে করি যে রেফারেন্সগুলি চেক করা কখনই কাম্য নয়, যেহেতু কখনও কখনও new String("foo");এবং অন্যরাই new String("foo")একই রেফারেন্সে মূল্যায়ন করতে পারে, কোন newঅপারেটর আপনাকে কী ধরনের প্রত্যাশা করবে তা নয় । (অথবা আপনি কি আমাকে এমন কোনও ক্ষেত্রে বলতে পারেন যেখানে আমি উল্লেখগুলি তুলনা করতে চাই?)
মাইকেল

1
@ মিশেল ওয়েল, নলের সাথে তুলনা করতে আপনাকে সমস্ত তুলনাতে একটি রেফারেন্স তুলনা অন্তর্ভুক্ত করতে হবে। স্ট্রিংগুলির সাথে রেফারেন্সগুলির তুলনা করার জন্য আর একটি ভাল জায়গা হ'ল সমতা-তুলনা করার চেয়ে তুলনা করা। দুটি সমতুল্য স্ট্রিং, যখন তুলনা করা উচিত 0 ফিরে আসবে for যদিও এই ক্ষেত্রে যাচাই করা যদিও পুরো তুলনাটি যেভাবেই চলতে পারে ততক্ষণ সময় লাগে, তাই কোনও দরকারী শর্ট-কাট নয়। জন্য অনুসন্ধান ReferenceEquals(x, y)করা একটি দ্রুত পরীক্ষা এবং আপনি অবিলম্বে 0 ফিরে আসতে পারেন, এবং আপনার নাল-পরীক্ষার সাথে মিশ্রিত হয়ে গেলে আরও কোনও কাজ যোগ করে না।
জন হান্না

1
... স্ট্রিংগুলি শ্রেণীর ধরণের হওয়ার পরিবর্তে স্টাইলের মান ধরণের হতে পারে তার অর্থ stringহ'ল শূন্য রেফারেন্সের পরিবর্তে একটি ডিফল্ট মান খালি স্ট্রিং হিসাবে (যেমন এটি প্রাক-ওয়েব সিস্টেমে ছিল) হিসাবে আচরণ করতে পারে। প্রকৃতপক্ষে, আমার নিজের পছন্দটিতে একটি মানের ধরণ থাকবে Stringযা একটি রেফারেন্স-টাইপযুক্ত থাকবে NullableString, যার সাথে String.Emptyপূর্বেরটির সাথে একটি ডিফল্ট মানের সমতুল্য এবং পরবর্তীটির ডিফল্ট থাকে nullএবং বিশেষ বক্সিং / আনবক্সিং বিধি (যেমন বক্সিং একটি ডিফল্ট- মূল্যবান NullableStringএকটি রেফারেন্স দিতে হবে String.Empty)।
সুপারক্যাট

26

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

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

রেফারেন্সের ধরণগুলি সাধারণত পরিবর্তনযোগ্য, তবে তা বোঝা যায় তবে তা অপরিবর্তনীয় হিসাবে ডিজাইন করা যেতে পারে। স্ট্রিংগুলি অপরিবর্তনীয় হিসাবে সংজ্ঞায়িত করা হয় কারণ এটি নির্দিষ্ট অপ্টিমাইজেশনকে সম্ভব করে তোলে। উদাহরণস্বরূপ, একই স্ট্রিংটি যদি একই প্রোগ্রামে একাধিকবার ঘটে (যা বেশ সাধারণ) তবে সংকলক একই বস্তুকে পুনরায় ব্যবহার করতে পারে।

তাহলে পাঠ্য দ্বারা স্ট্রিংগুলির তুলনা করার জন্য কেন "==" ওভারলোড হয়? কারণ এটি সবচেয়ে কার্যকর শব্দার্থবিজ্ঞান। যদি পাঠ্য অনুসারে দুটি স্ট্রিং সমান হয়, তবে এটি অপটিমাইজেশনের কারণে একই বস্তুর রেফারেন্স হতে পারে বা নাও হতে পারে। সুতরাং তুলনা করার রেফারেন্সগুলি বেশ অযথা, যখন পাঠ্যের তুলনা করা প্রায়শই আপনি চান what

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


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

2
@Sevy: একটি স্ট্রিং এর আকার হয় ধ্রুবক।
জ্যাকবিবি

কারণ এটিতে কেবলমাত্র একটি অক্ষর অ্যারের উল্লেখ রয়েছে যা ভেরিয়েবল আকারের। একমাত্র প্রকৃত "মান" হ'ল একটি মান ধরণের হ'ল এটি কেবল আরও বিভ্রান্তিকর হবে কারণ এর সমস্ত নিবিড় উদ্দেশ্যে এখনও রেফারেন্স শব্দার্থতত্ত্ব থাকবে।
পরিবেশন করুন

1
@ শেভি: একটি অ্যারের আকার ধ্রুবক।
জ্যাকবিবি

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

16

এটি একটি পুরানো প্রশ্নের দেরী উত্তর, তবে অন্য সমস্ত উত্তর পয়েন্টটি হারিয়েছে, যা হ'ল 2005 সালে নেট নেট .2 পর্যন্ত নেট থেকে জেনেরিকস ছিল না।

Stringমান ধরণের পরিবর্তে একটি রেফারেন্স টাইপ কারণ মাইক্রোসফ্টের পক্ষে নন-জেনেরিক সংগ্রহে যেমন স্ট্রিংগুলি সবচেয়ে কার্যকর উপায়ে সংরক্ষণ করা যেতে পারে তা নিশ্চিত করার জন্য এটি অত্যন্ত গুরুত্বপূর্ণ ছিল asSystem.Collections.ArrayList

নন-জেনেরিক সংগ্রহে একটি মান ধরণের সংরক্ষণের জন্য টাইপটিতে বিশেষ রূপান্তর প্রয়োজন objectযা বক্সিং নামে পরিচিত। সিএলআর যখন একটি মান প্রকারের বাক্স দেয়, তখন এটি মানটির অভ্যন্তরে wraেকে দেয়System.Object এবং এটি পরিচালিত হিপগুলিতে সঞ্চয় করে।

সংগ্রহ থেকে মানটি পড়ার জন্য বিপরীত ক্রিয়াকলাপ প্রয়োজন যা আনবক্সিং বলে।

বক্সিং এবং আনবক্সিং উভয়ই অ-উপেক্ষিত মূল্য রয়েছে: বক্সিংয়ের অতিরিক্ত বরাদ্দ প্রয়োজন, আনবক্সিংয়ের জন্য টাইপ চেকিং প্রয়োজন।

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

যদি জেনেরিকস প্রথম থেকেই বিদ্যমান থাকে তবে আমার ধারনা ছিল যে মানটির ধরণ হিসাবে স্ট্রিং থাকা সম্ভবত সহজ শব্দার্থবিজ্ঞান, আরও ভাল মেমরির ব্যবহার এবং আরও ভাল ক্যাশে লোকাল সহ আরও ভাল সমাধান হতে পারে। List<string>কেবলমাত্র একটি ছোট স্ট্রিং রয়েছে এমনটি মেমরির একক সংলগ্ন ব্লক হতে পারে।


আমার, এই উত্তরের জন্য ধন্যবাদ! আমি অন্যান্য সমস্ত জবাবগুলি হ্যাপ এবং স্ট্যাক বরাদ্দের বিষয়ে বলার দিকে তাকিয়ে দেখছি, যখন স্ট্যাক একটি বাস্তবায়ন বিশদ । সর্বোপরি, stringকেবল এর আকার এবং charযাইহোক অ্যারেতে একটি পয়েন্টার রয়েছে , সুতরাং এটি কোনও "বিশাল মান ধরণের" হবে না। তবে এই নকশার সিদ্ধান্তের জন্য এটি একটি সাধারণ, প্রাসঙ্গিক কারণ। ধন্যবাদ!
ভি0ल्डেক

8

কেবল স্ট্রিংই অপরিবর্তনীয় রেফারেন্স ধরণের নয়। মাল্টি-কাস্ট প্রতিনিধিরাও। এজন্য এটি লিখতে নিরাপদ

protected void OnMyEventHandler()
{
     delegate handler = this.MyEventHandler;
     if (null != handler)
     {
        handler(this, new EventArgs());
     }
}

আমি মনে করি যে স্ট্রিংগুলি অপরিবর্তনীয় কারণ এগুলি তাদের সাথে কাজ করার এবং মেমরির বরাদ্দের সবচেয়ে নিরাপদ পদ্ধতি। কেন তারা মান ধরণের নয়? পূর্ববর্তী লেখকরা স্ট্যাকের আকার ইত্যাদি সম্পর্কে সঠিক I আমি আরও যুক্ত করব যে আপনি যখন প্রোগ্রামে একই ধ্রুব স্ট্রিং ব্যবহার করেন তখন একটি রেফারেন্স টাইপগুলি সমাবেশের আকারে সংরক্ষণ করতে দেয়। আপনি যদি সংজ্ঞা দিন

string s1 = "my string";
//some code here
string s2 = "my string";

সম্ভাবনা হ'ল "আমার স্ট্রিং" ধ্রুবক উভয় দৃষ্টান্ত কেবল একবার আপনার সমাবেশে বরাদ্দ করা হবে।

আপনি যদি সাধারণ রেফারেন্স টাইপের মতো স্ট্রিং পরিচালনা করতে চান তবে স্ট্রিংটিকে একটি নতুন স্ট্রিংবিল্ডারের (স্ট্রিং) এর ভিতরে রাখুন। অথবা মেমোরি স্ট্রিম ব্যবহার করুন।

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


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

5
শেষ বিন্দু লিখেছেন: StringBuilder সাহায্যের যদি আপনি চেষ্টা করছেনা কেন পাস বৃহৎ স্ট্রিং (যেহেতু এটা আসলে যাহাই হউক না কেন একটি স্ট্রিং হিসাবে বাস্তবায়িত হয়) - StringBuilder জন্য দরকারী সাধিত একটি স্ট্রিং একাধিক বার।
মার্ক গ্র্যাভেল

আপনি কি ডেলিগেট হ্যান্ডলার বলতে চাচ্ছেন, হ্যাডলার নয়? (পিক হওয়ার জন্য দুঃখিত .. তবে এটি আমার জানা একটি সাধারণ নামের খুব কাছেই ....)
শুদ্ধ.ক্রোম

6

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

হয়তো জোন স্কিটি এখানে সাহায্য করতে পারে?


5

এটি মূলত একটি পারফরম্যান্স ইস্যু।

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

গভীরতার চেহারার জন্য। নেট ফ্রেমওয়ার্কে স্ট্রিংয়ের জন্য একটি দুর্দান্ত নিবন্ধটি দেখুন


3

খুব সাধারণ কথায় কোনও নির্দিষ্ট মানের একটি মানকে মান ধরণের হিসাবে গণ্য করা যেতে পারে।


এটি একটি মন্তব্য হওয়া উচিত
ρяσѕρєя কে

পিপিএল এর জন্য নতুন সি-তে বোঝা সহজ
লম্বা

2

আপনি কীভাবে বলতে পারেন stringএকটি রেফারেন্স টাইপ? আমি নিশ্চিত না যে এটি কীভাবে বাস্তবায়িত হয় তা গুরুত্ব দেয়। সি # তে স্ট্রিংগুলি যথাযথভাবে অপরিবর্তনীয় যাতে আপনার এই সমস্যাটি নিয়ে চিন্তা করতে না হয়।


এটি একটি রেফারেন্স টাইপ (আমি বিশ্বাস করি) কারণ এটি সিস্টেম থেকে পাওয়া যায় না System সিস্টেমের উপর এমএসডিএন মন্তব্য থেকে ভালু টাইপ V ভ্যালু টাইপ: ডেটা টাইপগুলি মান ধরণের এবং রেফারেন্স ধরণের মধ্যে পৃথক করা হয়। মান প্রকারগুলি হয় কাঠামোয় স্ট্যাক-বরাদ্দকৃত বা ইনলাইন বরাদ্দ করা হয়। রেফারেন্সের ধরণগুলি হ'ল বরাদ্দ।
ডেভি 8

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

মোড়কে চিহ্নিত করা হয়েছে যাতে সিস্টেমটি জানে যে এটিতে একটি মান ধরণের রয়েছে। এই প্রক্রিয়াটি বক্সিং হিসাবে পরিচিত, এবং বিপরীত প্রক্রিয়াটি আনবক্সিং হিসাবে পরিচিত। বক্সিং এবং আনবক্সিং কোনও প্রকারকে একটি অবজেক্ট হিসাবে বিবেচনা করার অনুমতি দেয়। (পূর্ববর্তী সাইটে সম্ভবত নিবন্ধটির সাথে লিঙ্ক করা উচিত ছিল))
ডেভি 8 ই

2

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

স্ট্রিংগুলি খুব ভাল কারণে অপরিবর্তনীয়, এটি একটি রেফারেন্স টাইপ হওয়ার সাথে কিছু করার নেই, তবে মেমরি পরিচালনার সাথে তার অনেক কিছুই করার আছে। স্ট্রিংয়ের আকারটি পরিবর্তিত ব্যবস্থার স্তূপের চারপাশে জিনিস স্থানান্তরিত করার চেয়ে স্ট্রিংয়ের আকার পরিবর্তন করার সময় এটি আরও কার্যকর more আমি মনে করি আপনি মান / রেফারেন্স ধরণের এবং অপরিবর্তনীয় অবজেক্ট কনসেপ্টগুলি একসাথে মিশ্রিত করছেন।

যতদূর "==": যেমন আপনি বলেছেন "==" অপারেটর ওভারলোড, এবং আবার স্ট্রিংগুলির সাথে কাজ করার সময় ফ্রেমওয়ার্কটি আরও কার্যকর করার জন্য এটি খুব ভাল কারণের জন্য বাস্তবায়িত হয়েছিল।


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

5
@ ওয়েবম্যাট্রিক্স, @ ডেভি 8: আদিম প্রকারগুলি (ইনট, ডাবল, বুল, ...) অপরিবর্তনীয়।
জেসন

1
@ জেসন, আমি ভেবেছিলাম অপরিবর্তনীয় শব্দটি বেশিরভাগ অবজেক্টগুলিতে (রেফারেন্সের ধরণের) ক্ষেত্রে প্রযোজ্য যা স্ট্রিংয়ের মান পরিবর্তন হওয়ার সাথে সাথে স্ট্রিংয়ের মতো পরিবর্তন হতে পারে না, অভ্যন্তরীণভাবে একটি স্ট্রিংয়ের একটি নতুন উদাহরণ তৈরি হয় এবং মূল বস্তু অপরিবর্তিত থাকে। এটি মান ধরণের ক্ষেত্রে কীভাবে প্রযোজ্য?
ওয়েবম্যাট্রিক্স

8
একরকম, "ইনট এন = 4; এন = 9;" এ, আপনার ধরণের পরিবর্তনশীল "স্থির" নয়, "স্থাবর" অর্থে; এটি যে 4 মানটি অপরিবর্তনীয়, এটি 9 এ পরিবর্তিত হয় না int আপনার int ভেরিয়েবল "n" এর প্রথমে 4 এর মান হয় এবং তারপরে একটি আলাদা মান 9 হয়; কিন্তু মানগুলি নিজেরাই অপরিবর্তনীয়। সত্যই, আমার কাছে এটি ডাব্লুটিএফএফ এর খুব কাছাকাছি।
ড্যানিয়েল দারানাস

1
+1 টি। আমি এই "স্ট্রিংগুলি মান ধরণের মতো" শুনে খুব অসুস্থ হয়ে পড়ে যখন সেগুলি সহজভাবে হয় না।
জন হান্না

1

স্ট্রিংস যেমন অক্ষরের অ্যারে দিয়ে তৈরি তেমন সহজ নয় n't আমি স্ট্রিংগুলিকে চরিত্রের অ্যারে হিসাবে দেখি []। অতএব এগুলি স্তূপে রয়েছে কারণ রেফারেন্স মেমরির অবস্থানটি স্ট্যাকের মধ্যে সংরক্ষণ করা হয় এবং স্তূপে অ্যারের মেমরির অবস্থানের শুরুতে নির্দেশ করে। স্ট্রিংয়ের আকারটি বরাদ্দের আগে জানা যায় না ... গাদা করার জন্য উপযুক্ত।

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


1
"স্ট্রিংয়ের আকারটি বরাদ্দের আগে জানা যায় না" - এটি সিএলআর-এ ভুল।
কোডকায়েজন

-1

আরও একটি রহস্যজনক ডাউন-ভোট পাওয়ার ঝুঁকিতে ... অনেকের মান ধরণের এবং আদিম ধরণের ক্ষেত্রে স্ট্যাক এবং মেমরির উল্লেখ রয়েছে কারণ তারা অবশ্যই মাইক্রোপ্রসেসরে একটি রেজিস্ট্রারে ফিট করতে পারেন। রেজিস্টারের চেয়ে আরও বেশি বিট লাগলে আপনি স্ট্যাকের কাছে / থেকে কোনও কিছুতে চাপ বা পপ করতে পারবেন না .... নির্দেশিকাগুলি হ'ল "পপ ই্যাক্স" - কারণ 32-বিট সিস্টেমে ইক্স 32 বিট প্রস্থে রয়েছে।

ফ্লোটিং-পয়েন্ট আদিম ধরণেরগুলি FPU দ্বারা পরিচালিত হয়, এটি 80 বিট প্রস্থ wide

আদিম ধরণের সংজ্ঞাটি অস্পষ্ট করার জন্য কোনও ওওপি ভাষা থাকার অনেক আগেই এই সিদ্ধান্ত নেওয়া হয়েছিল এবং আমি ধরে নিয়েছি যে মান টাইপ এমন একটি শব্দ যা বিশেষত ওওপি ভাষার জন্য তৈরি করা হয়েছে।

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