সি # তে স্ট্রিং এবং স্ট্রিংয়ের মধ্যে পার্থক্য কী?


6504

উদাহরণ ( কেসটি দ্রষ্টব্য ):

string s = "Hello world!";
String s = "Hello world!";

প্রতিটি ব্যবহারের জন্য গাইডলাইন কি? এবং পার্থক্য কি?


72
@ORMapper, কিন্তু আসলে দেহাবশেষ যে stringএকটি হল আভিধানিক সি # এর কনস্ট্রাক্ট ব্যাকরণ যেহেতু System.Stringশুধু একটি প্রকার। যে কোনও স্পষ্টে উল্লিখিত কোনও স্পষ্ট পার্থক্য নির্বিশেষে, এখনও এই স্পষ্ট পার্থক্য রয়েছে যা কিছুটা অস্পষ্টতার সাথে সমন্বিত হতে পারে। ভাষা নিজেই আবশ্যক সমর্থন stringএকটি উপায় বাস্তবায়ন নয় যে (বেশ) যাতে ছাত্রলীগের মধ্যে একটি নির্দিষ্ট বর্গ জন্য বিবেচনা করতে বাধ্য।
কার্ক ওল

106
@KirkWoll: ভাষা স্পেসিফিকেশন অনুযায়ী, নিজেই ভাষা আবশ্যক বিবেচনা stringছাত্রলীগের প্রকার ঠিক একই হতে System.String, অন্য কিছুই। এটি মোটেই অস্পষ্ট নয়। অবশ্যই, আপনি সি # ব্যাকরণটি ব্যবহার করে আপনার নিজের সংকলকটি প্রয়োগ করতে পারেন এবং সি # ভাষার স্পেসিফিকেশনের সাথে সংজ্ঞায়িত কোনওরকম স্বেচ্ছাসেবক কিছুর জন্য এর মতো পাওয়া টোকেনগুলির সমস্তটি ব্যবহার করতে পারেন। তবে, ফলস্বরূপ ভাষাটি কেবলমাত্র # সি বর্ণালি হবে, এটি সি # হিসাবে বিবেচনা করা যায় না।
অথবা ম্যাপার

88
আপনি stringসিস্টেমের জন্য ব্যবহার নির্দেশ ছাড়াই ব্যবহার করতে পারেন । আপনি এটি দিয়ে করতে পারবেন না String
উইলসু

14
আলগল এবং ফোর্টরান থেকে আসা কারও পক্ষে এই আলোচনাটিতে কিছু ভুল আছে তা দেখায় string। এটি সংক্ষিপ্তসার প্রয়োজন System.String, তবে, একটি নাম হিসাবে এটি বেশ ভালো লাগে তবে ঠিক একই জিনিস নয়। যদিও সি # এর বেশ কয়েক বছর পরে, আমি বলব, এটি কেবল ব্যবহার করা stringএবং string.Format()উদ্বেগ প্রকাশ করা নিরাপদ System.String
রোল্যান্ড

8
@ সংগীতা আপনি কি বলছেন? System.Stringবর্গ এখনও আছে, এবং stringশব্দ এখনও এটি জন্য একটি alias হয়। ঠিক যেমন System.Int32এবং int। তারা আক্ষরিক একই জিনিস।
ক্রেগ

উত্তর:


6102

stringসি # এর জন্য একটি উপনাম System.String
প্রযুক্তিগতভাবে, কোন পার্থক্য আছে। এটি int বনাম System.Int32

গাইডলাইন হিসাবে, সাধারণত stringআপনি কোনও অবজেক্টের উল্লেখ করছেন যে কোনও সময় এটি ব্যবহার করার পরামর্শ দেওয়া হয় ।

যেমন

string place = "world";

তেমনি, আমি মনে করি আপনার Stringযদি বিশেষভাবে শ্রেণিতে উল্লেখ করার প্রয়োজন হয় তবে এটি সাধারণত ব্যবহার করার পরামর্শ দেওয়া হয়।

যেমন

string greet = String.Format("Hello {0}!", place);

মাইক্রোসফ্ট এই স্টাইলটি তাদের উদাহরণগুলিতে ব্যবহার করতে ঝোঁক ।

এটি প্রদর্শিত হয় যে এই ক্ষেত্রে নির্দেশিকা পরিবর্তিত হতে পারে, যেহেতু স্টাইলকপ এখন সি # সুনির্দিষ্ট এলিয়াসের ব্যবহার প্রয়োগ করে।


163
আপনি যদি স্টাইলকপ ব্যবহার করার সিদ্ধান্ত নেন এবং তা অনুসরণ করেন, তবে এটি ভাষার নির্দিষ্ট ধরণের ব্যবহার করতে বলবে। সুতরাং সি # এর জন্য আপনার স্ট্রিং থাকবে (স্ট্রিংয়ের পরিবর্তে), ইনট (ইন্টার 32 এর পরিবর্তে), ফ্লোট (একক পরিবর্তে) - স্টাইলোকপ.সায়ুয
ডমিনিক জুউইউইকিজে

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

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

32
আমি এর মাধ্যমে পড়েছি আমি লক্ষ্য করেছি যে বেশ কয়েকটি মন্তব্য কেবল ভুল। @ ডিআরএআরআই 1 সময়মতো, আপনি দেখতে পাবেন যে পুরানো পথটি এখনও সবচেয়ে ভাল, যদি আপনি সন্দেহ করেন তবে আমি ভিজুয়াল স্টুডিওটি ব্যবহার না করেই সি # কোড লেখার চেষ্টা করার সাহস করি। এটি কার্যত অসম্ভব এবং এমন একটি পরিস্থিতি যা ওয়েব বিকাশের কাজে সময়ে সময়ে আসে। @ ভ্ল্যাড আপনার স্ট্রিং ব্যবহার করার জন্য কিছু আমদানি করার দরকার নেই। @ আপনার মন্তব্যটি অর্থহীন এবং সমানভাবে সত্য string.Format()। @ KlitosG না, এটি সত্য নয়। তারা সবাই ঠিক একই রকম কাজ করে।
kroe2

46
আপনি কি একটি মন্তব্য যোগ করতে পারেন যে আসলে একটি পার্থক্য আছে? উদাহরণস্বরূপ: nameof(string)যেখানে nameof(String)হবে তা সংকলন করবে না ।
জেরোইন ভেনেভেল

3439

কেবলমাত্র সম্পূর্ণতার জন্য, এখানে সম্পর্কিত তথ্যের মস্তিষ্কের ডাম্প ...

অন্যরা stringযেমন উল্লেখ করেছে, এটির জন্য একটি উপনাম System.String। এগুলি একই কোডে সংকলন করে, তাই কার্যকর করার সময় কোনও পার্থক্য নেই। এটি সি # এর এলিয়াসগুলির মধ্যে একটি মাত্র। সম্পূর্ণ তালিকাটি হ'ল:

object:  System.Object
string:  System.String
bool:    System.Boolean
byte:    System.Byte
sbyte:   System.SByte
short:   System.Int16
ushort:  System.UInt16
int:     System.Int32
uint:    System.UInt32
long:    System.Int64
ulong:   System.UInt64
float:   System.Single
double:  System.Double
decimal: System.Decimal
char:    System.Char

stringএবং বাদে object, এলিয়াসগুলি সমস্ত মান ধরণের। decimalএকটি মান ধরণের, তবে সিএলআর-তে আদিম ধরণের নয়। শুধুমাত্র আদিম টাইপ যা একটি ওরফে থাকে না System.IntPtr

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

সেখানে এক পরিস্থিতিতে যা তুমি আছে যখন স্পষ্টভাবে একটি enum এর অন্তর্নিহিত প্রকার উল্লেখ: alias লেখা ব্যবহার করতে। এই ক্ষেত্রে:

public enum Foo : UInt32 {} // Invalid
public enum Bar : uint   {} // Valid

