Castালাই কেন এড়ানো উচিত? [বন্ধ]


97

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

তবে যদি কেউ আমাকে হুবহু কেন তা ব্যাখ্যা করতে বলেন, আমি সম্ভবত তাদের দিকে হেডলাইটে হরিণের মতো দেখব would

তাহলে কেন / কখন খারাপ কাস্টিং হয়?

এটি জাভা, সি #, সি ++ এর জন্য সাধারণ বা প্রতিটি পৃথক রানটাইম পরিবেশ তার নিজস্ব শর্তাদির সাথে এটি আচরণ করে?

যে কোনও ভাষার জন্য বিশেষত স্বাগত, উদাহরণস্বরূপ এটি সি ++ এ খারাপ কেন?


4
এই ছাপটি আপনি কোথায় পেয়েছেন?
ওডে

8
আমি এই ধারণাটি পেয়েছি যেহেতু আমি কখনই কোনও বই পড়ি না বা এমন কোনও প্রোগ্রামারের সাথে দেখা করি না যা বলেছিল "কাস্টিং সু্যু গুড !!!"
লাউডএনপসোসিয়েবললি ভুল

15
সি ++ এর উত্তর সি # এর উত্তর থেকে অবশ্যম্ভাবীভাবে আলাদা। এটি অত্যন্ত ভাষা-নির্দিষ্ট। উত্তরগুলি এখনও পর্যন্ত নির্দিষ্ট প্রশ্নের জন্য এই প্রশ্নের উত্তর দেয় এবং কিছু ক্ষেত্রে তারা কোন ভাষায় কথা বলছে তা জানায় না।
জেমস ম্যাকনেলিস

4
খারাপ একটি আপেক্ষিক শব্দ। Castালাই এড়ানো একটি সেরা অনুশীলন, তবে কখনও কখনও কোনও প্রোগ্রামার যা করতে পারে তা প্রোগ্রামারের কাছে করা উচিত। (বিশেষত যদি আপনি একটি জাভা 1.5+ প্রোগ্রাম লিখেন যা 1.4 এর জন্য লিখিত একটি গ্রন্থাগার ব্যবহার করে) সম্ভবত এই প্রশ্নের নাম পরিবর্তন করে, "কেন কাস্টিং এড়ানো উচিত?"
মাইক মিলার

4
এটি দুর্দান্ত প্রশ্ন .... এটি 5 জন ব্যবহারকারী দ্বারা বন্ধ করা হয়েছিল যাদের প্রত্যেকের 10k এর চেয়ে কম খ্যাতি আছে !! স্পষ্টতই, নতুন শক্তিগুলির অত্যধিক জ্বালানী ব্যবহার। পুনরায় খুলতে ভোট দিয়েছেন Have
পৌঁছে যানচালকরা

উত্তর:


141

আপনি এটি তিনটি ভাষার সাথে ট্যাগ করেছেন, এবং উত্তরগুলি তিনটির মধ্যে সত্যই আলাদা। সি ++ এর কম-বেশি আলোচনা সি কাস্তের আলোচনাও বোঝায় এবং এটি (আরও বা কম) চতুর্থ উত্তর দেয়।

