সি #+ আপনাকে সি ++ এর চেয়ে "নিজেকে ঝুলানোর জন্য কম দড়ি" দেয়? [বন্ধ]


14

জোয়েল স্পলস্কি সি ++ কে "নিজেকে ঝুলানোর জন্য যথেষ্ট দড়ি" হিসাবে চিহ্নিত করেছিলেন । আসলে, তিনি স্কট মায়ার্স দ্বারা "কার্যকর সি ++" সংক্ষিপ্তসার করছিলেন:

এটি এমন একটি বই যা মূলত বলেছে যে, সি ++ নিজেকে ফাঁসানোর জন্য যথেষ্ট দড়ি এবং তারপরে কয়েক মাইল দড়ি এবং তারপরে এম ও এমএস হিসাবে ছদ্মবেশযুক্ত কয়েকটি আত্মঘাতী বড়ি ...

আমার কাছে বইটির একটি অনুলিপি নেই, তবে এমন ইঙ্গিত রয়েছে যে বইয়ের বেশিরভাগই মেমরি পরিচালনার ক্ষতির সাথে সম্পর্কিত যা মনে হচ্ছে সি # তে এমট রেন্ডার হবে কারণ রানটাইম আপনার জন্য এই সমস্যাগুলি পরিচালনা করে।

আমার প্রশ্নগুলি এখানে:

  1. সি #+ কেবলমাত্র সাবধানী প্রোগ্রামিংয়ের মাধ্যমে সি ++ এ এড়ানো যাওয়া সমস্যাগুলি এড়ানো যায়? যদি তা হয় তবে তারা কোন ডিগ্রীতে এবং কীভাবে এড়ানো যায়?
  2. সি # তে কি নতুন, বিভিন্ন সমস্যা আছে যা সম্পর্কে একটি নতুন সি # প্রোগ্রামার সচেতন হওয়া উচিত? যদি তা হয় তবে তাদের কেন সি # এর ডিজাইন এড়ানো যায় না?

10
থেকে প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী : Your questions should be reasonably scoped. If you can imagine an entire book that answers your question, you’re asking too much.। আমি যেমন একটি প্রশ্ন হিসাবে এই যোগ্যতা বিশ্বাস ...
ওবেদের

@ ওবেদ আপনি চরিত্র-সীমাবদ্ধ শিরোনাম প্রশ্নটি উল্লেখ করছেন? বা আমার পোস্টের শরীরে আমার 3+ আরও সুনির্দিষ্ট প্রশ্ন?
alx9r

3
সত্যি - উভয় শিরোনাম এবং প্রতিটি "আরও ভালো প্রশ্ন" এর।
ওডে

3
এই প্রশ্নটি সম্পর্কে আমি একটি মেটা আলোচনা শুরু করেছি ।
ওডেড

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

উত্তর:


33

সি ++ এবং সি # এর মধ্যে মৌলিক পার্থক্য অপরিবর্তিত আচরণ থেকে উদ্ভূত ।

এর কিছুই নেইম্যানুয়াল মেমরি পরিচালনা করার সাথে । উভয় ক্ষেত্রেই এটি একটি সমাধান সমস্যা।

সি / সি ++:

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

3-অংশের এই সিরিজটি পড়তে পারেঅনির্ধারিত আচরণের উপর

এই সি ++ কে এত তাড়াতাড়ি করে তোলে - সংকলককে যখন সমস্যাগুলি ভুল হয় তখন কী হয় তা নিয়ে চিন্তা করতে হবে না, তাই এটি সঠিকতার জন্য পরীক্ষা করা এড়াতে পারে।

সি #, জাভা, ইত্যাদি

সি # তে, আপনি গ্যারান্টিযুক্ত যে ব্যতিক্রমগুলি হিসাবে আপনার মুখে অনেকগুলি ভুল দেখা দেবে এবং অন্তর্নিহিত সিস্টেম সম্পর্কে আপনাকে আরও অনেক গ্যারান্টিযুক্ত ।
এটি একটি মৌলিক সি ++ কে তত দ্রুত সি তৈরি করার বাধা, তবে এটি সি ++ সুরক্ষিত করার ক্ষেত্রেও একটি মৌলিক বাধা এবং এটি সি # সাথে কাজ করা এবং ডিবাগ করা সহজ করে তোলে।

বাকি সব কিছু কেবল গ্রেভাই।


সমস্ত অপরিজ্ঞাত স্টাফ বাস্তবায়নের মাধ্যমে সংজ্ঞায়িত করা হয়েছে, সুতরাং আপনি যদি ভিজুয়াল স্টুডিওতে স্বাক্ষরবিহীন পূর্ণসংখ্যাকে উপচে ফেলে থাকেন তবে আপনি সঠিক সংকলক পতাকাগুলি চালু করলে আপনি একটি ব্যতিক্রম পাবেন। এখন আমি জানি আপনি এটির বিষয়েই কথা বলছেন তবে এটি কোনও পূর্বনির্ধারিত আচরণ নয় , এটি ঠিক যে লোকেরা সাধারণত এটি পরীক্ষা করে না। (অপারেটর ++ এর মতো সত্যিকারের অপরিজ্ঞাত আচরণের সাথে একই, এটি প্রতিটি সংকলক দ্বারা ভালভাবে সংজ্ঞায়িত করা হয়েছে)। আপনি সি # এর সাথেও একই কথা বলতে পারেন, কেবলমাত্র 1 টি প্রয়োগ রয়েছে - আপনি মনোতে চালিত হলে প্রচুর পরিমাণে 'অপরিজ্ঞাত আচরণ' - যেমন। bugzilla.xamarin.com/show_bug.cgi?id=310
gbjbaanb