এই ভাবে ব্যাপার বৈশিষ্ট সংজ্ঞায়িত enum ঘোষণা নেই - কোলন পরে অংশ হতে হয়েছে অবিচ্ছেদ্য-টাইপ উৎপাদন, যার মধ্যে একটি টোকেন হয় sbyte, byte, short, ushort, int, uint, long, ulong, char... একটি উল্টোদিকে টাইপ হিসাবে উৎপাদন উদাহরণস্বরূপ পরিবর্তনশীল ঘোষণা দ্বারা ব্যবহৃত। এটি অন্য কোনও পার্থক্য নির্দেশ করে না।

শেষ অবধি, যখন কোনটি ব্যবহার করা উচিত: ব্যক্তিগতভাবে আমি প্রয়োগের জন্য সর্বত্র উপনামগুলি ব্যবহার করি, তবে কোনও এপিআইয়ের জন্য সিএলআর টাইপ করি। আপনি বাস্তবায়নের ক্ষেত্রে যা ব্যবহার করেন তা সত্যিই গুরুত্বপূর্ণ নয় - আপনার দলের মধ্যে ধারাবাহিকতাটি দুর্দান্ত, তবে অন্য কারও নজর নেই। অন্যদিকে, এটি সত্যই গুরুত্বপূর্ণ যে আপনি যদি কোনও এপিআই-তে কোনও প্রকার উল্লেখ করেন, আপনি ভাষা-নিরপেক্ষ উপায়ে এটি করেন। নামক পদ্ধতিটি ReadInt32দ্ব্যর্থহীন, অন্যদিকে একটি পদ্ধতির ReadIntব্যাখ্যা প্রয়োজন। কলার এমন একটি ভাষা ব্যবহার করতে পারেন যা উদাহরণস্বরূপ একটি intউপনাম সংজ্ঞায়িত করে Int16। .NET Framework ডিজাইনার এই প্যাটার্ন অনুসরণ করেছেন, ভাল উদাহরণ হচ্ছে BitConverter, BinaryReaderএবং Convertক্লাস।


82
এনাম সহ উত্তরাধিকার পরিস্থিতি আকর্ষণীয়। আপনি ডকুমেন্টেশনের দিকে ইঙ্গিত করতে পারেন কেন এলিফটি গণনার জন্য ব্যবহার করা উচিত? নাকি এটি জানা বাগ?
জারেডপাড়

149
এটি অনুমানের 14.1 অনুচ্ছেদে রয়েছে (এটি খুব দীর্ঘ হওয়ায় আমি এখানে সহজে উদ্ধৃতি দিতে পারি না)। এটা তোলে স্পষ্টভাবে বলতে যে আপনি ওরফে ব্যবহার পেয়েছেন, কিন্তু alias লেখা হয় সাজানোর তাদের নিজস্ব ধরনের হিসাবে গণ্য। সব কিছু অদ্ভুত।
জন স্কিটি

32
@ পিপীপ কী বিশাল সংখ্যক উর্ধ্বগামীদের চেয়ে অবাক করে দেওয়ার মতো তা হ'ল ডাউনভোটের অচল স্বল্প পরিমাণ (শীর্ষস্থানীয় ৫ টি পোস্টে সর্বমোট ২০০০ এরও বেশি উর্ধ্বতন রয়েছে, এবং তাদের সবার মধ্যে মাত্র ১ জন ডাউনওয়েট রয়েছে)। বিশেষত আপনি যখন কোনও জনগোষ্ঠীর সর্বদা "বিদ্বেষী" ধারণাটি অনুভূত করেন, আমি সত্যিই এটি অবিশ্বাস্য মনে করি।
corsiKa

40
মধ্যে একটি আকর্ষণীয় পার্থক্য stringএবং Stringযে string' is a keyword in c#, so you can not use it as a variable name.For Ex: স্ট্রিং স্ট্রিং = "হাই"; //compiler error, but স্ট্রিং স্ট্রিং = "হাই"; acceptable গ্রহণযোগ্য, যেমন Stringএকটি আইডিয়ায়ার কোনও কীওয়ার্ড নয়।
সঞ্জীব রাই

33
@ সঞ্জীবভাই: হ্যাঁ আপনি @stringসনাক্তকারী তৈরি করতে ব্যবহার করতে পারেন যা শেষ পর্যন্ত string। এটি একরকম পালানোর ব্যবস্থা।
জন স্কিটি

715

Stringএর জন্য দাঁড়িয়েছে System.Stringএবং এটি একটি। নেট ফ্রেমওয়ার্ক টাইপ। stringএর জন্য সি # ভাষার একটি উপনামSystem.String । উভয়ই System.Stringআইএল (মধ্যবর্তী ভাষা) তে সংকলিত হয়েছে , তাই কোনও পার্থক্য নেই। আপনার পছন্দগুলি চয়ন করুন এবং এটি ব্যবহার করুন। আপনি যদি সি # তে কোড করেন তবে আমি stringএটি পছন্দ করবো যে এটি একটি সি # টাইপ উপন্যাস এবং সি # প্রোগ্রামারদের দ্বারা সুপরিচিত।

আমি ( int, System.Int32) ইত্যাদি সম্পর্কে একই বলতে পারি ..


3
C আপনি যদি সি # তে কোড করেন তবে আমি স্ট্রিংটি পছন্দ করবো কারণ এটি একটি সি # টাইপ উপন্যাস এবং সি # প্রোগ্রামারদের দ্বারা সুপরিচিত - যখন কোনও সি # ব্যক্তি নট ফ্রেমওয়ার্কটি জানেন না। +1 হিসাবে আমি সাধারণত মনে করি এটি সেরা উত্তর, তবে আমি যে পয়েন্টটি উল্লেখ করেছি তা বিজোড় বলে মনে হচ্ছে।
MyDaftQuestions

4
আমি ব্যক্তিগতভাবে "Int32" ব্যবহার পছন্দ করি, কারণ এটি অবিলম্বে মানের সীমাটি দেখায়। তারা যদি পরবর্তী উচ্চ-বিট সিস্টেমে "int" প্রকারটি আপগ্রেড করে থাকে তা কল্পনা করুন। সি-তে 'ইনট' স্পষ্টতই দেখা যায় যে "পূর্ণসংখ্যা টাইপ হিসাবে লক্ষ্য প্রসেসরটি সবচেয়ে দক্ষতার সাথে কাজ করে" এবং "কমপক্ষে 16 বিট" হিসাবে সংজ্ঞায়িত হয়। আমি সেখানে অনুমানযোগ্য ধারাবাহিকতা পছন্দ করব, আপনাকে অনেক ধন্যবাদ thank
নায়ারগডস

