কাস্টিং: (NewType) বনাম NewType হিসাবে অবজেক্ট

Possible Duplicate:
Casting vs using the 'as' keyword in the CLR

আসলে এই দুটি কাস্ট্টর মধ্যে পার্থক্য কি?

SomeClass sc = (SomeClass)SomeObject;
SomeClass sc2 = SomeObject as SomeClass;

সাধারণত, তারা উভয় স্পষ্ট করা নির্দিষ্ট জিনিস থেকে casts উচিত?

0
কোনটি মজার কারণ এইটি 3 মাস আগে পোস্ট করা হয়েছিল :) কিন্তু অন্যের আরো বিস্তারিত উত্তর রয়েছে।
যোগ লেখক Michael Stum, উৎস
এছাড়াও stackoverflow.com/questions/496096/… । এই এক ছিল প্রথম, কিন্তু যে একটি ভাল উত্তর আছে।
যোগ লেখক Jay Bazuzi, উৎস
আপনি দ্বিতীয় প্রাচীনতম পোস্টটি পোস্ট করেছেন যা অন্য একটি ডুপ্লিকেটের (প্রথমটি লক করা আছে)! অভিনন্দন, আমি অনুমান?
যোগ লেখক gparyani, উৎস

12 উত্তর

এখানে আমার পদ্ধতির জন্য যা ভাল তা সিদ্ধান্ত নিতে চেষ্টা করার সময় আমি তাদের ব্যবহার করে প্রতিটি অনুসরণ করে যে প্রক্রিয়া মনে রাখার একটি ভাল উপায়।

DateTime i = (DateTime)value;
// is like doing
DateTime i = value is DateTime ? value as DateTime : throw new Exception(...);

এবং পরবর্তীটি এটি কি করে অনুমান করা সহজ হবে

DateTime i = value as DateTime;

প্রথম ক্ষেত্রে যদি মূল্যকে বাদ দিয়ে অন্য কোনও ক্ষেত্রে বাদ দেওয়া যায় না তবে যদি মূল্য ঢালাই না যায়, তবে আমি বাতিল হয়ে যাব।

সুতরাং প্রথম ক্ষেত্রে যদি একটি হার্ড স্টপ তৈরি করা হয়, যদি অন্য কাস্টের মধ্যে নিক্ষেপ ব্যর্থ হয় তবে একটি নরম স্টপ তৈরি করা হয় এবং পরবর্তীতে আপনি একটি NullReferenceException সম্মুখীন হতে পারে।

0
যোগ

এবং সম্পূর্ণতা অনুরোধে, এরিক লিপার্টের একটি ব্লগ পোষ্ট পার্থক্য এবং কিছু সতর্কতা সম্পর্কে।

0
যোগ

এটি পার্স এবং ট্র্যাপার পার্সের পার্থক্য মত। আপনি চেষ্টা করলে TryParse ব্যবহার করলে এটি ব্যর্থ হতে পারে, কিন্তু যখন আপনার দৃঢ় নিশ্চয়তা থাকে তখন আপনি প্যারেস ব্যবহার করতে ব্যর্থ হবেন না।

0
যোগ

এছাড়াও মনে রাখবেন যে আপনি শুধুমাত্র একটি রেফারেন্স ধরন বা একটি nullable ধরনের সঙ্গে শব্দ হিসাবে ব্যবহার করতে পারেন

অর্থাৎ,

double d = 5.34;
int i = d as int;

কম্পাইল করবে না

double d = 5.34;
int i = (int)d;

কম্পাইল করবে।

0
যোগ
কারণ একটি কাস্টিং রূপান্তর না
যোগ লেখক CiNN, উৎস

উত্স প্রকার লক্ষ্য ধরনের নিক্ষেপ করা যাবে না যদি সাবেক একটি ব্যতিক্রম নিক্ষেপ করা হবে। আধুনিক ফলাফল sc2 একটি নীল রেফারেন্স হচ্ছে, কিন্তু কোন ব্যতিক্রম হবে।

[সম্পাদনা]

আমার মূল উত্তর অবশ্যই অবশ্যই সর্বাধিক স্পষ্ট পার্থক্য, কিন্তু এরিক লিপার্ট পয়েন্ট করে দেয় , এটি কেবলমাত্র একটি নয়। অন্যান্য পার্থক্য অন্তর্ভুক্ত:

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

এবং অবশেষে, 'যেমন' বনাম কাস্ট অপারেটর ব্যবহার করে, আপনিও বলছেন "আমি নিশ্চিত না যে এটি সফল হবে কিনা।"

0
যোগ

তারা বিভিন্ন ব্যতিক্রম ফাঁস হবে।
(): NullReferenceException
হিসাবে: invalidCastException
ডিবাগিংয়ের জন্য কোনটি সাহায্য করতে পারে।