1
এটি কি উইন্ডোজের বর্তমান সংস্করণে বর্তমান .net প্রয়োগের দ্বারা যা সংজ্ঞায়িত বা কেবল সংজ্ঞায়িত হয়েছে? এমনকি সি ++ অপরিবর্তিত আচরণ সম্পূর্ণরূপে সংজ্ঞায়িত করা হয় যদি আপনি এটি জি ++ যা কিছু করেন তা হিসাবে সংজ্ঞায়িত করেন।
মার্টিন বেকেট

6
উপচে পড়া স্বাক্ষরযুক্ত পূর্ণসংখ্যা মোটেও ইউবি নয়। এটি ইউবি হ'ল স্বাক্ষরিত পূর্ণসংখ্যাগুলি উপচে পড়েছে।
ডেড এমএমজি

6
@gbjbaanb: ভালো লেগেছে DeadMG বলেন - স্বাক্ষরিত পূর্ণসংখ্যা ওভারফ্লো হয় অনির্দিষ্ট। এটা না বাস্তবায়ন-সংজ্ঞায়িত। এই বাক্যাংশগুলির সি ++ স্ট্যান্ডার্ডের নির্দিষ্ট অর্থ রয়েছে এবং সেগুলি একই জিনিস নয়। যে ভুল করবেন না।
ব্যবহারকারী541686

1
@ চারলেসালভিয়া: আহ, ঠিক কীভাবে "সি ++ সি সি ইউ এর তুলনায় সিপিইউ ক্যাশে সুবিধা নেওয়া সহজ করে তোলে"? এবং সি ++ এ কী ধরণের নিয়ন্ত্রণ আপনাকে মেমরির উপরে দেয় যা আপনি সি # তে থাকতে পারবেন না?
ব্যবহারকারী541686

12

সি #+ কেবলমাত্র সাবধানী প্রোগ্রামিংয়ের মাধ্যমে সি ++ এ এড়ানো যাওয়া সমস্যাগুলি এড়ানো যায়? যদি তা হয় তবে তারা কোন ডিগ্রীতে এবং কীভাবে এড়ানো যায়?

বেশিরভাগ এটি করে, কিছু এটি করে না। এবং অবশ্যই, এটি কিছু নতুন তৈরি করে।

  1. অপরিজ্ঞাত আচরণ - সি ++ এর সাথে সবচেয়ে বড় ক্ষতিটি হ'ল সম্পূর্ণরূপে অপরিজ্ঞাত ভাষা রয়েছে। আপনি যখন এই জিনিসগুলি করেন তখন সংকলক আক্ষরিকভাবে মহাবিশ্বকে ফুটিয়ে তুলতে পারে এবং এটি ঠিক থাকবে। স্বাভাবিকভাবেই, এটি অসাধারণ, তবে আপনার প্রোগ্রামটির জন্য একটি মেশিনে সূক্ষ্মভাবে কাজ করা খুব ভাল এবং সত্যিই কোনও ভাল কারণের জন্য অন্যটিতে কাজ না করা খুব সাধারণ। বা আরও খারাপ, সূক্ষ্মভাবে ভিন্ন কাজ। সি # এর নির্দিষ্টকরণে অপরিজ্ঞাত আচরণের কয়েকটি ঘটনা রয়েছে তবে সেগুলি বিরল এবং ভাষার ক্ষেত্রে এমন জায়গাগুলি যে খুব কম ভ্রমণ করা হয়। প্রতিবার আপনি বিবৃতি দেওয়ার সময় সি ++ এর অপরিজ্ঞাত আচরণের সম্ভাবনা রয়েছে।

  2. মেমোরি ফুটো - এটি আধুনিক সি ++ এর জন্য কম উদ্বেগের বিষয় নয়, তবে শুরুর দিকে এবং তার জীবদ্দশার প্রায় অর্ধেকের সময়, সি ++ এটিকে মেমরি ফাঁস করা অত্যন্ত সহজ করে তুলেছে। কার্যকর সি ++ এই উদ্বেগটি দূর করার জন্য অনুশীলনের বিবর্তনের চারপাশে এসেছিল। এটি বলেছিল, সি # এখনও স্মৃতি ফাঁস করতে পারে । লোকেরা সবচেয়ে সাধারণ ক্ষেত্রে ইভেন্ট ক্যাপচার হয় event আপনার যদি কোনও অবজেক্ট থাকে এবং কোনও ইভেন্টে হ্যান্ডলার হিসাবে এর একটি পদ্ধতি রাখে তবে সেই ইভেন্টটির মালিককে অবজেক্টটি মারা যাওয়ার জন্য GC'd হওয়া দরকার। বেশিরভাগ নবজাতকরা ইভেন্ট হ্যান্ডলারকে একটি রেফারেন্স হিসাবে গণ্য করে না don't ডিসপোজেবল সংস্থানগুলি মেমোরি ফাঁস করতে পারে এমন নিষ্পত্তি না করার বিষয়েও সমস্যা রয়েছে তবে প্রাক-কার্যকর সি ++ এর পয়েন্টারগুলির মতো এগুলি প্রায় সাধারণ নয়।

  3. সংকলন - সি ++ এর একটি retarded সংকলন মডেল রয়েছে। এটি এর সাথে দুর্দান্ত খেলতে এবং কমাতে সময়কে কম রাখার জন্য অনেক কৌশল অবলম্বন করে।

  4. স্ট্রিংস - আধুনিক সি ++ এটিকে কিছুটা আরও ভাল করে তোলে তবে char*এটি 2000 সালের আগে সমস্ত সুরক্ষা লঙ্ঘনের 95% এর জন্য দায়ী experienced অভিজ্ঞ প্রোগ্রামারদের জন্য তারা মনোনিবেশ std::stringকরবে তবে এটি এখনও এড়াতে হবে এবং পুরানো / খারাপ লাইব্রেরিতে একটি সমস্যা । এবং এটি প্রার্থনা করছে যে আপনার ইউনিকোড সমর্থন প্রয়োজন হবে না।

