ভিবি.এনইটি-তে ডিরেক্টকাস্ট () এবং সিটাইপ () এর মধ্যে পার্থক্য


102

আমি একজন অভিজ্ঞ সি / সি ++ / সি # প্রোগ্রামার যিনি সবে VB.NET এ প্রবেশ করেছেন। আমি সাধারণত ক্যাসেটগুলির জন্য সিটিটাইপ (এবং সিআইএনটি, সিবুল, সিএসটিআর) ব্যবহার করি কারণ এটি কম অক্ষর এবং কাস্টিংয়ের প্রথম উপায় ছিল যা আমি প্রকাশ পেয়েছিলাম তবে আমি ডাইরেক্টকাস্ট এবং ট্রাইকাস্ট সম্পর্কেও সচেতন।

সহজভাবে, ডাইরেক্টকাস্ট এবং সিটি টাইপের মধ্যে কোনও পার্থক্য রয়েছে (কাস্ট, পারফরম্যান্স ইত্যাদির প্রভাব)? আমি ট্রাইকাস্টের ধারণাটি বুঝতে পারি।


6
সঠিক এই প্রতিলিপি DirectCast, CType, TryCast সঙ্গে কাস্টিং DataTypes stackoverflow.com/questions/2703585/...
MarkJ

উত্তর:


184

প্রথম বিষয়টি লক্ষ করুন VB.NET- এর সি # এর ingালাইয়ের (type)instanceপ্রক্রিয়াটির সরাসরি এনালগ নেই । আমি এটি এনেছি কারণ এটি দুটি ভিবি.এনইটি অপারেটরের তুলনায় প্রাথমিক পয়েন্ট হিসাবে কার্যকর (এবং তারা অপারেটর, না ফাংশন, যদিও তাদের ফাংশন শব্দার্থক রয়েছে)।

DirectCast()সি # ingালাই অপারেটরের চেয়ে আরও কঠোর। এটি কেবল তখনই আপনাকে কাস্ট করতে দেয় যখন আইটেমটি ইতিমধ্যে কাস্ট করা হচ্ছে আপনি যে ধরণের কাস্ট করছেন। আমি বিশ্বাস করি এটি এখনও মূল্য ধরণের আনবক্স করবে, তবে অন্যথায় এটি কোনও রূপান্তর করবে না। সুতরাং, উদাহরণস্বরূপ, আপনার কাছ থেকে নিক্ষেপ করতে পারবে না shortথেকে int, মত আপনি একটি উইথ সি শার্প পারা (int)কাস্ট করুন। তবে আপনি IEnumerableযদি একটি অন্তর্নির্মিত IEnumerableঅবজেক্ট ভেরিয়েবলটি সত্যিই একটি হয় তবে আপনি একটি অ্যারে থেকে কাস্ট করতে পারেন Array। এবং অবশ্যই আপনি Objectযে কোনও কিছু থেকে কাস্ট করতে পারেন , ধরে নিচ্ছেন যে আপনার অবজেক্টের উদাহরণটি আসলে উত্তরাধিকার গাছের মধ্যে আপনার কাস্টের ধরণের নীচে।

এটি আকাঙ্খিত কারণ এটি আরও দ্রুত । এখানে রূপান্তর ও প্রকারের পরীক্ষা কম হওয়ার দরকার রয়েছে needs

CType()সি # ingালাই অপারেটরের চেয়ে কম কঠোর। এটি (int)স্ট্রিংকে পূর্ণসংখ্যায় রূপান্তর করার মতো সাধারণ স্টাইলের castালাইয়ের সাহায্যে আপনি না করতে পারে এমনগুলি করবে। এটিতে Convert.To___()সি # তে কল করার মতোই শক্তি রয়েছে , যেখানে এটি ___আপনার অভিনেতার টার্গেটের ধরণ।