2
নিবন্ধন করুন যদি কিছু হয় তবে ধারাবাহিকভাবে। নেট প্রকারগুলি ব্যবহার করা বোধগম্য হবে কারণ তারা ভাষা অজ্ঞ এবং প্রকারটি স্পষ্টতই, যে কোনও ভাষার চেয়ে স্বতন্ত্র (আমি কি F # 's বা ভিবি'র আইডিসিঙ্ক্রেসিগুলি সবই জানি?)।
পিটার - মনিকা

5
@ নাইয়ারগডস এটি সম্পর্কে উদ্বিগ্ন না হওয়ার দুটি কারণ রয়েছে। একটি হ'ল intহার্ডওয়ার নির্বিশেষে 32 বিট পূর্ণসংখ্যার হিসাবে সি # ল্যাঙ্গুয়েজ স্পেসে সংজ্ঞায়িত। সি #, সময়ের মিস্টের অংশীদারিত্বের পরেও আসলে সি নয়, 64৪ intবিটের পূর্ণসংখ্যার সাথে পরিবর্তন করা স্পেসিফিকেশন এবং ভাষার একটি পরিবর্তনীয় পরিবর্তন হতে পারে। এছাড়া redefining করতে হবে long, যেমন longবর্তমানে 64 বিট পূর্ণসংখ্যা। চিন্তার কারণ না হওয়ার অন্য কারণটি অপ্রাসঙ্গিক কারণ প্রকারগুলি কখনই পরিবর্তিত হবে না, তবে। নেট কেবলমাত্র বিমূর্ত বিষয় যে 99% সময় আপনাকে কোনওভাবেই ভাবতে হবে না। ;-)
ক্রেগ

5
আমি বৃদ্ধ মালিকানা খেলা ফরম্যাটের প্রচুর মধ্যে খনন @Craig যেখানে আমি না সব সময় সম্পর্কে চিন্তা করতে হবে, যদিও। এবং তারপর ব্যবহার Int16, Int32এবং Int64একটি হয় অনেক বরং nondescriptive ব্যবহার না করে কোডে আরও স্বচ্ছ short, intএবংlong
Nyerguds

504

সি # তে প্রদত্ত প্রকারের এলিয়াসগুলি ব্যবহার করার বিষয়ে আমি সবচেয়ে ভাল উত্তরটি শুনেছি জেফ্রি রিখর তাঁর সিএলআর মাধ্যমে সি # বইতে এসেছেন । এখানে তার 3 কারণ রয়েছে:

  • আমি বেশ কয়েকটি বিকাশকারীকে বিভ্রান্ত দেখেছি, তাদের কোডটিতে স্ট্রিং বা স্ট্রিং ব্যবহার করবেন কিনা তা জেনেও না । কারণ সি # স্ট্রিংয়ে (একটি কীওয়ার্ড) হুবহু System.String (একটি এফসিএল টাইপ) এর মানচিত্র, কোনও পার্থক্য নেই এবং হয় ব্যবহার করা যেতে পারে।
  • C #, দীর্ঘ মানচিত্র System.Int64 , কিন্তু একটি ভিন্ন প্রোগ্রামিং ভাষাতে, দীর্ঘ একটি ম্যাপ পারে Int16 বা Int32 । প্রকৃতপক্ষে, সি ++ / সিএলআই প্রকৃতপক্ষে একটি ইন্টার 32 হিসাবে বিবেচনা করে । কেউ যদি কোনও ভাষায় সোর্স কোড পড়েন তবে সহজেই কোডের উদ্দেশ্যটির ভুল ব্যাখ্যা করতে পারে যদি সে বা সে কোনও ভিন্ন প্রোগ্রামিং ভাষায় প্রোগ্রামিংয়ের অভ্যস্ত ছিল। আসলে, বেশিরভাগ ভাষা এমনকি কীওয়ার্ড হিসাবে দীর্ঘ ব্যবহার করে না এবং এটি ব্যবহার করে এমন কোডটি সংকলন করে না।
  • এফসিএল এর অনেকগুলি পদ্ধতি রয়েছে যেগুলির পদ্ধতির নামের অংশ হিসাবে নাম টাইপ রয়েছে। উদাহরণস্বরূপ, BinaryReader যেমন টাইপ অফার পদ্ধতি ReadBoolean , ReadInt32 , ReadSingle , ইত্যাদি, এবং System.Convert যেমন টাইপ অফার পদ্ধতি ToBoolean , ToInt32 , ToSingle , ইত্যাদি। যদিও নিম্নলিখিত কোডটি লেখা বৈধ, তবুও লাইনটি আমার কাছে খুব অপ্রাকৃত মনে হয় এবং লাইনটি সঠিক কিনা তা স্পষ্ট নয়:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

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


24
দ্বিতীয় বিন্দু আসলে একটি কারণ মত শোনাচ্ছে না ব্যবহার string, intইত্যাদি
MauganRa

15
@ মৌগানরা এবং এটি অনুমান করা যায় যে বইয়ের লেখক সে কারণগুলি কেন তিনি এলিয়াস ব্যবহার করেন না তা তালিকাভুক্ত করে ।
tomi.lee.jones

31
"যদি কেউ সি # উত্স কোড পড়ছেন তবে তাদের ভাষাগুলি অনুসারে লম্বা ব্যাখ্যা করা উচিত, অন্য কোনও ভাষার অনুমান অনুযায়ী নয়" " বিষয়টি পুরোপুরি মিস করে। এটি কোড নয় যে কেউ কোডের ভুল ব্যাখ্যা করতে চায় , যখন কোনও প্রকারের অন্য প্রসঙ্গে একটি প্রাত্যহিক ভিত্তিতে প্রোগ্রামার যা দেখায় তার চেয়ে আলাদা কোনও অর্থ থাকে তখন কোনও মস্তিষ্কের পক্ষে ভুল উপসংহারে ঝাঁপানো সহজ। আমরা সবাই ভুল করি; সুস্পষ্টভাবে নামযুক্ত প্রকারগুলি ব্যবহার করা হলে সেই ভুলগুলি কম সম্ভাবনা হয়।
ড্যারিল

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

8
@ জিনজাই প্রশ্নটি সি # সম্পর্কে, যেখানে longপ্ল্যাটফর্ম বা সংকলক নির্বিশেষে একটি স্বাক্ষরিত -৪ -বিট পূর্ণসংখ্যা হিসাবে সংজ্ঞায়িত করা হয়েছে। অন্তত কিছু ক্ষেত্রে তো, হ্যাঁ, এটা নেই ভাষার উপর নির্ভর করে।
ফগ

455

stringএকটি সংরক্ষিত শব্দ, তবে Stringএটি কেবল একটি শ্রেণীর নাম। এর অর্থ এটি stringনিজের দ্বারা চলক নাম হিসাবে ব্যবহার করা যাবে না।

যদি কোনও কারণে আপনি স্ট্রিং নামে একটি পরিবর্তনশীল চান, তবে আপনি এই সংকলনগুলির মধ্যে কেবল প্রথমটি দেখতে পাবেন:

StringBuilder String = new StringBuilder();  // compiles
StringBuilder string = new StringBuilder();  // doesn't compile 

আপনি যদি সত্যিই স্ট্রিং নামে একটি পরিবর্তনশীল নাম চান তবে আপনি @উপসর্গ হিসাবে ব্যবহার করতে পারেন :

StringBuilder @string = new StringBuilder();

আর একটি গুরুত্বপূর্ণ পার্থক্য: স্ট্যাক ওভারফ্লো তাদের আলাদাভাবে হাইলাইট করে।


20
মনে রাখবেন যে কোনও স্থানীয়কে কল @stringকরা সত্যই অর্থহীন, কারণ স্থানীয়দের নাম কেবল পিডিবিতে উপস্থিত রয়েছে। পাশাপাশি এটি _stringবা কিছু কল করতে পারে। প্রতিবিম্বের মাধ্যমে নামগুলিতে অ্যাক্সেসযোগ্য এমন জিনিসগুলির পক্ষে এটি আরও অর্থবোধ করে, যেখানে কোনও @stringসদস্যের নাম থাকবে "string"
রোমান স্টারকভ

25
ভেরিয়েবলের নাম হিসাবে কোনও সংরক্ষিত শব্দটি ব্যবহার করা মোটামুটি অপ্রয়োজনীয় মনে রাখবেন।
এলটন

7
ওপি পরিবর্তনশীল নাম হিসাবে স্ট্রিং বা স্ট্রিং ব্যবহার করতে চায় না। তারা এই প্রকারের মধ্যে পার্থক্যের ব্যাখ্যা চেয়েছিল । আপনার উত্তরটি কেবল আরও বিভ্রান্তি যুক্ত করতে পারে IMO
ম্যাট উইলকো

1
@ ক্রেইগ আপনি যদি লোকদের গিঁট বাঁধতে শেখাতে সফ্টওয়্যার লিখতেন?
সাইমন_উইভার

5
@ সিমন_উইভার তারে গিলে? হাহা সুন্দর. :-) অবশ্যই, আপনি থ্রেডের মতো বিকল্প নাম বেছে নিতে পারেন। এক মিনিট অপেক্ষা করুন ... আহ!
ক্রেগ

391

একটি পার্থক্য আছে - আপনি আগে Stringছাড়া ব্যবহার করতে পারবেন না using System;