এবং সত্যিই, এটি আইসবার্গের টিপ। মূল সমস্যাটি হ'ল সি ++ নতুনদের জন্য খুব দরিদ্র ভাষা। এটি মোটামুটি অসামঞ্জস্যপূর্ণ এবং অনেকগুলি পুরানো সত্যই, সত্যই খারাপ সমস্যার মুখোমুখি পরিবর্তন করে মোকাবেলা করা হয়েছে। সমস্যাটি হ'ল আরম্ভকারীদের তখন কার্যকর সি ++ এর মতো কিছু থেকে আইডিয়মগুলি শিখতে হবে। সি # এই সমস্ত সমস্যাগুলি পুরোপুরি সরিয়ে দেয় এবং যতক্ষণ না আপনি শেখার পথে এগিয়ে না যান ততক্ষণ বাকি সমস্তকে উদ্বেগকে কমিয়ে দেয়।

সি # তে কি নতুন, বিভিন্ন সমস্যা আছে যা সম্পর্কে একটি নতুন সি # প্রোগ্রামার সচেতন হওয়া উচিত? যদি তা হয় তবে তারা কেন সি # এর ডিজাইনটি এড়াতে পারেননি?

আমি ইভেন্টটির "স্মৃতি ফাঁস" উল্লেখ করেছি। এটি কোনও ভাষার সমস্যা নয় যতই প্রোগ্রামার ভাষা আশা করতে পারে না এমন কিছু প্রত্যাশা করে।

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

আর একটি আধা-বিপত্তি আমি প্রোগ্রামারদের দেখেছি এটি বেনাম ফাংশনগুলির ক্যাপচার শব্দার্থক। আপনি যখন কোনও ভেরিয়েবল ক্যাপচার করেন , আপনি ভেরিয়েবলটি ক্যাপচার করেন । উদাহরণ:

List<Action> actions = new List<Action>();
for(int x = 0; x < 10; ++x ){
    actions.Add(() => Console.WriteLine(x));
}

foreach(var action in actions){
    action();
}

নির্লিপ্তভাবে যা ভাবা হয় তা করে না। এটি 1010 বার মুদ্রণ করে ।

আমি নিশ্চিত যে আরও অনেক লোককে আমি ভুলে যাচ্ছি, তবে মূল বিষয়টি হ'ল তারা কম বিস্তৃত।


4
মেমরি ফুটো অতীতের একটি জিনিস, এবং এটিও char*। আপনি এখনও সি # তে মেমরি ফাঁস করতে পারেন তা উল্লেখ করার দরকার নেই just
ডেড এমজি

2
টেমপ্লেটগুলি "গৌরবযুক্ত স্ট্রিং পেস্টিং" কল করা কিছুটা বেশি। টেমপ্লেটগুলি সত্যই সি ++ এর অন্যতম সেরা বৈশিষ্ট্য।
চার্লস সালভিয়া

2
@CharlesSalvia নিশ্চিত, তারা সি ++ সত্যিই পার্থক্য বৈশিষ্ট্য। এবং হ্যাঁ, এটি সম্ভবত সংকলন প্রভাবের জন্য একটি ওভারসিম্প্লিফিকেশন। তবে এগুলি সংকলনের সময় এবং আউটপুট আকারের তুলনামূলকভাবে প্রভাব ফেলে, বিশেষত যদি আপনি যত্নবান না হন।
টেলাস্টিন

2
@ ডিএডিএমজি অবশ্যই নিশ্চিতভাবেই আমি যুক্তি দেব যে সি ++ তে ব্যবহৃত / প্রয়োজনীয় টেম্পলেট মেটা-প্রোগ্রামিং কৌশলগুলি আরও একটি ভিন্ন পদ্ধতির মাধ্যমে আরও ভালভাবে প্রয়োগ করা হয়েছে।
টেলাস্টিন ২

2
@ টেলাস্টিন টাইপ_ট্রেটসের পুরো বিন্দুটি সংকলনের সময় টাইপ তথ্য পেতে হয় যাতে আপনি এই তথ্যগুলি নির্দিষ্ট উপায়ে টেম্পলেট বা ওভারলোড ফাংশন বিশেষজ্ঞের মতো কাজে ব্যবহার করতে পারেনenable_if
চার্লস সালভিয়া

10

আমার মতে, সি ++ এর বিপদগুলি কিছুটা অতিরঞ্জিত।

অপরিহার্য বিপদটি হ'ল: সি # আপনাকে unsafeকীওয়ার্ডটি ব্যবহার করে "অনিরাপদ" পয়েন্টার ক্রিয়াকলাপ করতে দেয় , সি ++ (বেশিরভাগ ক্ষেত্রে সি এর সুপারস্টেট হওয়া) আপনাকে যখনই মনে হয় পয়েন্টার ব্যবহার করতে দেয়। পয়েন্টার (যা সি এর সাথে সমান) ব্যবহারের সাথে অন্তর্নিহিত স্বাভাবিক বিপদগুলি ছাড়াও, মেমরি-ফাঁস, বাফার ওভারফ্লো, ডাঙ্গালিং পয়েন্টার ইত্যাদির মতো, সি ++ আপনাকে গুরুত্ব সহকারে জিনিসগুলি স্ক্রু করার জন্য নতুন উপায় প্রবর্তন করে।

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