এটি পছন্দসই কারণ এটি খুব শক্তিশালী। যাইহোক, এই শক্তি কর্মক্ষমতা ব্যয় করে আসে; এটি DirectCast()সি বা এর কাস্ট অপারেটরের মতো দ্রুত নয় কারণ castালাই শেষ করতে এটির জন্য প্রচুর কাজ করার প্রয়োজন হতে পারে। সাধারণত DirectCast()যখন আপনি পারেন পছন্দ করা উচিত ।

অবশেষে, আপনি একটি কাস্টিং অপারেটর মিস করেছেন: TryCast()যা সি # এর asঅপারেটরের সরাসরি উপমা ।


24
+1 আমি বলব এর কঠোরতা DirectCastআরেকটি সুবিধা। আপনি যদি ভুল করেন তবে সংকলকটি আপনাকে অবিলম্বে জানায়, তবে CTypeএকটি ভুলের সাথে রান-টাইমে মাঝে মধ্যে ভুল আচরণ হতে পারে - হতে পারে বিভিন্ন আঞ্চলিক সেটিংস সহ কিছু ব্যবহারকারী মেশিনে।
মার্কজে

4
দুর্দান্ত উত্তর। সুতরাং জটিলতা ক্রমানুসারে (ছোট বড় করার জন্য): DirectCast, TryCast, CType/ Convert.ToXYZ(), C<xyz>()সঠিক হবে?
নীতিবাক্য

4
@মোটো - বন্ধ সি <xyz> () "ফাংশনগুলি" তালিকায় উচ্চতর স্থানান্তরিত হওয়া উচিত, কারণ তারা কার্যকারিতা শব্দার্থক থাকলেও প্রকৃতপক্ষে ফাংশনগুলির চেয়ে অপারেটর। এই ধরণের ধরণেরগুলির জন্য, তারা সি # এর (টাইপ) ingালাইয়ের খুব কাছাকাছি, তবে আরও কিছুটা কাজ করবে will
জোয়েল কোহোর্ন

4
আপনার মন্তব্যের জন্য @ মারকজে +1, তবে নোটটি DirectCastকেবল ক্লাসগুলির সাথে কঠোর, ইন্টারফেস নয় (কারণ আপনার সিওএম টাইপ থাকতে পারে - এবং সম্ভবত অন্যরাও - যা প্রকৃতপক্ষে। নেট প্রকারের .GetInterfacesতালিকা দ্বারা সংজ্ঞায়িত নয় এমন ইন্টারফেস প্রয়োগ করে )।
মার্ক হার্ট

4
@ জোয়েলকোহূর্ন +1, কিন্তু আসলে TryCast()এবং asঠিক একই রকম নয় the TryCast()কেবলমাত্র রেফারেন্স ধরণের সাথে কাজ করে, যখন asএমন কোনও কিছু দিয়ে কাজ করে যা শূন্য হতে পারে। সুতরাং int? icast = myNum as int?;ঠিক কাজ করবে, তবে Dim icast as Integer? = TryCast(myNum, Integer?)একটি সংকলক ত্রুটি দেবে। দুটি ভাষার মধ্যে আরও একটি অদ্ভুত পার্থক্য। lol
CptRobi

12

আপনার সাথে CTypeএই জাতীয় কিছু লিখতে পারেন Ctype("string",Integer)। তবে DirectCastউপরের বিবৃতিটি সংকলনের সময় ত্রুটি দেবে।

 Dim a As Integer = DirectCast("1", Integer) 'Gives compiler error
 Dim b As Integer = CType("1", Integer) 'Will compile

0

DirectCastএর চেয়ে বেশি সীমাবদ্ধ CType

উদাহরণস্বরূপ, এটি একটি ত্রুটি ফেলবে:

Sub Main()
    Dim newint As Integer = DirectCast(3345.34, Integer)
    Console.WriteLine(newint)
    Console.ReadLine()
End Sub

এটি ভিজ্যুয়াল স্টুডিও আইডিইতেও প্রদর্শিত হবে।

এটি তবে ত্রুটি ছুঁড়ে না:

Sub Main()
    Dim newint As Integer = CType(3345.34, Integer)
    Console.WriteLine(newint)
    Console.ReadLine()
End Sub
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.