14
ডিফল্টরূপে বেশিরভাগ লোক এটিকে ফাইলের শীর্ষে কোনও উপায়ে যুক্ত করে। ভিএস ডিফল্টরূপে এটি করে না বেশিরভাগ ক্ষেত্রে!
ইব্রার মমতাজ

9
ডিফল্টরূপে আমি কেবলমাত্র usingআমার প্রয়োজনীয় বিবৃতিগুলি যুক্ত করি এবং স্পষ্টভাবে আমি যা কিছু করি না তা সরিয়ে ফেলি। পাওয়ার প্রোডাকটিভিটি সরঞ্জাম> "[X] কে সরাবে এবং বিন্যাস সংরক্ষণ উপর Usings"
JMD

2
@ জেএমডি আমি .cs টেম্পলেট ফাইলটি সংশোধন করেছি যাতে এটি শীর্ষে কোনও ব্যবহারের বিবৃতিও না পায়! আমি ক্লাসের টেম্পলেটটিও পরিবর্তন করেছিলাম internal sealed
এরিক

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

এটি সি # এর ক্ষেত্রেও হতে পারে তবে সমস্ত নেট নেট ভাষা নয়। (
পাওয়ারশেল

311

এটি উপরে আচ্ছাদিত করা হয়েছে; তবে, আপনি stringপ্রতিবিম্ব ব্যবহার করতে পারবেন না ; আপনি ব্যবহার করা আবশ্যক String


6
এই উত্তরটির অর্থ কী এবং কেন এটি অগ্রাহ্য হয়েছিল তা আমি বুঝতে পারি না। আপনি typeof(string)প্রতিবিম্ব ব্যবহার করতে পারেন । উদাহরণ এক: if (someMethodInfo.ReturnType == typeof(string)) { ... }উদাহরণ দুটি: var p = typeof(string).GetProperty("FirstChar", BindingFlags.NonPublic | BindingFlags.Instance);এটি আপনাকে কোথায় ব্যবহার করা উচিত String, তা নয় string? আপনি Type.GetType("String")বা এর মতো জিনিসগুলি চেষ্টা Type.GetType("string")করে দেখলে ক্লাসটি খুঁজে পাবেন না কারণ নামস্থানটি অনুপস্থিত missing যদি কোনও নির্লজ্জ কারণে আপনি .Nameকোনও প্রকারের সাথে "string"কেস-সংবেদনশীল উপায়ে তুলনা করেন তবে আপনি ঠিক বলেছেন।
জেপ্পে স্টিগ নীলসন

256

System.String.NET স্ট্রিং ক্লাস - সি # stringএ একটি উপাধি System.String- সুতরাং ব্যবহারের ক্ষেত্রে সেগুলি একই।

নির্দেশিকাগুলি হিসাবে আমি খুব বেশি ঝাঁঝরা হয়ে পড়ব না এবং আপনি যা মনে করেন কেবল তা ব্যবহার করুন - জীবনের আরও গুরুত্বপূর্ণ জিনিস রয়েছে এবং কোড যাইহোক একই রকম হতে চলেছে।

আপনি পূর্ণসংখ্যার আপনি ব্যবহার করছেন আকার নির্দিষ্ট করার বিল্ডিং সিস্টেম যেখানে এটা প্রয়োজনীয় নিজেদের খুঁজে পেতে এবং তাই ব্যবহারের প্রবণতা যদি Int16, Int32, UInt16, UInt32ইত্যাদি তারপর এটি আরও স্বাভাবিক ব্যবহার করতে চেহারা হতে পারে String- এবং এটা হতে পারে যখন বিভিন্ন .net ভাষার মধ্যে চলন্ত কাছাকাছি জিনিসগুলিকে আরও বোধগম্য করে তুলুন - অন্যথায় আমি স্ট্রিং এবং ইনট ব্যবহার করব।


2
কেবল একটি বাছাই করুন এবং ধারাবাহিক হবেন। আপনি যদি বাড়ির স্টাইল দিয়ে কোথাও কাজ করেন তবে এটি ব্যবহার করুন।
অ্যালান বি

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

এটি অবশ্যই একটি পছন্দসই জিনিস; উদাহরণস্বরূপ: আমি ব্যবহার করতে পছন্দ short, int, ushort, uintপরিবর্তে Int16, ইত্যাদি কারণ বেশিরভাগ আমি শিখেছি কিভাবে হয়। মঞ্জুর, Int16কম অভিজ্ঞতা যাদের জন্য তাত্ক্ষণিকভাবে বোঝা সহজ। আমার কাছ থেকে +1!
এমা 19

210

আমি .NETফরম্যাটিং কারণে মূলধনযুক্ত ধরণের (উপকরণের পরিবর্তে) পছন্দ করি । .NETধরনের অন্যান্য বস্তুর ধরনের (মান ধরনের সব পরে, সঠিক বস্তু) হিসাবে একই রঙ্গিন হয়।

শর্তাধীন এবং নিয়ন্ত্রণের কীওয়ার্ডগুলি (যেমন if, switchএবং return) ছোট হাতের রঙ এবং গা colored় নীল (ডিফল্টরূপে)। এবং আমি বরং ব্যবহার এবং বিন্যাসে মতবিরোধ হবে না।

বিবেচনা:

String someString; 
string anotherString; 

11
আপনি কি এই জাতীয় কোডও লিখেছেন: Int32 i = 1; ইন্ট আই = 1 এর চেয়ে; ? স্ট্রিং ওরফে যখন এটি উপলব্ধ হয় তখন এটি ব্যবহার না করতে অসঙ্গত বলে মনে হয়।
বাইটেডেভ

29
@nashwan: ব্যবহার আসলে, হ্যাঁ, আমি কি Int32 i=1;এর intstead int i = 1; আমি সাবেক আমার অভিপ্রায় হিসেবে আরো পাঠযোগ্য হতে খুঁজে পেয়েছেন: যথা যে আমি একটি 32 বিট পূর্ণসংখ্যা স্বাক্ষরিত চাই।
নোটমি

5
আমি মনে করি এগুলি সবই নির্ভর করে যে বিকাশকারীরা মনে করে তারা সি # কোড (স্ট্রিং) বা। নেট কোড (স্ট্রিং) লিখছে whether ব্যক্তিগতভাবে আমি মনে করি আমি সি # লিখছি (এবং এটি সি # যা। নেট ব্যবহার করছে)।
বাইটেডেভ

7
@ অ্যালেক্স: আমার বক্তব্যটি কেবল এটাই ছিল যে আমি অস্পষ্টতা অপসারণ করতে আমার কোডিংয়ে খুব নির্দিষ্ট হতে পছন্দ করি।
নোটমি

22
বর্ণালীটির নিখুঁত অন্য প্রান্তে, আমি প্রায় সর্বদা কেবল ব্যবহার করিvar
টিক

192

stringএবং Stringসমস্ত উপায়ে অভিন্ন (বড় হাতের অক্ষর "এস" বাদে)। কোনওভাবেই কার্য সম্পাদনের কোনও প্রভাব নেই।

stringসিনট্যাক্স হাইলাইটের কারণে বেশিরভাগ প্রকল্পে লোয়ারকেস পছন্দ করা হয়


জেফ্রি রিখার এখানে ঠিক যে ধরনের বিভ্রান্তি ঘটছে তা এড়াতে সব ক্ষেত্রে সিএলআর টাইপ (সি # এর মাধ্যমে সি #) ব্যবহার করার পরামর্শ দিয়েছেন।
জোশ

স্পষ্টতই, আপনি এস বা এস ব্যবহার করেন না কেন তা এই প্রশ্নগুলির কারণ হতে পারে, তাই ডাউন-ভোট রিচার। ;)
ব্র্যাড উইলসন

রিখটার বলতে বোঝায় যে স্ট্রিংয়ের বিকল্প হওয়া উচিত ছিল না - মাইক্রোসফ্টের ভাষায় এটি থাকা উচিত নয়। আপনি রিচারকে ডাউন-ভোট দিতে পারবেন না - তিনি কিংবদন্তি! :)
জো র্যাটার