তবুও , প্রকৃত প্রতিদিনের সি ++ প্রোগ্রামিংয়ে, এমন একটি ক্লাস লিখতে খুব বিরল দেখা যায় যা তার নিজস্ব স্মৃতি পরিচালনা করে, সুতরাং এটি বিভ্রান্তিকর যে এই সমস্যাগুলি এড়াতে সি ++ প্রোগ্রামারদের সর্বদা "যত্নবান" হওয়া দরকার। সাধারণত, আপনি আরও কিছু এর মতো করে যাবেন:

class Foo
{
    public:

    Foo(const std::string& s) 
        : m_first_name(s)
    { }

    private:

    std::string m_first_name;
};

এই শ্রেণিটি আপনি জাভা বা সি # তে যা করতে চেয়েছিলেন তার খুব কাছাকাছি দেখায় - এটির জন্য কোনও স্পষ্ট মেমরি ব্যবস্থাপনার প্রয়োজন নেই (কারণ গ্রন্থাগার ক্লাসটি std::stringস্বয়ংক্রিয়ভাবে সেগুলির সমস্ত যত্ন নেয়) এবং ডিফল্ট থেকে কোনও "3 বিধি" উপাদান কোনও প্রয়োজন হয় না all কপি কনস্ট্রাক্টর এবং এসাইনমেন্ট অপারেটর ঠিক আছে fine

আপনি যখন এমন কিছু করার চেষ্টা করেন কেবল তখনই:

class Foo
{
    public:

    Foo(const char* s)
    { 
        std::size_t len = std::strlen(s);
        m_name = new char[len + 1];
        std::strcpy(m_name, s);
    }

    Foo(const Foo& f); // must implement proper copy constructor

    Foo& operator = (const Foo& f); // must implement proper assignment operator

    ~Foo(); // must free resource in destructor

    private:

    char* m_name;
};

এই ক্ষেত্রে, নবাগতদের জন্য অ্যাসাইনমেন্ট, ডেস্ট্রাক্টর এবং অনুলিপি কনস্ট্রাক্টরকে সঠিকভাবে প্রাপ্ত করা মুশকিল হতে পারে। তবে বেশিরভাগ ক্ষেত্রে এটি করার কোনও কারণ নেই। সি ++ এটি খুব সহজ মত গ্রন্থাগার শ্রেণীর ব্যবহার দ্বারা ম্যানুয়াল মেমরি ব্যবস্থাপনা এড়াতে সময় 99% তোলে std::stringএবং std::vector

অন্য একটি সম্পর্কিত সমস্যা হ'ল ম্যানুয়ালি এমনভাবে ম্যানেজ করা যা কোনও ব্যতিক্রম নিক্ষেপ হওয়ার সম্ভাবনা বিবেচনায় না নেয়। ভালো লেগেছে:

char* s = new char[100];
some_function_which_may_throw();
/* ... */
delete[] s;

যদি some_function_which_may_throw()প্রকৃতপক্ষে কোনও ব্যতিক্রম ছুঁড়ে ফেলা হয় তবে আপনার একটি মেমরি ফাঁস হবে কারণ এর জন্য বরাদ্দ হওয়া মেমরিটি sকখনও পুনরুদ্ধার করা যাবে না। কিন্তু আবার, বাস্তবে এটি একই কারণেই খুব বেশি সমস্যাযুক্ত যে "" বিধি 3 "আসলেই আর কোনও সমস্যা নয়। কাঁচা পয়েন্টার সহ আপনার নিজের মেমরিটি আসলে পরিচালনা করা খুব বিরল (এবং সাধারণত অপ্রয়োজনীয়)। উপরের সমস্যাটি এড়াতে, আপনাকে যা করতে হবে তা হ'ল একটি std::stringবা ব্যবহার std::vectorকরা উচিত এবং ব্যতিক্রম ছোঁড়ার পরে ডেস্ট্রাক্টর স্বয়ংক্রিয়ভাবে স্ট্যাক আনওয়ানড করার সময় অনুরোধ করা হবে।

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

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


এটি সি ++ 03 তে তিনটির নিয়ম ছিল এবং এখন C ++ 11 এ চারটি নিয়ম।
ডেড এমএমজি

1
আপনি এটি অনুলিপি কনস্ট্রাক্টর, মুভ কনস্ট্রাক্টর, কপি অ্যাসাইনমেন্ট, মুভ অ্যাসাইনমেন্ট এবং ডেস্ট্রাক্টর জন্য "5 এর বিধি" বলতে পারেন। তবে সরান শব্দার্থবিজ্ঞানগুলি কেবলমাত্র সঠিক সংস্থান ব্যবস্থাপনার জন্য প্রয়োজনীয় নয়।
চার্লস সালভিয়া

আপনার আলাদা সরানো এবং অনুলিপি নিয়োগের দরকার নেই। অনুলিপি-অনুলিপি আইডিয়ম উভয় অপারেটরকে একটিতে করতে পারে।
ডেড এমএমজি

2
এটা প্রশ্নের উত্তর Does C# avoid pitfalls that are avoided in C++ only by careful programming?। উত্তরটি "সত্যই নয়, কারণ জোয়েল আধুনিক সি ++ এর মধ্যে যে সমস্যাগুলি নিয়ে কথা বলছিলেন তা এড়ানো তুচ্ছভাবে সহজ"
চার্লস সালভিয়া

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

3

আমি সত্যিই রাজি হই না। 1985-এ যেমন বিদ্যমান ছিল তেমন সি ++ এর চেয়ে কম ক্ষতি হতে পারে।