যেহেতু এটিই আপনি স্পষ্টভাবে উল্লেখ করেন নি, তাই আমি সি দিয়ে শুরু করব সি কাস্তগুলিতে বেশ কয়েকটি সমস্যা রয়েছে। একটি হ'ল তারা বিভিন্ন ধরণের কিছু করতে পারে। কিছু ক্ষেত্রে, ালাই সংকলককে বলার ব্যতীত কিছুই করেনি (সংক্ষেপে): "চুপ কর, আমি জানি আমি কী করছি" - অর্থাৎ এটি নিশ্চিত করে যে আপনি এমন কোনও রূপান্তর করেন যা সমস্যার কারণ হতে পারে, সংকলক আপনাকে এই সম্ভাব্য সমস্যা সম্পর্কে সতর্ক করবে না। শুধু উদাহরণস্বরূপ char a=(char)123456;,। এই প্রয়োগের সঠিক ফলাফল সংজ্ঞায়িত করা হয়েছে (এর আকার এবং স্বাক্ষরের উপর নির্ভর করেchar), এবং বরং অদ্ভুত পরিস্থিতিতে বাদে, সম্ভবত দরকারী নয়। সি কাস্টগুলি কেবল সংকলনের সময় ঘটে এমন কিছু হয় (যেমন, আপনি কেবল কিছু সংকলককে কিছু উপাত্তের ব্যাখ্যা / চিকিত্সা কীভাবে করবেন) বা রান সময় সময়ে ঘটে এমন কিছু (যেমন, ডাবল থেকে প্রকৃত রূপান্তর দীর্ঘ)

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

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

জিনিসগুলিকে আরও সাধারণভাবে দেখার জন্য, পরিস্থিতিটি বেশ সহজ (কমপক্ষে আইএমও): একটি কাস্ট (স্পষ্টতই যথেষ্ট) এর অর্থ আপনি কোনও কিছুকে অন্য এক ধরণের রূপান্তর করছেন। আপনি / কখন এটি করেন তা প্রশ্ন উত্থাপন করে "কেন?" আপনি যদি সত্যিই কিছু নির্দিষ্ট ধরণের হতে চান তবে আপনি কেন এটি শুরু করতে পছন্দ করেন নি? যে আছে বলে নয় কখনোই এই ধরনের একটি রূপান্তর করতে একটি কারণ কিন্তু যে কোন সময় এটি ঘটলে, আপনার কিনা কোড পুনরায় ডিজাইন যায়নি, তাই সঠিক টাইপ সর্বত্র ব্যবহৃত হয় প্রশ্নে সূচিত করা উচিত নয়। এমনকি আপাতদৃষ্টিতে নিরীহ রূপান্তরগুলি (যেমন, পূর্ণসংখ্যা এবং ভাসমান পয়েন্টের মধ্যে) সাধারণের চেয়ে অনেক বেশি ঘনিষ্ঠভাবে পরীক্ষা করা উচিত। তাদের দেখে মনে হচ্ছেসাদৃশ্য, পূর্ণসংখ্যাগুলি সত্যই "গণনা করা" ধরণের জিনিসগুলির জন্য এবং "মাপা" ধরণের জিনিসগুলির জন্য ভাসমান পয়েন্ট হিসাবে ব্যবহার করা উচিত। পার্থক্য উপেক্ষা করে এমন কিছু পাগল বক্তব্য নিয়ে আসে যা "গড় আমেরিকান পরিবারে 1.8 শিশু রয়েছে"। এটি কীভাবে ঘটেছিল তা আমরা সকলেই দেখতে পাচ্ছি, তবে সত্য যে কোনও পরিবারে 1.8 সন্তান নেই। তাদের কাছে 1 থাকতে পারে বা তাদের কাছে 2 থাকতে পারে বা এর চেয়ে বেশি তাদের থাকতে পারে - তবে কখনও 1.8 নয়।


10
দেখে মনে হচ্ছে আপনি এখানে 'মনোযোগের ব্যবস্থায় মৃত্যু' ভুগছেন, এটি একটি দুর্দান্ত উত্তর o
স্টিভ টাউনসেন্ড

4
একটি দৃ answer় উত্তর, তবে কয়েকটি "আমি জানি না" অংশগুলি এটিকে বিস্তৃত করার জন্য শক্ত করা যেতে পারে। @ Dragontamer5788 এটি একটি ভাল উত্তর, তবে ব্যাপক নয়।
এম

5
একটি পুরো শিশু এবং নিখোঁজ পা সহ একটি শিশু হবে 1.8 শিশু। তবে খুব সুন্দর উত্তর কম কেউ। :)
ওজ

4
একটি খুব সুন্দর উত্তর অন্তত কোনও বাচ্চা নেই দম্পতি বাদ দিয়ে বাধা দেয় না