"হিসাবে" মূল উদ্দেশ্য বস্তু নিক্ষেপ করার প্রচেষ্টা এবং যদি নিক্ষিপ্ত ব্যর্থ হয়, নাল চুপি চুপি ফিরে হয়। নিক্ষেপ ব্যর্থ হলে,() কাস্ট অপারেটর অবিলম্বে একটি ব্যতিক্রম নিক্ষেপ করা হবে।

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

For code examples and a further explanation: http://blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html

0
যোগ
(-1) হিসাবে একটি InvalidCastException নিক্ষেপ করা হবে না।
যোগ লেখক Keith, উৎস

এই সমস্ত রেফারেন্স প্রকারে প্রযোজ্য, মান ধরনের হিসাবে কীওয়ার্ড হিসাবে ব্যবহার করা যায় না কারণ তারা নল হতে পারে না।

//if I know that SomeObject is an instance of SomeClass
SomeClass sc = (SomeClass) someObject;


//if SomeObject *might* be SomeClass
SomeClass sc2 = someObject as SomeClass;

নিক্ষেপ সিনট্যাক্স দ্রুত হয়, কিন্তু শুধুমাত্র সফল হলে, এটি ব্যর্থ হতে অনেক ধীর।

সেরা কোডটি হিসাবে ব্যবহার করতে হবে যখন আপনি এই টাইপটি জানেন না:

//we need to know what someObject is
SomeClass sc;
SomeOtherClass soc;

//use as to find the right type
if( ( sc = someObject as SomeClass ) != null ) 
{
    //do something with sc
}
else if ( ( soc = someObject as SomeOtherClass ) != null ) 
{
    //do something with soc
}

তবে যদি আপনি একেবারে নিশ্চিত হন যে someObject একটি SomeClass এর একটি উদাহরণ আছে তারপর cast ব্যবহার করুন।

.Net 2 বা উপরের জেনেরিক্সে বোঝা যায় যে আপনি খুব কমই একটি রেফারেন্স ক্লাসের একটি অ-টাইপকৃত দৃষ্টান্ত থাকতে হবে, যাতে পরবর্তীতে কম ব্যবহৃত হয়।

0
যোগ

ভাল হিসাবে 'অপারেটর হিসাবে' সাহায্য করে "আপনি আপনার সমস্যা পথ কম দায়ী কারণ যখন এটি একটি অসঙ্গত উদাহরণ প্রদান করা হয় এটি নাল ফিরে আসবে, সম্ভবত আপনি একটি পদ্ধতি যা এটি অন্য একটি পাস করবে এবং তাই এবং অবশেষে আপনি একটি NullReferenceException পাবেন যা আপনার ডিবাগিং কঠিন করা হবে

এটা অপব্যবহার করবেন না। 99% ক্ষেত্রে সরাসরি ডাস্ট অপারেটর ভাল।

0
যোগ
খুব ভাল উপদেশ এখানে। পাঠকদের, এই বিবেচনা করুন।
যোগ লেখক mbadawi23, উৎস

Rytmis এর মন্তব্য এ প্রসারিত করতে, আপনি হিসাবে structs জন্য অভিব্যক্তি (মান প্রকার), তাদের কোন নাল মান আছে হিসাবে।

0
যোগ

"এ" ব্যবহার করে টাইপকার্ড অবশ্যই দ্রুততর হয় যখন নিক্ষেপ ব্যর্থ হয়, কারণ এটি একটি ব্যতিক্রম নিক্ষেপের ব্যয় এড়িয়ে চলে।

কিন্তু কাস্ট সফল হলে তা দ্রুততর হয় না। গ্রাফিক এ http://www.codeproject.com/KB/cs/csharpcasts.aspx বিভ্রান্তিকর কারণ এটি তা পরিমাপ করে না তা ব্যাখ্যা করে না।

নিচের লাইন হল:

  • আপনি যদি কাস্ট থেকে সফল হতে প্রত্যাশা করেন (যেমন একটি ব্যর্থতা অসাধারণ হবে), একটি ঢাল ব্যবহার করুন।

  • যদি আপনি না জানেন যে এটি সফল হবে, "হিসাবে" অপারেটর ব্যবহার করুন এবং নাল জন্য ফলাফল পরীক্ষা।

0
যোগ

দুটি পদ্ধতির মধ্যে একটি পার্থক্য হচ্ছে প্রথম ((SomeClass) obj) একটি টাইপ কনভার্টার কে বলা হবে।

0
যোগ

VB.NET অভিজ্ঞতার সাথে আপনার জন্য, (টাইপ) DirectCast হিসাবে একই এবং "টাইপ হিসাবে" TryCast হিসাবে একই।

0
যোগ