সি #+ কেবলমাত্র সাবধানী প্রোগ্রামিংয়ের মাধ্যমে সি ++ এ এড়ানো যাওয়া সমস্যাগুলি এড়ানো যায়? যদি তা হয় তবে তারা কোন ডিগ্রীতে এবং কীভাবে এড়ানো যায়?

আসলে তা না. তিন রুল মত বিধি সি ++ 11 ধন্যবাদ বৃহদায়তন তাত্পর্য হারিয়েছে unique_ptrএবং shared_ptrআদর্শায়িত হচ্ছে। অস্পষ্টভাবে বুদ্ধিমান ফ্যাশনে স্ট্যান্ডার্ড ক্লাস ব্যবহার করা "সাবধানে কোডিং" নয়, এটি "বেসিক কোডিং"। এছাড়াও, ম্যানুয়াল মেমরি পরিচালনার মতো কাজ করতে এখনও যথেষ্ট বোকা, অজ্ঞাতসারে বা উভয়ই সি ++ জনসংখ্যার অনুপাত আগের তুলনায় অনেক কম। বাস্তবতা হ'ল প্রভাষকরা যারা এর মতো নিয়মগুলি প্রদর্শন করতে চান তাদের উদাহরণগুলি খুঁজতে এখনও কয়েক সপ্তাহ সময় ব্যয় করতে হয় যেখানে তারা এখনও প্রয়োগ করেন কারণ স্ট্যান্ডার্ড ক্লাসগুলি কার্যত প্রতিটি ব্যবহারের ক্ষেত্রে কল্পনাযোগ্য coverেকে রাখে। অনেক কার্যকর সি ++ কৌশল একইভাবে চলে গেছে - ডোডোর পথে। অন্যান্য অনেকগুলিই আসলে সি ++ নির্দিষ্ট নয়। আমাকে দেখতে দাও. প্রথম আইটেম এড়িয়ে যাওয়া, পরবর্তী দশটি হ'ল:

  1. এটি সি এর মতো সি ++ কোড করবেন না এটি সত্যই সাধারণ জ্ঞান।
  2. আপনার ইন্টারফেসগুলি সীমাবদ্ধ করুন এবং এনক্যাপসুলেশন ব্যবহার করুন। গলি।
  3. দ্বি-পর্যায়ে প্রারম্ভিককরণ কোড লেখকদের ঝুঁকিতে পুড়িয়ে ফেলতে হবে। গলি।
  4. শব্দার্থক কী তা জানুন। এটি কি আসলেই C ++ নির্দিষ্ট?
  5. আপনার ইন্টারফেসগুলি আবার সীমাবদ্ধ করুন, এবার কিছুটা আলাদা উপায়ে। গলি।
  6. ভার্চুয়াল ডেস্ট্রাক্টর। হ্যাঁ। এটি সম্ভবত এখনও বৈধ somewhat কিছুটা হলেও। finalএবং overrideআরও ভাল জন্য এই নির্দিষ্ট গেম পরিবর্তন করতে সহায়তা করেছে। আপনার ডেস্ট্রাক্টর তৈরি করুন overrideএবং যদি আপনি কোনও এমন একজনের কাছ থেকে উত্তরাধিকারী হন যিনি তাদের ডেস্ট্রাক্টর করেন নি তবে আপনি একটি দুর্দান্ত সংকলক ত্রুটির নিশ্চয়তা দিচ্ছেন virtual। আপনার শ্রেণি তৈরি করুন finalএবং কোনও ভার্চুয়াল ডেস্ট্রাক্টর ছাড়াই দুর্ঘটনাক্রমে কোনও দরিদ্র স্ক্রাব আসতে পারে না এবং এটি থেকে উত্তরাধিকারী হতে পারে।
  7. ক্লিনআপ ফাংশন ব্যর্থ হলে খারাপ জিনিস ঘটে। এটি সত্যিই সি ++ এর সাথে সুনির্দিষ্ট নয় - আপনি জাভা এবং সি # উভয়ের জন্য একই পরামর্শ দেখতে পারেন - এবং ভাল, প্রতিটি ভাষাতেই বেশ কিছু। ব্যর্থ হতে পারে এমন ক্লিনআপ ফাংশনগুলি থাকা কেবল প্লেইন খারাপ এবং এই আইটেমটি সম্পর্কে সি ++ বা এমনকি ওওপি কিছুই নেই।
  8. কনস্ট্রাক্টর অর্ডার ভার্চুয়াল ফাংশনগুলিকে কীভাবে প্রভাবিত করে সে সম্পর্কে সচেতন হন। হাসিখুশিভাবে, জাভাতে (বর্তমান বা অতীতের হয়) এটি ডারাইভড শ্রেণীর ফাংশনটিকে ভুলভাবে ডেকে আনে, যা সি ++ এর আচরণের চেয়েও খারাপ। নির্বিশেষে, এই সমস্যাটি C ++ এর সাথে সুনির্দিষ্ট নয়।
  9. অপারেটর ওভারলোডগুলি লোকেদের প্রত্যাশা অনুযায়ী আচরণ করা উচিত। সত্যই নির্দিষ্ট নয়। হেল, এটি খুব সহজেই অপারেটার ওভারলোডিং নির্দিষ্ট, এটি কোনও ফাংশনে প্রয়োগ করা যেতে পারে - এটির একটি নাম দেবেন না এবং তারপরে একে সম্পূর্ণ অপ্রয়োজনীয় কিছু করতে দিন make
  10. এটি এখন খারাপ অভ্যাস হিসাবে বিবেচিত হয়। সমস্ত দৃ strongly়-ব্যতিক্রম-নিরাপদ অ্যাসাইনমেন্ট অপারেটরগুলি স্ব-কার্যনির্বাহকে ঠিক জরিমানা করে, এবং স্ব-নিয়োগটি কার্যকরভাবে একটি লজিকাল প্রোগ্রাম ত্রুটি, এবং স্ব-কার্য-নির্ধারণের জন্য পরীক্ষা করা কার্য সম্পাদন ব্যয়ের পক্ষে উপযুক্ত নয় isn't

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