@ রোজার: বাদ দিচ্ছেন না, কেবল উপেক্ষা করছেন।
জেরি কফিন

48

এখানে অনেক ভাল উত্তর। আমি এটি দেখার উপায়টি এখানে (সি # দৃষ্টিকোণ থেকে)।

কাস্টিংয়ের অর্থ সাধারণত দুটি জিনিসের একটি:

  • আমি এই এক্সপ্রেশনটির রানটাইম টাইপ জানি কিন্তু সংকলক এটি জানেন না। সংকলক, আমি আপনাকে বলছি, রানটাইমের সময় যে অভিব্যক্তিটি এই অভিব্যক্তিটির সাথে সম্পর্কিত তা সত্যিই এই ধরণের হতে চলেছে। আপাতত, আপনি জানেন যে এই প্রকাশটি এই ধরণের হওয়ার হিসাবে বিবেচিত হবে। এমন কোড তৈরি করুন যা ধরে নেয় যে অবজেক্টটি প্রদত্ত প্রকারের হবে, বা, আমি ভুল হলে একটি ব্যতিক্রম ছুঁড়ে।

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

লক্ষ্য করুন যে সেগুলি বিপরীত । দুই ধরণের কাস্ট! এমন ক্যাসেট রয়েছে যেখানে আপনি সংকলককে বাস্তবতা সম্পর্কে ইঙ্গিত দিচ্ছেন - আরে, টাইপ অবজেক্টের এই জিনিসটি আসলে গ্রাহক প্রকারের - এবং এমন ক্যাসেট রয়েছে যেখানে আপনি সংকলককে এক ধরণের থেকে অন্য প্রকারে ম্যাপিং করতে বলছেন - আরে, আমার এই ডাবলটির সাথে মিলে যাওয়া দরকার।

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

দ্বিতীয় ধরণের কাস্ট প্রশ্নটি উত্থাপন করে "কেন প্রথম স্থানে টার্গেট ডেটা টাইপে অপারেশন করা হচ্ছে না?" যদি আপনার কীসের ফলাফলগুলির প্রয়োজন হয় তবে আপনি কেন প্রথম স্থানে ডাবল রাখছেন? আপনি কি কোন int রাখা উচিত?

কিছু অতিরিক্ত চিন্তা এখানে:

http://blogs.msdn.com/b/ericlippert/archive/tags/cast+operator/


4
এগুলি অন্তর্নিহিত লাল পতাকা বলে আমি মনে করি না। যদি আপনার কাছে এমন কোনও Fooবস্তু থাকে যা থেকে উত্তরাধিকার সূত্রে আসে Barএবং আপনি এটি একটিতে সঞ্চয় করেন List<Bar>, তবে যদি আপনি এটি Fooফিরে চান তবে আপনার জাতির প্রয়োজন হবে। সম্ভবত এটি কোনও স্থাপত্য স্তরে কোনও সমস্যা নির্দেশ করে (কেন আমরা Barএর পরিবর্তে গুলি গুলি সংরক্ষণ করছি Foo?), তবে অগত্যা নয়। এবং যদি এর Fooবৈধ কাস্টও থাকে তবে intএটি আপনার অন্যান্য মন্তব্যের সাথেও সম্পর্কিত: আপনি একটি সংরক্ষণ করছেন Foo, একটি নয় int, কারণ intএটি সর্বদা উপযুক্ত নয়।
মাইক কারন

6
@ মাইক কারন - আমি এরিকের পক্ষে উত্তর দিতে পারি না, স্পষ্টতই, তবে আমার কাছে একটি লাল পতাকাটির অর্থ "এটি কিছু ভাবা উচিত", "এটি কিছু ভুল নয়"। আর কষ্ট একটি সংরক্ষণকারী আছে Fooএকটি List<Bar>, কিন্তু ঢালাই আপনার সাথে কিছু করতে চেষ্টা করছেন সময়ে Fooএকটি জন্য উপযুক্ত নয় Bar। এর অর্থ হ'ল ভার্চুয়াল পদ্ধতিগুলির দ্বারা নির্মিত বিল্ট-ইন পলিমারফিজম ব্যতীত অন্য কোনও ব্যবস্থার মাধ্যমে সাব টাইপের জন্য পৃথক আচরণ করা হচ্ছে। সম্ভবত এটি সঠিক সমাধান, তবে প্রায়শই এটি একটি লাল পতাকা।
জেফ্রি এল হুইলেটজ

14
প্রকৃতপক্ষে. আপনি যদি প্রাণীদের তালিকার বাইরে জিনিসগুলি টেনে আনছেন এবং আপনাকে পরে সংকলকটি বলতে হবে, ওহ, যাইহোক, আমি জানতে পেরেছি যে প্রথমটি বাঘ, দ্বিতীয়টি সিংহ এবং তৃতীয়টি ভাল্লুক, তবে আপনার একটি টিপল <সিংহ, বাঘ, ভাল্লুক> ব্যবহার করা উচিত ছিল, তালিকা <অ্যানিমাল> নয়।
এরিক লিপার্ট

5
আমি আপনার সাথে একমত, তবে আমি মনে করি যে Tuple<X,Y,...>টিপলগুলির জন্য আরও ভাল সিনট্যাকটিক সমর্থন না থাকলে সি # তে ব্যাপক ব্যবহারের সম্ভাবনা নেই। এটি এমন একটি জায়গা যেখানে ভাষা "মানুষকে" সাফল্যের গর্তের দিকে ঠেলে দেওয়ার আরও ভাল কাজ করতে পারে।
কেভিবি

4
@ কেভিবি: আমি সম্মত আমরা সি # 4 এর জন্য একটি টিউপল সিনট্যাক্স গ্রহণ করার বিষয়টি বিবেচনা করেছি তবে এটি বাজেটের সাথে মানায় না। সম্ভবত সি # 5 এ; আমরা এখনও পুরো বৈশিষ্ট্য সেট কাজ করে নি। অ্যাসিঙ্কের জন্য সিটিপি একসঙ্গে পেতে খুব ব্যস্ত অথবা সম্ভবত একটি অনুমানের ভবিষ্যতের সংস্করণে।
এরিক লিপার্ট

36

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

আমি উপরে বলেছি। এটি বলার অপেক্ষা রাখে না যে সমস্ত কাস্টিং খারাপ। তবে যদি এটি এড়ানো সম্ভব হয় তবে তা করা ভাল।


4
এটি ধরে নিয়েছে যে সমস্ত ingালাই "খারাপ"; তবে এটি সম্পূর্ণ সত্য নয়। উদাহরণস্বরূপ, অন্তর্নিহিত এবং স্পষ্ট উভয় কাস্ট সমর্থন সহ সি # নিন Take সমস্যাটি তখন উপস্থিত হয় যখন কোনও কাস্ট সঞ্চালিত হয় যা (দুর্ঘটনাক্রমে) তথ্য বা টাইপ-সুরক্ষা সরিয়ে দেয় (এটি ভাষা দ্বারা পৃথক হয়)।

5
প্রকৃতপক্ষে, এটি সি ++ এ ফ্ল্যাট আউট ভুল। এই তথ্যের সাথে লক্ষ্যযুক্ত ভাষা (গুলি) অন্তর্ভুক্ত করার জন্য সম্ভবত একটি সম্পাদনা যথাযথ।
স্টিভ টাউনসেন্ড

@ এরিক - আমি যাব, তবে আমি জাভা সম্পর্কে প্রথম জিনিসটি জানি না এবং তথ্য সঠিক কিনা তা নিশ্চিত করার জন্য পর্যাপ্ত সি # বিশদও জানি না।
স্টিভ টাউনসেন্ড

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

তাই না। কিছু কাস্ট ত্রুটি জাভা সংকলক দ্বারা ধরা পড়ে, এবং কেবল জেনেরিকগুলিও নয়। বিবেচনা করুন (স্ট্রিং) 0;
লার্নের মারকুইস

18

কাস্টিং অন্তর্নিহিতভাবে খারাপ নয়, এটি কেবলমাত্র এমন কিছু অর্জনের উপায় হিসাবে প্রায়শই অপব্যবহার করা হয় যা আসলেই করা উচিত নয় বা আরও মার্জিতভাবে করা উচিত নয়।

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

আমার পরামর্শটি হ'ল আপনার প্রাথমিক ভাষায় ফোকাস করা, এবং এর সমস্ত ক্যাসেট এবং সম্পর্কিত সেরা অনুশীলনগুলি বোঝা। এটি অন্যান্য ভাষায় ভ্রমণ ভ্রমণ জানাতে হবে।

প্রাসঙ্গিক C # এর দস্তাবেজগুলি এখানে

পূর্ববর্তী এসও প্রশ্নের এখানে সি ++ বিকল্পের দুর্দান্ত সংক্ষিপ্তসার রয়েছে ।


9

আমি এখানে বেশিরভাগ সি ++ এর জন্য বলছি তবে এর বেশিরভাগটি সম্ভবত জাভা এবং সি # তেও প্রযোজ্য:

সি ++ একটি স্ট্যাটিকালি টাইপ করা ভাষা । ভাষাতে এটি আপনাকে কিছু অনুমতি দেয় (ভার্চুয়াল ফাংশন, অন্তর্নিহিত রূপান্তর), তবে মূলত সংকলক কম্পাইল-সময়ে প্রতিটি বস্তুর প্রকারটি জানে। এই জাতীয় ভাষা ব্যবহারের কারণ হ'ল সংকলন-সময়ে ত্রুটিগুলি ধরা যেতে পারে । কম্পাইলার ধরনের জানেন তাহলে aএবং b, তাহলে এটি কম্পাইল-সময়ে ধরা যখন আপনি কি করতে হবে a=bযেখানে aএকটি জটিল সংখ্যা এবং bএকটি পংক্তি।

আপনি যখনই স্পষ্টভাবে কাস্টিং করছেন তখন আপনি সংকলককে চুপ করে থাকতে বলবেন কারণ আপনি মনে করেন আপনি আরও ভাল জানেন । আপনি যদি ভুল হয়ে থাকেন তবে আপনি সাধারণত রান-টাইমে খুঁজে পাবেন । এবং রান-টাইমে খুঁজে বের করতে সমস্যা হ'ল এটি কোনও গ্রাহকের হতে পারে।


5

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

মূলত দুটি ধরণের কাস্ট থাকে: আরও সাধারণ ধরণের কাস্ট বা অন্য ধরণের কাস্ট (আরও নির্দিষ্ট)। আরও সাধারণ ধরণের কাস্টিং করা (পিতামাতার ধরণের কাস্টিং) সংকলনের সময় পরীক্ষাটি অক্ষত রাখবে। তবে অন্যান্য ধরণের (আরও নির্দিষ্ট ধরণের) castালাই সংকলন টাইম চেকিং অক্ষম করবে এবং রানটাইম চেক দ্বারা সংকলক দ্বারা প্রতিস্থাপন করা হবে। এর অর্থ আপনার কম কম সুনিশ্চিত আছে আপনার সংকলিত কোডটি সঠিকভাবে চলবে will অতিরিক্ত রানটাইম টাইপ চেকের কারণে এটি জাভা এপিআই ক্যাসে পূর্ণ is


5
সমস্ত ক্যাসেট "বাইপাস" টাইপ সুরক্ষা সি ++ এ নয়।
জেমস ম্যাকনেলিস

4
সমস্ত ক্যাসেট "বাইপাস" টাইপ সুরক্ষা সি # তে নয়।

5
সমস্ত কাস্ট জাভাতে "বাইপাস" টাইপ সুরক্ষা নয়।
এরিক রবার্টসন

11
কাস্টিংয়ে সমস্ত ক্যাসেট "বাইপাস" টাইপ সুরক্ষা নয়। ওহ অপেক্ষা করুন, সেই ট্যাগটি কোনও ভাষাকে বোঝায় না ...
এসবিআই

4
সি # এবং জাভা প্রায় সব ক্ষেত্রেই কাস্টিং আপনাকে পারফরম্যান্সের অবক্ষয় দেয়, যেহেতু সিস্টেম রান-টাইম টাইপ চেক (যা নিখরচায় নয়) করবে। সি ++ dynamic_castতে সাধারণত ধীর গতি হয় static_cast, যেহেতু সাধারণত রান-টাইম টাইপ চেকিং করতে হয় (কিছু ক্যাভ্যাট সহ: বেস টাইপে কাস্টিং সস্তা, ইত্যাদি)।
ট্র্যাভিস গোকেল

4

কিছু ধরণের ingালাই এত নিরাপদ এবং দক্ষ কারণ প্রায়শই এমনকি কাস্টিংকে মোটেই বিবেচনা করা হয় না।

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

যদি আপনি কোনও প্রকারের মতো কোনও সহজ টাইপ থেকে কোনও দীর্ঘ ইন্টের মতো বৃহত্তর প্রকারের মধ্যে ফেলে দেন তবে এটি প্রায়শই বেশ সস্তা (সাধারণত typeালাই হিসাবে একই ধরণের বরাদ্দ করার চেয়ে বেশি ব্যয়বহুল নয়) এবং আবার নিরাপদ।

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

অন্যান্য ধরণের কাস্ট তথ্য হারাতে পারে (একটি দীর্ঘ পূর্ণসংখ্যার সংক্ষিপ্ত সংখ্যার টাইপ)।

এই ঝুঁকির ক্ষেত্রে (ব্যতিক্রম যাই হোক না কেন বা আরও গুরুতর ত্রুটি হোক) এবং ব্যয়ের সমস্ত কারণই কাস্টিং এড়ানোর কারণ।

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

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


3

প্রোগ্রামারদের ভাষার বৈশিষ্ট্য ("কখনই XXX ব্যবহার করবেন না!", "এক্সএক্সএক্সকে ক্ষতিকারক হিসাবে বিবেচনা করা হয় না" ইত্যাদি) সম্পর্কে কৌতূহলপূর্ণ নিয়মে আঁকড়ে যাওয়ার ক্রমবর্ধমান প্রবণতা রয়েছে, যেখানে XXX gotoগুলি থেকে শুরু করে protectedডেটা সদস্যদের থেকে ডেটা সদস্যদের সিঙ্গেলনে অবজেক্ট অবজেক্ট অবধি মান।

এই জাতীয় নিয়ম অনুসরণ করা, আমার অভিজ্ঞতা অনুসারে, দুটি জিনিস নিশ্চিত করে: আপনি কোনও ভয়ানক প্রোগ্রামার হবেন না বা আপনি দুর্দান্ত প্রোগ্রামারও হবেন না।

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

"আমি সাধারণত যতটা সম্ভব কাস্টিং টাইপগুলি এড়িয়ে চলি" এ জাতীয় অতিরিক্ত নিয়মের একটি ভাল উদাহরণ। জাতি অনেকগুলি সাধারণ পরিস্থিতিতে অপরিহার্য। কিছু উদাহরণ:

  1. তৃতীয়-পক্ষের কোডের সাথে আন্তঃব্যবস্থাপনা করার সময় (বিশেষত যখন সেই কোডটি এস দ্বারা পরিপূর্ণ হয় typedef)। (উদাহরণ: GLfloat<--> double<--> Real।)
  2. বেস ক্লাস পয়েন্টার / রেফারেন্স থেকে উত্পন্ন থেকে কাস্টিং: এটি এত সাধারণ এবং প্রাকৃতিক যে সংকলকটি স্পষ্টভাবে এটি করবে। যদি এটি স্পষ্ট করে পাঠযোগ্যতা বৃদ্ধি করে, castালাই পিছনের দিকে নয়, এক ধাপ এগিয়ে!
  3. ভিত্তি থেকে উত্পন্ন ক্লাস পয়েন্টার / রেফারেন্সে কাস্টিং: এমনকি সাধারণ, এমনকি ডিজাইন করা কোডেও। (উদাহরণ: ভিন্ন ভিন্ন ধারক)
  4. বাইনারি সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশন বা অন্যান্য নিম্ন-স্তরের কোডের অভ্যন্তরে অন্তর্নির্মিত ধরণের কাঁচা বাইটে অ্যাক্সেসের প্রয়োজন।
  5. যে কোনও সময় যখন এটি কেবল সাধারণ প্রাকৃতিক, সুবিধাজনক এবং ভিন্ন ধরণের ব্যবহারের জন্য পাঠযোগ্য। (উদাহরণ: std::size_type-> int।)

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


1

কে ডেভেলপারের উত্তরটি বিশদভাবে জানাতে , এটি সহজাতভাবে টাইপ-নিরাপদ নয়। Ingালাইয়ের সাথে, আপনি যা কাস্ট করছেন এবং কাস্টিংয়ের সাথে মিলবে তার কোনও গ্যারান্টি নেই এবং যদি তা ঘটে থাকে তবে আপনি রানটাইম ব্যতিক্রম পাবেন যা সর্বদা একটি খারাপ জিনিস।

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


1

সি # এর ক্ষেত্রে, বক্সিংয়ের ক্ষেত্রে / আনবক্সিং ওভারহেডগুলি মান ধরণের সাথে জড়িত থাকার কারণে কাস্টিংয়ের সময় একজনকে আরও সতর্কতা অবলম্বন করা উচিত।


1

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


1

আপনি যদি কোনও শর্ত পূরণ করেন তবে আপনি কেবল কোনও প্রকারে কোনও বস্তু নিক্ষেপ করেছেন:

  1. আপনি জানেন যে এটি ধরণের
  2. সংকলক না

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

এখন আপনি যখন একটি কাস্ট করেন, তারপরে এর 2 টি ভিন্ন কারণ থাকতে পারে:

  1. ধরণের সম্পর্কগুলি প্রকাশের ক্ষেত্রে আপনি একটি খারাপ কাজ করেছেন।
  2. ভাষাগুলি টাইপ সিস্টেমটি কেবল তাদের বাক্য গঠনের পক্ষে যথেষ্ট মত প্রকাশ করে না।

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

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


0

সাধারণত টেমপ্লেট (বা জেনেরিকস) কাস্টের চেয়ে বেশি প্রকারের সুরক্ষিত থাকে। সেই বিষয়ে, আমি বলব ingালাইয়ের সাথে সম্পর্কিত একটি সমস্যা টাইপ-সুরক্ষা। তবে বিশেষত ডাউন কাস্টিংয়ের সাথে যুক্ত আরও একটি সূক্ষ্ম সমস্যা রয়েছে: ডিজাইন। আমার দৃষ্টিকোণ থেকে কমপক্ষে, ডাউনকাস্টিং হ'ল একটি কোড গন্ধ, এটি একটি ইঙ্গিত দেয় যে আমার ডেসিংয়ের সাথে কিছু ভুল হতে পারে এবং আমার আরও তদন্ত করা উচিত। কেন সহজ: আপনি যদি বিমূর্ততাগুলি ঠিক "পেয়ে" থাকেন তবে আপনার কেবল এটির প্রয়োজন হবে না! উপায় দ্বারা দুর্দান্ত প্রশ্ন ...

চিয়ার্স!


0

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

(আমি স্পষ্টভাবে আর্কিটেকচারকে স্বাধীন বাইটোকোড এবং আইএল উপেক্ষা করছি))

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