1
আমি সম্মত এটি পারে মঙ্গলজনক এ সব alias লেখা নেই হয়। তবে আমাদের কাছে সেগুলি দেওয়া আছে বলে আমি মনে করি এগুলি ব্যবহার করা ভাল (তবে পদ্ধতিতে নাম নয়)
জন স্কিটি

10
"স্ট্রিং" "স্ট্রিং" এর মতো নয়। এর অর্থ "সিস্টেম.স্ট্রিং"। সুতরাং আপনি যদি "স্ট্রিং" ব্যবহার করেন তবে নাম স্থান অন্তর্ভুক্ত করতে আপনাকে "সিস্টেম ব্যবহার করে" রাখতে হবে
থিয়াগোআলভস

185

সি # একটি ভাষা যা সিএলআরের সাথে একত্রে ব্যবহৃত হয়।

string সি # তে টাইপ।

System.String সিএলআর-এ এক প্রকার।

আপনি যখন সিএলআরের সাথে সি # একসাথে ব্যবহার করবেন তখন এতে stringম্যাপ করা হবে System.String

তাত্ত্বিকভাবে, আপনি একটি সি #-কম্পাইলার প্রয়োগ করতে পারেন যা জাভা বাইটকোড তৈরি করেছিল। এই কম্পাইলার একটি যুক্তিসম্মত বাস্তবায়ন সম্ভবত ম্যাপ হবে stringথেকে java.lang.Stringঅর্ডার জাভা রানটাইম লাইব্রেরির সাথে interoperate হবে।


1
stringসি # তে টাইপ নয় ; এটি একটি সংরক্ষিত শব্দ যা সিএলআর-এ টাইপ করে।
সিজারগন

@ সিজারগন: ইসিএমএ -৩৩৪ অনুসারে, বিভাগ ৮.২.১: "সি # পূর্বনির্ধারিত ধরণের একটি সেট সরবরাহ করে [...] পূর্বনির্ধারিত রেফারেন্স প্রকারগুলি অবজেক্ট এবং স্ট্রিং।"
রাসমাস ফ্যাবার

10
ইসিএমএ -৩৩৪ অনুসারে, বিভাগ 9.4.3, "স্ট্রিং" একটি কীওয়ার্ড। :-) আমি আপনার সাথে একমত যে "স্ট্রিং" হ'ল এক ধরণের শব্দ আপনি যদি শব্দার্থবিজ্ঞানের দিকে মনোনিবেশ করেন তবে আপনি যদি বাক্য গঠনতে মনোনিবেশ করেন তবে আমি এটি একটি কীওয়ার্ড (অর্থাত্ একটি সংরক্ষিত শব্দ) বলব। মান উভয় দৃষ্টিকোণকে সমর্থন করে (সম্ভবত খুব দ্ব্যর্থহীনভাবে!)। আমার কাছে, ওপি সিনট্যাক্স সম্পর্কে, সুতরাং আমি যখন উত্তরগুলি দেখি তখন সিনট্যাক্সের দিকে মনোনিবেশ করি, তবে আমি আপনার বক্তব্যটিও দেখি। তদুপরি, আপনার উত্তরটি যেমন দাঁড়িয়েছে, তার অর্থ ব্যাখ্যা করা যেতে পারে যে দুটি ভিন্ন ধরণের উপস্থিত রয়েছে: স্ট্রিং এবং স্ট্রিং, যখন এটি হয় না is একটি অন্যটির সাথে ম্যাপিং।
সিজারগন

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

168

এই ইউটিউব ভিডিওটি ব্যবহারিকভাবে প্রদর্শন করে যে কীভাবে তারা আলাদা।

তবে এখন একটি দীর্ঘ পাঠ্য উত্তরের জন্য।