সম্পাদনা করুন: সি ++ এর অসুবিধাগুলি এর ক্ষতিগুলির মতো জিনিস অন্তর্ভুক্ত করে না malloc। আমি বোঝাতে চাইছি, একটির জন্য প্রতিটি সিগন্যাল আপনি সি কোডে সন্ধান করতে পারবেন সমানভাবে অনিরাপদ সি # কোডেও খুঁজে পেতে পারেন তাই এটি বিশেষভাবে প্রাসঙ্গিক নয় এবং দ্বিতীয়ত, স্ট্যান্ডার্ডটি আন্তঃব্যক্তির জন্য এটি সংজ্ঞায়িত করার অর্থ এই নয় যে এটি ব্যবহার করা সি ++ হিসাবে বিবেচিত হবে কোড। স্ট্যান্ডার্ডটিও সংজ্ঞায়িত করে goto, তবে আপনি যদি এটি ব্যবহার করে স্প্যাগেটি জগাখিচুবি করার একটি বিশাল গাদা লিখে থাকেন তবে আমি বিবেচনা করব যে আপনার সমস্যাটি ভাষা নয়। "সাবধানে কোডিং" এবং "ভাষার মৌলিক প্রতিমা অনুসরণ" এর মধ্যে একটি বড় পার্থক্য রয়েছে।

সি # তে কি নতুন, বিভিন্ন সমস্যা আছে যা সম্পর্কে একটি নতুন সি # প্রোগ্রামার সচেতন হওয়া উচিত? যদি তা হয় তবে তারা কেন সি # এর ডিজাইনটি এড়াতে পারেননি?

usingsucks। এটা সত্যিই না। এবং কেন ভাল কিছু করা হয়নি তা আমার কোনও ধারণা নেই। এছাড়াও, Base[] = Derived[]এবং অবজেক্টের বেশিরভাগ ব্যবহার, যা বিদ্যমান রয়েছে কারণ মূল ডিজাইনাররা টেমপ্লেটগুলি সি ++ তে থাকা বিশাল সাফল্যটি লক্ষ্য করতে ব্যর্থ হয়েছিলেন এবং সিদ্ধান্ত নিয়েছিলেন যে "আসুন আমরা সমস্ত কিছু থেকে উত্তরাধিকারী হয়ে যাই এবং আমাদের সমস্ত ধরণের সুরক্ষা হারাতে পারি" বুদ্ধিমান পছন্দ ছিল । আমি আরও বিশ্বাস করি যে প্রতিনিধিদের সাথে রেসের শর্ত এবং এই জাতীয় মজাদার মতো কিছু জিনিসগুলিতে আপনি কিছু বাজে চমক পেতে পারেন। তারপরে অন্যান্য সাধারণ জিনিস রয়েছে যেমন জেনারিকরা কীভাবে টেমপ্লেটগুলির তুলনায় ভয়াবহভাবে চুষে নেয়, একটিতে classএবং এই জাতীয় জিনিসগুলির মধ্যে সত্যই অযৌক্তিকভাবে প্রয়োগ করা হয় ।


5
শিক্ষিত ইউজারবেস বা নতুন কনস্ট্রাক্টস যদিও দড়িটি আসলেই কমছে না। তারা কেবল কাজের আশপাশে তাই কম লোকেরা ঝুলিয়ে রাখে। যদিও এটি কার্যকর সি ++ এবং ভাষার বিবর্তনে এর প্রসঙ্গে সমস্ত ভাল মন্তব্য।
টেলাস্টিন

2
না। এটি কার্যকর সি ++ এর আইটেমগুলির একগুচ্ছ ধারণাগুলি যা কোনও মান-টাইপযুক্ত বস্তু-ভিত্তিক ভাষার ক্ষেত্রে সমানভাবে প্রয়োগ করতে পারে। এবং ইউজারবেসকে সি এর পরিবর্তে প্রকৃত সি ++ কোড করতে শিক্ষিত করা অবশ্যই সি ++ আপনাকে দেওয়া দড়িটিকে হ্রাস করবে। এছাড়াও, আমি আশা যে নতুন ভাষা নির্মান করছে দড়ি কমা। এটি সম্পর্কে ঠিক কী কারণে সি ++ স্ট্যান্ডার্ড সংজ্ঞায়িত করা হচ্ছে mallocতার অর্থ এই নয় যে আপনি এটি করা উচিত, কেবল gotoযেমন আপনি দুশ্চরিত্রার মতো বেশ্যা ব্যবহার করতে পারেন তার অর্থ এটি যে দড়ি দিয়ে আপনি নিজেকে ঝুলিয়ে রাখতে পারেন।
ডেড এমএমজি

2
সি ++ এর সি অংশগুলি ব্যবহার করা আপনার সমস্ত কোড unsafeসি # তে লেখার চেয়ে আলাদা নয় , যা ঠিক ততটা খারাপ। আপনি চাইলে কোডিং সি # এর মতো প্রতিটি বিপর্যয়ও তালিকাভুক্ত করতে পারি।
ডেড এমএমজি

@ ডিড এমএমজি: সুতরাং সত্যই প্রশ্নটি হওয়া উচিত "একজন সি ++ প্রোগ্রামার যতক্ষণ না তিনি সি প্রোগ্রামার হিসাবে নিজেকে ঝুলিয়ে রাখতে যথেষ্ট দড়ি"
gbjbaanb

"প্লাস, সি ++ জনসংখ্যার অনুপাত যারা এখনও মেনুয়াল মেমোরি ম্যানেজমেন্টের মতো কাজ করতে যথেষ্ট বোকা, অজ্ঞাতসারে, বা উভয়ই আগের তুলনায় অনেক কম" " হদফ ঘ.
dan04

3

সি #+ কেবলমাত্র সাবধানী প্রোগ্রামিংয়ের মাধ্যমে সি ++ এ এড়ানো যাওয়া সমস্যাগুলি এড়ানো যায়? যদি তা হয় তবে তারা কোন ডিগ্রীতে এবং কীভাবে এড়ানো যায়?

সি # এর সুবিধা রয়েছে:

  • সি এর সাথে পিছনে সামঞ্জস্যপূর্ণ না হওয়া, এইভাবে "দুষ্ট" ভাষার বৈশিষ্ট্যগুলির একটি দীর্ঘ তালিকা (যেমন, কাঁচা পয়েন্টার) এড়ানো এড়ানো যা সিন্ট্যাক্টিকভাবে সুবিধাজনক তবে এখন খারাপ শৈলী হিসাবে বিবেচিত।
  • মান শব্দার্থবিজ্ঞানের পরিবর্তে রেফারেন্স শব্দার্থিক থাকা, যা কার্যকর সি ++ আইটেমগুলির কমপক্ষে 10 করে তোলে (তবে নতুন সমস্যাগুলি প্রবর্তন করে)।
  • সি ++ এর চেয়ে কম বাস্তবায়ন-সংজ্ঞায়িত আচরণ রয়েছে।
    • বিশেষ করে, C ++ চরিত্রের এনকোডিং char, stringইত্যাদি বাস্তবায়ন-সংজ্ঞায়িত করা হয়। উইন্ডোজ ইউনিকোডের কাছে ( wchar_tইউটিএফ -16 এর charজন্য, অপ্রচলিত "কোড পৃষ্ঠাগুলি") এবং * নিক্স অ্যাপ্রোচ (ইউটিএফ -8) এর মধ্যে বিভেদ ক্রস-প্ল্যাটফর্ম কোডে দুর্দান্ত অসুবিধার কারণ ঘটায়। সি #, ওটিওএইচ, গ্যারান্টি দেয় যে stringএটি ইউটিএফ -16।

সি # তে কি নতুন, বিভিন্ন সমস্যা আছে যা সম্পর্কে একটি নতুন সি # প্রোগ্রামার সচেতন হওয়া উচিত?

হ্যাঁ: IDisposable

সি # এর জন্য "কার্যকর সি ++" এর সমতুল্য কোনও বই আছে কি?

কার্যকর সি # নামে একটি বই রয়েছে যা কার্যকর সি ++ এর কাঠামোর সাথে সমান ।


0

না, সি # (এবং জাভা) সি ++ এর চেয়ে কম নিরাপদ

সি ++ স্থানীয়ভাবে যাচাইযোগ্য । আমি সি ++ তে একটি একক বর্গ পরিদর্শন করতে পারি এবং নির্ধারিত করতে পারি যে শ্রেণিটি সমস্ত রেফারেন্সযুক্ত শ্রেণি সঠিক বলে ধরে নিয়ে মেমরি বা অন্যান্য সংস্থান ফাঁস করে না। জাভা বা সি # তে, প্রতিটি রেফারেন্স শ্রেণীর জন্য এটি পরীক্ষা করা প্রয়োজন যে এটির কোনও ধরণের চূড়ান্তকরণ প্রয়োজন কিনা।

সি ++:

{
   some_resource r(...);  // resource initialized
   ...
}  // resource destructor called, no leaks here

সি #:

{
   SomeResource r = new SomeResource(...); // resource initialized
   ...
} // did I need to finalize that?  May I should have used 'using' 
  // (or in Java, a grotesque try/finally construct)?  No way to tell
  // without checking the documentation for SomeResource

সি ++:

{
    auto_ptr<SomeInterface> i = SomeFactory.create(...);
    i->f(...);
} // automatic finalization and memory release.  A new implementation of
  // SomeInterface can allocate and free resources with no impact
  // on existing code

সি #:

{
   SomeInterface i = SomeFactory.create(...);
   i.f(...);
   ...
} // Sure hope someone didn't create an implementation of SomeInterface
  // that requires finalization.  In C# and Java it is necessary to decide whether
  // any implementation could require finalization when the interface is defined.
  // If the initial decision is 'no finalization', then no future implementation  
  // can acquire any resource without creating potential leaks in existing code.

3
... আইডিজিপোজযোগ্য থেকে কোনও উত্তরাধিকার সূত্রে প্রাপ্ত তা নির্ধারণ করা আধুনিক আইডিইগুলিতে বেশ তুচ্ছ। প্রধান সমস্যা হল আপনি প্রয়োজন বোধ করেন জানি ব্যবহারের auto_ptr(বা তার কুটুম্ব কয়েক)। এটাই প্রবাদ বাক্য রশি।
টেলাস্টিন

2
@ টেলাস্টিন না, মূল বিষয়টি হ'ল আপনি সর্বদা স্মার্ট পয়েন্টার ব্যবহার করেন, যদি না আপনি সত্যিই জানেন যে আপনার প্রয়োজন নেই। সি # তে ব্যবহারের বিবৃতিটি আপনি যে দড়িটির কথা উল্লেখ করছেন ঠিক তার মতো। (যেমন সি ++ তে আপনাকে স্মার্ট পয়েন্টারটি ব্যবহার করতে হবে, তবে সি # কেন খারাপ নয় যদিও আপনাকে সর্বদা একটি ব্যবহারের বিবৃতিটি মনে রাখতে হবে)
gbjbaanb