যখন আমরা .NETদুটি আলাদা জিনিস সম্পর্কে কথা বলি তখন একটি .NETকাঠামো থাকে এবং অন্যটি ভাষা ( C#, VB.NETইত্যাদি) থাকে যা সেই কাঠামোটি ব্যবহার করে।

এখানে চিত্র বর্ণনা লিখুন

" System.String" ওরফে "স্ট্রিং" (মূলধন "এস") একটি .NETকাঠামোর ডেটা ধরণের এবং "স্ট্রিং" একটি C#ডেটা টাইপ।

এখানে চিত্র বর্ণনা লিখুন

সংক্ষেপে "স্ট্রিং" হ'ল "স্ট্রিং" এর একটি উপনাম (একই নামেই বিভিন্ন নামে ডাকা হয়)। সুতরাং প্রযুক্তিগতভাবে নীচের কোড বিবৃতি উভয় একই আউটপুট দেবে।

String s = "I am String";

অথবা

string s = "I am String";

একইভাবে নীচে প্রদর্শিত অন্যান্য সি # ডেটা টাইপের জন্য উপকরণ রয়েছে:

বস্তু: System.Objectস্ট্রিং: System.String, bool,: System.Boolean, বাইট: System.Byte, sbyte: System.SByte, সংক্ষিপ্ত: System.Int16ইত্যাদি

প্রোগ্রামার দৃষ্টিকোণ থেকে এখন মিলিয়ন ডলার প্রশ্ন তাই "স্ট্রিং" এবং "স্ট্রিং" কখন ব্যবহার করবেন?

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

নীচের কোডে বাম হাতটি একটি পরিবর্তনশীল ঘোষণা এবং এটি "স্ট্রিং" ব্যবহার করে ঘোষণা করে। ডানদিকে আমরা একটি পদ্ধতি কল করছি যাতে "স্ট্রিং" আরও বুদ্ধিমান হয়।

string s = String.ToUpper() ;

25
"সংক্ষেপে" স্ট্রিং "হ'ল" স্ট্রিং "এর একটি উপন্যাস (একই নামেই বিভিন্ন নামে ডাকা হয়)। এটি সঠিক নয়: উপনামটি "স্ট্রিং"।
জাভিয়ার এজিয়া

3
আপনি যখন পরিবর্তনশীল ঘোষণা করেন তখন "স্ট্রিং" (ছোট "গুলি") ব্যবহার করা ভাল এবং যখন আপনি এটি শ্রেণীর নাম হিসাবে ব্যবহার করছেন তখন "স্ট্রিং" (মূলধন "এস") পছন্দ করা হয়। এই কনভেনশনটি আর বৈধ বলে মনে হচ্ছে না: আপনি যদি ভিজ্যুয়াল স্টুডিও 2015 ব্যবহার করেন এবং Stringএটি লেখার চেষ্টা করেন তবে আপনাকে "আপনার কোড সহজীকরণ" করার পরামর্শ দিচ্ছেন, এটি চালিয়ে যাওয়ার জন্য string...
ম্যাসিমিলিয়ানো ক্রাউস

165

লোয়ার কেস stringএকটি উপনাম System.String। তারা একই হয় C#

সেখানে কিনা তবে আপনি সিস্টেম প্রকার (ব্যবহার করা উচিত উপর একটি বিতর্ক আছে System.Int32, System.Stringইত্যাদি) ধরনের বা C# aliases( int, stringইত্যাদি)। আমি ব্যক্তিগতভাবে বিশ্বাস করি আপনার ব্যবহার করা উচিত C# aliasesতবে এটি কেবল আমার ব্যক্তিগত পছন্দ।


4
সমস্যাটি, তারা 'সি #' উপকরণ নয়, তারা 'সি' উপাধি i সি # ভাষায় নেটিভ 'স্ট্রিং' বা 'ইনট' নেই, কেবল সিনট্যাকটিক সুগার।
Quarkly

16
"সি" কোথা থেকে এসেছে তা নিশ্চিত নয়, যেহেতু সি # 5 ভাষার স্পেসিফিকেশনটি পড়ে "কীওয়ার্ড স্ট্রিংটি কেবল পূর্বনির্ধারিত শ্রেণির সিস্টেমের জন্য একটি উপনাম। স্ট্রিং" " 85 পৃষ্ঠায়, অনুচ্ছেদ 4.2.4। সমস্ত উচ্চ স্তরের ভাষা সিপিইউ নির্দেশিকা সেট এবং বাইকোডের ওপরে সিনট্যাকটিক চিনি।
এওডিন্টসভ

156

stringশুধুমাত্র একটি উপনাম System.String। সংকলক তাদের সাথে অভিন্ন আচরণ করবে।

একমাত্র ব্যবহারিক পার্থক্যটি হ'ল সিন্ট্যাক্স হাইলাইটিং আপনি যেমন উল্লেখ করেছেন এবং using Systemআপনি ব্যবহার করতে গেলে আপনাকে লিখতে হবে String


স্ট্রিং ব্যবহার করার জন্য আপনার সিস্টেমের উপসর্গের দরকার নেই।
জো রাত্জার

18
using Systemব্যবহার করার সময় আপনাকে একটি অন্তর্ভুক্ত Stringকরতে হবে, অন্যথায় আপনি নীচের ত্রুটিটি পেয়েছেন:The type or namespace name 'String' could not be found (are you missing a using directive or an assembly reference?)
রোনাল্ড

143

দুটোই এক। কোডিং গাইডলাইন দৃষ্টিকোণ থেকে এটি stringপরিবর্তে ব্যবহার করা ভাল String। সাধারণত এটি বিকাশকারীরা ব্যবহার করেন। পরিবর্তে ব্যবহার করার যেমন Int32আমরা ব্যবহার intযেমন intকরতে ওরফে হয়Int32

এফওয়াইআই "মূলশব্দ স্ট্রিংটি পূর্বনির্ধারিত শ্রেণীর জন্য কেবলমাত্র একটি নাম System.String” " - সি # ভাষার স্পেসিফিকেশন ৪.২.৩ http://msdn2.microsoft.com/En-US/library/aa691153.aspx


120

অন্যরা যেমন বলছে, তারা একই রকম। StyleCop বিধি, ডিফল্টরূপে, আপনি ব্যবহার করতে জোরদার হবে stringসর্বোত্তম অনুশীলন, যখন উল্লেখ ব্যতীত একটি সি # কোড স্টাইল System.Stringযেমন স্ট্যাটিক ফাংশন, String.Format, String.Join, String.Concat, ইত্যাদি ...


4
আমি জানতাম না যে স্টাইলকপ স্ট্রিং ব্যবহারকে পতাকাঙ্কিত করবে - স্থির পদ্ধতি ব্যতীত। আমি মনে করি এটি দুর্দান্ত যেমন আমি সর্বদা এটি ব্যবহার করি: স্ট্যাটিক সদস্যদের অ্যাক্সেস করার সময় টাইপ ডিক্লেয়ারেশন এবং স্ট্রিংয়ের স্ট্রিং।
গয়িক্স

101

6 বছর 5 মাস পরে নতুন উত্তর (বিলম্ব)।

যদিও stringএকটি সংরক্ষিত সি # কীওয়ার্ড যেখানে সর্বদা একটি নির্দিষ্ট অর্থ থাকে, Stringএটি কেবলমাত্র একটি সাধারণ শনাক্তকারী যা কোনও কিছুর উল্লেখ করতে পারে। বর্তমান ধরণের সদস্যদের উপর নির্ভর করে বর্তমান নামস্থান এবং প্রয়োগ usingনির্দেশাবলী এবং তাদের স্থান নির্ধারণ, Stringমান বা প্রকারের থেকে আলাদা হতে পারে global::System.String

আমি দুটি উদাহরণ প্রদান usingকরব যেখানে নির্দেশনাগুলি সাহায্য করবে না


প্রথমত, যখন Stringএকটি হল মান বর্তমান প্রকার (বা স্থানীয় পরিবর্তনশীল) এর:

class MySequence<TElement>
{
  public IEnumerable<TElement> String { get; set; }

  void Example()
  {
    var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
  }
}

উপরেরগুলিতে সংকলন করা হবে না কারণ IEnumerable<>একটি অ-স্থিতিশীল সদস্য না বলা হয় Format, এবং কোনও বর্ধিত পদ্ধতি প্রয়োগ হয় না। উপরের ক্ষেত্রে, এখনও Stringঅন্য প্রসঙ্গে যেমন ব্যবহার করা সম্ভব হবে যেখানে সিনট্যাক্টিকভাবে কোনও ধরণের একমাত্র সম্ভাবনা রয়েছে। উদাহরণস্বরূপ String local = "Hi mum!";ঠিক হতে পারে (নেমস্পেস এবং usingনির্দেশের উপর নির্ভর করে )।

আরও খারাপ: বলার String.Concat(someSequence)সম্ভাবনা রয়েছে (এর উপর নির্ভর করে using) লিনক এক্সটেনশন পদ্ধতিতে যাবে Enumerable.Concat। এটি স্থির পদ্ধতিতে যাবে না string.Concat


দ্বিতীয়ত, যখন Stringঅন্য ধরণের হয় , তখন বর্তমান ধরণের অভ্যন্তরে বাসা থাকে:

class MyPiano
{
  protected class String
  {
  }

  void Example()
  {
    var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
    String test2 = "Goodbye";
  }
}

Exampleপদ্ধতিতে কোনও বিবৃতি সংকলন করে না। এখানে Stringসবসময় একটি পিয়ানো স্ট্রিং , MyPiano.String। এতে কোনও সদস্য ( staticবা না) Formatবিদ্যমান নেই (বা এটির বেস বর্গ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত)। এবং মানটিকে এতে "Goodbye"রূপান্তর করা যায় না।


4
আমি মনে করি ডায়াবোলিকাল হতে পারে এক: using String = System.Int32; using Int32 = System.String; এবং তারপরে বাগগুলি গণনা করুন।
স্টিভ

7
এই সঠিক উত্তর। stringহয় System.StringStringকিছু হতে পারে।
ডেভ কাজিনো

@ ডেভকৌসিনিউ-এর সাথে সম্মত - এটিই উলামের মূল বিষয়। আপনি অন্য Stringধরনের তৈরি করতে পারেন যা System.String অবজেক্টে সেট করা হবে না। চেক আউট করুন: blog.paranoidcoding.com/2019/04/08/…
ক্রিস্টোফার

"কী-ওয়ার্ডটির stringসি # তে কংক্রিট অর্থ রয়েছে It এটি মূল প্রকারের System.Stringটাইম অ্যাসেমব্লিতে বিদ্যমান টাইপ run রানটাইম অভ্যন্তরীণভাবে এই প্রকারটি বোঝে এবং নেটগুলিতে ডেভেলপারদের প্রত্যাশিত ক্ষমতা সরবরাহ করে stringsIts এটির উপস্থিতি সি # এর পক্ষে এতটাই সমালোচিত যে যদি সেই টাইপটি না করে তবে কোডের একটি লাইন বিশ্লেষণ করার চেষ্টা করার আগে সংকলকটি প্রস্থান করবে Hence সুতরাং stringসি # কোডে একটি সুনির্দিষ্ট, দ্ব্যর্থহীন অর্থ রয়েছে C শনাক্তকারীর Stringযদিও সি # তে কোন কংক্রিট অর্থ নেই It এটি একটি সনাক্তকারী যা নাম অনুসন্ধানের সমস্ত নিয়মকেই অনুসরণ করে যেমন Widget, Studentইত্যাদি… "
ক্রিস্টোফার


99

সিস্টেমের ধরণের ব্যবহার যদি আপনি এই ধরণের জিনিসটিতে থাকেন তবে সি # এবং ভিবি.নেটের মধ্যে পোর্ট করা সহজ করে তোলে।


1
C # এবং VB.NET এর মধ্যে রূপান্তর করা যেমনটি সহজ তত সহজ। developerfusion.com/tools/convert/vb-to-csharp
অনুদান

87

বিরুদ্ধে কি অন্যান্য প্রোগ্রামারদের মধ্যে সাধারণ অনুশীলন হবে বলে মনে হয়, আমি পছন্দ Stringউপর string, শুধু সত্য যে হাইলাইট করতে Stringএকটি রেফারেন্স ধরনের, যেমন জন স্কিট উল্লেখ করেছে।


81

stringএর একটি উপনাম (বা শর্টহ্যান্ড) System.String। তার মানে, টাইপ করে stringআমরা বোঝাতে চাইছি System.String। আপনি থিংক লিঙ্কে আরও পড়তে পারেন: 'স্ট্রিং' সিস্টেম.স্ট্রিংয়ের একটি উপন্যাস / শর্টহ্যান্ড।


78

আমি রিচার্স বই থেকে কেবল এটি লফস্টস উত্তরে যুক্ত করতে চাই:

সি # ভাষার স্পেসিফিকেশনটিতে বলা হয়েছে, "শৈলীর বিষয় হিসাবে, সম্পূর্ণ সিস্টেম টাইপের নাম ব্যবহারের ক্ষেত্রে কীওয়ার্ডটির ব্যবহারের পক্ষপাত রয়েছে।" আমি ভাষার স্পেসিফিকেশনের সাথে একমত নই; আমি এফসিএল টাইপের নাম ব্যবহার করতে পছন্দ করি এবং আদিম টাইপের নামগুলি সম্পূর্ণ এড়িয়ে চলে। প্রকৃতপক্ষে, আমি চাই যে সংকলকরা এমনকি আদিম প্রকারের নামও দেয় না এবং বিকাশকারীদের পরিবর্তে এফসিএল প্রকারের নাম ব্যবহার করতে বাধ্য করে। আমার কারণগুলি এখানে:

  • আমি বেশ কয়েকটি বিকাশকারীকে বিভ্রান্ত দেখেছি, তাদের কোডটিতে স্ট্রিং বা স্ট্রিং ব্যবহার করবেন কিনা তা জেনেও না । কারণ সি # স্ট্রিংয়ে (একটি কীওয়ার্ড) হুবহু System.String (একটি এফসিএল টাইপ) এর মানচিত্র , কোনও পার্থক্য নেই এবং হয় ব্যবহার করা যেতে পারে। একইভাবে, শুনেছি কিছু ডেভেলপারদের বলে যে int- এ একটি 32 বিট পূর্ণসংখ্যা যখন অ্যাপ্লিকেশনটি একটি 32 বিট অপারেটিং সিস্টেম চলছে প্রতিনিধিত্ব করে এবং এটি একটি 64-বিট পূর্ণসংখ্যা যখন অ্যাপ্লিকেশনটি একটি 64-বিট অপারেটিং সিস্টেম চলছে উপস্থাপন করে এমন। এই বিবৃতিটি একেবারেই মিথ্যা: সি # তে একটি ইনট সর্বদা System.Int32 এ ম্যাপ করে এবং অতএব এটি কোডটি চলছে কিনা তা নির্বিশেষে এটি 32-বিট পূর্ণসংখ্যার প্রতিনিধিত্ব করে। প্রোগ্রামাররা যদি ব্যবহার করতে পারেতাদের কোডে Int32 , তারপরে এই সম্ভাব্য বিভ্রান্তিও দূর হয়।

  • C #, দীর্ঘ মানচিত্র System.Int64 , কিন্তু একটি ভিন্ন প্রোগ্রামিং ভাষাতে, দীর্ঘ একটি ম্যাপ পারে Int16 বা Int32 । বস্তুত, সি ++ / CLI আচরণ করে দীর্ঘ একটি হিসাবে Int32 । কেউ যদি কোনও ভাষায় সোর্স কোড পড়েন তবে সহজেই কোডের উদ্দেশ্যটির ভুল ব্যাখ্যা করতে পারে যদি সে বা সে কোনও ভিন্ন প্রোগ্রামিং ভাষায় প্রোগ্রামিংয়ের অভ্যস্ত ছিল। আসলে, বেশিরভাগ ভাষা এমনকি কীওয়ার্ড হিসাবে দীর্ঘ ব্যবহার করে না এবং এটি ব্যবহার করে এমন কোডটি সংকলন করে না।

  • এফসিএল এর অনেকগুলি পদ্ধতি রয়েছে যেগুলির পদ্ধতির নামের অংশ হিসাবে নাম টাইপ রয়েছে। উদাহরণস্বরূপ, BinaryReader যেমন টাইপ অফার পদ্ধতি ReadBoolean , ReadInt32 , ReadSingle , ইত্যাদি, এবং System.Convert যেমন টাইপ অফার পদ্ধতি ToBoolean , ToInt32 , ToSingle , ইত্যাদি। যদিও এটি নিম্নলিখিত কোড লিখতে বৈধ, সঙ্গে সঙ্গতিপূর্ণ ভাসা আমার জন্য খুবই অস্বাভাবিক মনে, এবং এটি যে লাইন সঠিক সুস্পষ্ট নয়:

    BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
  • অনেক প্রোগ্রামার যারা সি # ব্যবহার করেন তারা ভুলে যান যে অন্যান্য প্রোগ্রামিং ভাষাগুলি সিএলআরের বিপরীতে ব্যবহার করা যেতে পারে, এবং এই কারণে, সি # জীবগুলি ক্লাসের লাইব্রেরি কোডে প্রবেশ করে। উদাহরণস্বরূপ, Microsoft এর FCL প্রায় একচেটিয়াভাবে C # এর লেখা আছে এবং FCL দলের ডেভেলপারদের এখন চালু হিসাবে গ্রন্থাগার যেমন মধ্যে পদ্ধতি এরে এর GetLongLength , যা একটি ফেরৎ Int64 মান করে একটি দীর্ঘ (অন্যান্য ভাষায় C # কিন্তু C- এর মতো ++, / CLI) দ্বারা। আরেকটি উদাহরণ হ'ল System.Linq.Eeumerable 'এর LongCount পদ্ধতি।

আমি সম্পূর্ণ অনুচ্ছেদ পড়ার আগে আমি তার মতামত পেলাম না।


72

স্ট্রিং ( System.String) বেস ক্লাস লাইব্রেরির একটি শ্রেণি। স্ট্রিং (লোয়ার কেস) হ'ল সি # তে একটি সংরক্ষিত কাজ যা সিস্টেম.স্ট্রিংয়ের একটি উপাধি। ইন্ট 32 বনাম ইন্ট একই রকম পরিস্থিতি Boolean vs. bool। এই সি # ভাষার নির্দিষ্ট কীওয়ার্ডগুলি আপনাকে সি এর মতো শৈলীতে আদিম ঘোষণা করতে সক্ষম করে


67

Stringএকটি কীওয়ার্ড নয় এবং এটি আইডেন্টিফায়ার হিসাবে ব্যবহার করা যেতে পারে যেখানে একটি কীওয়ার্ড এবং এটি সনাক্তকারী হিসাবে ব্যবহার করা stringযায় না। এবং ফাংশন দৃষ্টিতে উভয় একই।


67

এটা সত্যিই কনভেনশন এর বিষয়। stringআরও দেখতে সি / সি ++ স্টাইলের মতো দেখতে আরও বেশি। সাধারণ কনভেনশন হ'ল আপনার নির্বাচিত ভাষা যে শর্টকাট সরবরাহ করেছে তা ব্যবহার করা (অন্তর্নিহিত / অন্তর্গত Int32)। এটি "অবজেক্ট" এবং decimalপাশাপাশি যায়।

তাত্ত্বিকভাবে এটি কিছু ভবিষ্যতের 64-বিট স্ট্যান্ডার্ডে কোডটি পোর্ট করতে সহায়তা করতে পারে যার "ইনট" অর্থ হতে পারে Int64, তবে এটি বিন্দু নয় এবং আমি কোনও আপগ্রেড উইজার্ডকে যে কোনও প্রকারের intরেফারেন্সটি Int32কেবল নিরাপদ হিসাবে পরিবর্তন করার প্রত্যাশা করব।


66

পার্টিতে দেরি করে আসছি: আমি সিএলআর টাইপগুলি 100% সময় ব্যবহার করি (ভাল, সি # টাইপ ব্যবহার করতে বাধ্য করা বাদ দিলে , তবে শেষবার কখন ছিল তা আমার মনে নেই)।

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

এখন যেহেতু আমি বছরের পর বছর ধরে এটি করছি, এটি একটি অভ্যাস এবং আমি সিএলআর প্রকারের জন্য ভিএস দেখায় এমন রঙিন পছন্দ করি।

একমাত্র আসল ডাউনারটি হ'ল স্বয়ংক্রিয়-সম্পূর্ণ সি # টাইপ ব্যবহার করে, তাই আমি পরিবর্তে সিএলআর টাইপ নির্দিষ্ট করতে স্বয়ংক্রিয়ভাবে উত্পন্ন প্রকারগুলি পুনরায় টাইপ করি।

এছাড়াও, এখন, আমি যখন "ইনট" বা "স্ট্রিং" দেখি তখন এটি আমার কাছে সত্যই ভুল মনে হয়, যেমন আমি 1970 এর সি কোডটি দেখছি।


49

এখানে কোন পার্থক্য নেই.

সি # কীওয়ার্ডটি string। এনইটি টাইপের মানচিত্র System.String- এটি একটি উপনাম যা ভাষার নামকরণের কনভেনশনগুলিতে চলে।

একইভাবে, intমানচিত্র System.Int32


একটি bit৪ বিট বিল্ডে, সিস্টেম.আইএনটি 8৪ (৮ বাইট) -এর মানচিত্রগুলি, 32 বিটের মধ্যে এটি সিস্টেমের মানচিত্র তৈরি করে। ইন্ট 32 (4 বাইট)
অ্যালেক্স

1
ইন্টারপ্রেট এবং ইউআইএনটিপিআর হ'ল একমাত্র প্রকার যা প্ল্যাটফর্ম অনুসারে আকার পরিবর্তন করে ( প্রকৃত পয়েন্টার জাতীয় ধরণের int*এবং [ইউ] ইন্টারপ্টর বা প্রকৃত পয়েন্টারগুলির সমন্বিত প্রকারগুলিকে উপেক্ষা করে)।
পি বাবা 21

45

সেখান থেকে এই বিষয়ে একটি উদ্ধৃতি এর ড্যানিয়েল Solis 'বই

সমস্ত পূর্বনির্ধারিত প্রকারগুলি সরাসরি অন্তর্নিহিত। নেট প্রকারে ম্যাপ করা হয়। সি # টাইপের নামগুলি (স্ট্রিং) হ'ল .NET প্রকারের (স্ট্রিং বা সিস্টেম.স্ট্রিং) জন্য কেবলমাত্র উপকরণ, সুতরাং .NET নামগুলি ব্যবহার করে সিনট্যাক্টিকভাবে সূক্ষ্মভাবে কাজ করে, যদিও এটি নিরুৎসাহিত করা হয়। সি # প্রোগ্রামের মধ্যে আপনার নেট # নামগুলির পরিবর্তে সি # নাম ব্যবহার করা উচিত।


41

দড়ি একটি কীওয়ার্ড এবং আপনি সনাক্তকারী হিসাবে স্ট্রিং ব্যবহার করতে পারবেন না।

দড়ি কোনও কীওয়ার্ড নয় এবং আপনি এটি সনাক্তকারী হিসাবে ব্যবহার করতে পারেন:

উদাহরণ

string String = "I am a string";

শব্দ string জন্য একটি alias হয় System.Stringশব্দ সমস্যা থেকে সরাইয়া, দুই ঠিক সমতুল্য।

 typeof(string) == typeof(String) == typeof(System.String)

2
কেবলমাত্র ছোট পার্থক্যটি হ'ল যদি আপনি স্ট্রিং ক্লাস ব্যবহার করেন তবে আপনার ফাইলের শীর্ষে আপনার সিস্টেমের নেমস্পেসটি আমদানি করতে হবে, যখন স্ট্রিং কীওয়ার্ডটি ব্যবহার করার সময় আপনাকে এটি করতে হবে না।
উত্তম

সাধারণ ব্যবহারের ক্ষেত্রে রয়েছে যেখানে সমতা বিবৃতিটি ব্যর্থ হয় ... যেমন ব্লাহ নেমস্পেসে একটি টাইপ কল স্ট্রিং সংজ্ঞায়িত করা এবং যে নামটি স্পেসে সমতা বিবৃতি চলছে সে ফাইলটিতে সেই নামস্থানটি আমদানি করা।
রিক করুন

40

হ্যাঁ, যে ঠিক তাদের মধ্যে কোনো পার্থক্য, এর boolএবং Boolean


40

@ জারেডপার (সি # সংকলক এবং উন্নত এসও ব্যবহারকারীর বিকাশকারী) এই ইস্যুতে একটি দুর্দান্ত ব্লগ পোস্ট লিখেছেন । আমি মনে করি এটি এখানে ভাগ করে নেওয়া মূল্যবান। এটি আমাদের বিষয়ে একটি দুর্দান্ত দৃষ্টিভঙ্গি।

stringবনাম Stringকোনও স্টাইলের বিতর্ক নয়

[...]

মূল stringশব্দটির সি # তে কংক্রিট অর্থ রয়েছে। System.Stringমূল রানটাইম সমাবেশে এটিই টাইপ । রানটাইম স্বতন্ত্রভাবে এই প্রকারটি বোঝে এবং .NET- এ স্ট্রিংয়ের জন্য বিকাশকারীদের প্রত্যাশাগুলি সরবরাহ করে। এটির উপস্থিতি সি # এর পক্ষে এতটাই সমালোচনা করে যে এই ধরণের উপস্থিত না থাকলে সংকলকটি কোডের একটি লাইনকে বিশ্লেষণ করার চেষ্টা করার আগে প্রস্থান করবে। অত: পরstring সি # কোডে একটি সুনির্দিষ্ট, দ্ব্যর্থহীন অর্থ রয়েছে।

সনাক্তকারীটির Stringযদিও সি # তে কোনও ठोस অর্থ নেই। এটি একটি আইডেন্টিফায়ার যে সমস্ত নাম লুকআপ নিয়ম মাধ্যমে যায় Widget, Student, ইত্যাদি ... এটা স্ট্রিং জুড়তে পারে বা এটা অন্য সমাবেশ সম্পূর্ণভাবে যার উদ্দেশ্য চেয়ে সম্পূর্ণভাবে আলাদা হতে পারে একটি টাইপ জুড়তে পারে string। সবচেয়ে খারাপ এটি কোডের মতো এমনভাবে সংজ্ঞায়িত হতে পারে String s = "hello"; সংকলন অবিরত।

class TricksterString { 
  void Example() {
    String s = "Hello World"; // Okay but probably not what you expect.
  }
}

class String {
  public static implicit operator String(string s) => null;
}

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

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

পার্থক্যটি দেখার আরও একটি উপায় হ'ল এই নমুনাটি সহ:

string s1 = 42; // Errors 100% of the time  
String s2 = 42; // Might error, might not, depends on the code

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

[...]

আপনি দেখতে পাবেন যে Stringএটি সম্পূর্ণরূপে বৈধ উদ্দেশ্যগুলির জন্য সংজ্ঞায়িত করা হয়েছে: প্রতিবিম্ব সহায়ক, সিরিয়ালাইজেশন লাইব্রেরি, লেক্সার, প্রোটোকল ইত্যাদি ... এই লাইব্রেরির মধ্যে কোনওটির কোড Stringবনাম stringকোথায় ব্যবহৃত হয়েছে তার উপর নির্ভর করে এর বাস্তব পরিণতি রয়েছে।

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

দ্রষ্টব্য: আমি সংরক্ষণাগার কারণে বেশিরভাগ ব্লগ পোস্ট অনুলিপি / আটকানো করেছি। আমি কিছু অংশ উপেক্ষা করছি, তাই আমি এড়াতে এবং আপনি যদি পারেন তবে ব্লগ পোস্টটি পড়ার পরামর্শ দিই ।

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