1
@gbjbaanb কারণ কি? 5% সর্বাধিক সি # ক্লাস নিষ্পত্তিযোগ্য? এবং আপনি জানেন যে তারা নিষ্পত্তিযোগ্য হলে আপনার সেগুলি নিষ্পত্তি করতে হবে। সি ++ এ, প্রতিটি একক বস্তু ডিসপোজেবল। এবং আপনার বিশেষ উদাহরণটি মোকাবেলা করার দরকার আছে কিনা আপনি জানেন না । পয়েন্টারগুলি ফ্যাক্টরি থেকে আসে না এমন ফেরত দেওয়ার জন্য কী ঘটে? এগুলি পরিষ্কার করার দায়িত্ব কি আপনার? এটি হওয়া উচিত নয় , তবে কখনও কখনও এটি হয়। এবং আবারও, কেবলমাত্র আপনার সর্বদা স্মার্ট পয়েন্টার ব্যবহার করা উচিত নয় এর অর্থ এই নয় যে বিকল্পটি অস্তিত্ব রুদ্ধ না করে। বিশেষত নতুনদের জন্য, এটি একটি উল্লেখযোগ্য ক্ষতি।
টেলাস্টিন

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

2
কেভিন: ওহ, আপনার উত্তরটি কোনও অর্থহীন নয়। এটি সি # এর দোষ নয় যে আপনি এটি ভুল করছেন। আপনি সঠিকভাবে সি # কোডে চূড়ান্তকরণের উপর নির্ভর করবেন না । আপনার যদি এমন একটি ক্ষেত্র রয়েছে যার একটি Disposeপদ্ধতি রয়েছে, আপনাকে অবশ্যই প্রয়োগ করতে হবে IDisposable('সঠিক' উপায়)। যদি আপনার শ্রেণি এটি করে (যা আপনার CC ++ এর জন্য ক্লাসের জন্য RAII বাস্তবায়নের সমতুল্য), এবং আপনি ব্যবহার করেন using(যা সি ++ এর স্মার্ট পয়েন্টারগুলির মতো), এটি সব ঠিকভাবে কাজ করে। চূড়ান্তকরণটি বেশিরভাগ দুর্ঘটনা রোধে বোঝানো হয় - Disposeনির্ভুলতার জন্য দায়ী, এবং আপনি যদি এটি ব্যবহার না করেন তবে ভাল, এটি আপনার দোষ, সি # এর নয়।
ব্যবহারকারী541686

0

হ্যাঁ 100% হ্যাঁ যেহেতু আমি মনে করি মেমরি মুক্ত করা এবং এটি সি # তে ব্যবহার করা অসম্ভব বলে মনে হচ্ছে (এটির পরিচালিত ধরে নেওয়া এবং আপনি অনিরাপদ মোডে যান না)।

তবে আপনি যদি সি ++ তে কীভাবে প্রোগ্রাম করবেন তা জানেন যা অবিশ্বাস্য সংখ্যক লোক না করে। আপনি বেশ ভাল আছেন। চার্লস সালভিয়া ক্লাসগুলির মতো সত্যই তাদের স্মৃতিগুলি পরিচালনা করে না কারণ এটি সমস্ত পূর্বনির্ধারিত এসটিএল ক্লাসগুলিতে পরিচালিত হয়। আমি খুব কমই পয়েন্টার ব্যবহার করি। আসলে আমি একক পয়েন্টার ব্যবহার না করেই প্রকল্পগুলিতে চলেছি। (সি ++ 11 এটিকে সহজ করে তোলে)।

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


4
জাভা এবং সি # রেফারেন্স সমতার জন্য ব্যবহার করে এবং মান সমতার জন্য প্রবর্তন করে =/ ==সমস্যাটিকে আরও খারাপ করেছে। দুর্বল প্রোগ্রামারকে এখন ভেরিয়েবলটি 'ডাবল' বা 'ডাবল' কিনা তা ট্র্যাক করে রাখতে হবে এবং সঠিক ভেরিয়েন্টটি কল করতে ভুলবেন না। ==.equals
কেভিন ক্লাইনে

@ কেভিঙ্কলাইন +1 তবে সি # তে structআপনি ==যা করতে পারেন তা অবিশ্বাস্যভাবে ভাল কাজ করে যেহেতু বেশিরভাগ সময় কেবলমাত্র স্ট্রিং, ইনটস এবং ফ্লোট থাকে (অর্থাত্ কেবল স্ট্রাক্ট সদস্য) থাকে। আমার নিজস্ব কোডে আমি কখনই অ্যারে তুলনা করতে চাই তা বাদ দিয়ে কখনই সমস্যাটি পাই না। আমি কখনও তালিকা বা নন স্ট্রাক্টের (স্ট্রিং, ইনট, ফ্লোট, ডেটটাইম, কীভ্যালিউ পেয়ার এবং আরও অনেকগুলি) তুলনা করি না বলে মনে করি না

2
পাইথন ==মান সমতা এবং isরেফারেন্স সমতার জন্য ব্যবহার করে এটি ঠিক পেয়েছিল ।
dan04

@ dan04 - সি # এর কত ধরণের সাম্য আছে বলে আপনি মনে করেন? চমত্কার এসিসিইউ বজ্রপাত আলোচনা দেখুন: কিছু বস্তু অন্যদের তুলনায় অনেক বেশি সমান
মার্ক বুথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.