নাল চেক না থাকলেও কাস্টের পরিবর্তে "হিসাবে" ব্যবহার করা কি বোধগম্য? [বন্ধ]


351

বিকাশ ব্লগগুলিতে, অনলাইন কোডের উদাহরণ এবং (সম্প্রতি) এমনকি একটি বইতেও আমি কোডের মতো হোঁচট খেতে থাকি:

var y = x as T;
y.SomeMethod();

বা, আরও খারাপ:

(x as T).SomeMethod();

আমার কাছে তা বোঝা যায় না। আপনি কি নিশ্চিত যে হন xধরনের হয় T, আপনি একটি সরাসরি ঢালাই ব্যবহার করা উচিত: (T)x। আপনি যদি নিশ্চিত না হন asতবে আপনি ব্যবহার করতে পারেন তবে nullকিছু অপারেশন করার আগে পরীক্ষা করা দরকার check উপরের কোডটি যা কিছু করে তা হ'ল (কার্যকর) InvalidCastExceptionএকটি (অকেজো) রূপান্তর করা NullReferenceException

আমিই কি একমাত্র মনে করি যে এই asকীওয়ার্ডটির নির্মম অপব্যবহার ? বা আমি কি স্পষ্ট কিছু মিস করেছি এবং উপরের প্যাটার্নটি আসলে তাৎপর্যপূর্ণ?


56
(এস হিসাবে চুম্বন) দেখতে মজাদার হবে। স্টিভসসুচা (); তবে আমি একমত, এটি একটি অপব্যবহার।
SwDevMan81

5
এটি লেখার চেয়ে অনেক শীতল ((T)x).SomeMethod(), তাই না? ;) (স্রেফ ঠাট্টা করা, আপনি অবশ্যই ঠিক আছেন!)
লুসারো

8
@ পি বাবা আমি একমত নই, পুরোপুরি ভাল প্রশ্ন (এই কোড প্যাটার্নটি আসলে কী তা বোঝায়) এবং খুব দরকারী। প্রশ্নটির জন্য +1 এবং যে কেউ বন্ধ করতে ভোট দেয় তার কাছে একটি ভ্রূণ।
মার্কজে

9
লুসরনো ঠিক বলেছেন, এই কোডিং প্যাটার্নটি প্রথম বন্ধনী এড়ানোর চেষ্টা করে প্ররোচিত করা হয়েছে। লিস্পের সংস্পর্শে আসার পরেও অযোগ্য
হ্যান্স প্যাস্যান্ট

13
অপ্টিমাইজড কোড (f as T).SomeMethod()
:;

উত্তর:


252

আপনার বোঝা সত্য। এটি আমার কাছে মাইক্রো-অপ্টিমাইজ করার চেষ্টা করার মতো শোনাচ্ছে। আপনি যখন টাইপ সম্পর্কে নিশ্চিত হন তখন আপনার স্বাভাবিক কাস্ট ব্যবহার করা উচিত। আরও বুদ্ধিমান ব্যতিক্রম উত্পন্ন করার পাশাপাশি এটি দ্রুত ব্যর্থ হয়। আপনি যদি টাইপ সম্পর্কে আপনার ধৃষ্টতা চলেছেন ভুল, আপনার প্রোগ্রাম অবিলম্বে ব্যর্থ হবে এবং আপনি ব্যর্থতা অবিলম্বে বদলে অপেক্ষা কারণ দেখার জন্য একটি জন্য সক্ষম হবেন NullReferenceExceptionবা ArgumentNullExceptionবা এমনকি একটি লজিক্যাল ত্রুটি ভবিষ্যতে একদা। সাধারণভাবে, একটি asঅভিব্যক্তি যা nullকোথাও চেক অনুসরণ করে না তা হ'ল কোড গন্ধ।

অন্যদিকে, যদি আপনি কাস্ট সম্পর্কে নিশ্চিত না হন এবং এটি ব্যর্থ হওয়ার প্রত্যাশা করেন, তবে আপনাকে asএকটি try-catchব্লক মোড়ানো সাধারণ কাস্টের পরিবর্তে ব্যবহার করা উচিত । তদ্ব্যতীত, asকাস্টের পরে কোনও প্রকারের চেক ব্যবহারের পরামর্শ দেওয়া হয়। পরিবর্তে:

if (x is SomeType)
   ((SomeType)x).SomeMethod();

যা উত্পন্ন isinstনির্দেশ জন্য isশব্দ, এবং একটি castclassনির্দেশ ঢালাই (কার্যকরভাবে ঢালাই দুইবার করণ), আপনি ব্যবহার করা উচিত:

var v = x as SomeType;
if (v != null)
    v.SomeMethod();

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


নিম্নলিখিত কোডটি উত্পাদন কোডে ব্যবহারের জন্য প্রস্তাবিত নয় । আপনি যদি সত্যিই সি # তে এই জাতীয় মৌলিক নির্মাণকে ঘৃণা করেন তবে আপনি ভিবি বা অন্য কোনও ভাষাতে স্যুইচ করার বিষয়টি বিবেচনা করতে পারেন।

যদি কেউ কাস্ট সিনট্যাক্সকে মারাত্মকভাবে ঘৃণা করে তবে সে কাস্ট নকল করার জন্য একটি এক্সটেনশন পদ্ধতি লিখতে পারে:

public static T To<T>(this object o) { // Name it as you like: As, Cast, To, ...
    return (T)o;
}

এবং একটি ঝরঝরে [?] বাক্য গঠন ব্যবহার করুন:

obj.To<SomeType>().SomeMethod()

5
আমি মনে করি রেসের অবস্থাটি অপ্রাসঙ্গিক। আপনি যদি এই সমস্যাটি ভোগ করে থাকেন তবে আপনার কোডটি থ্রেড-নিরাপদ নয় এবং "হিসাবে" কীওয়ার্ড ব্যবহার না করে এটি সমাধানের আরও নির্ভরযোগ্য উপায় রয়েছে। বাকি উত্তরের জন্য +1
আরমরিসি

10
@ আরএমরিসি: আমার মনে একটি কমপক্ষে একটি উদাহরণ রয়েছে: ধরে নিন আপনার কাছে এমন একটি cacheবস্তু রয়েছে যা অন্য থ্রেড এটিকে সেট করে এটি অকার্যকর করার চেষ্টা করে null। লক-ফ্রি পরিস্থিতিতে, এই ধরণের জিনিসগুলি উত্থিত হতে পারে।
মেহরদাদ আফশারি

10
+ + ঢালাই FxCop থেকে "অকারণে নিক্ষেপ করবেন না" সতর্কবার্তা আরম্ভ করার জন্য যথেষ্ট হয়: msdn.microsoft.com/en-us/library/ms182271.aspx যে যথেষ্ট কারণ কনস্ট্রাক্ট এড়াতে হওয়া উচিত।
ডেভিড স্মিট

2
আপনার এক্সটেনশন পদ্ধতিগুলি এড়ানো উচিত Object। একটি মান ধরণের পদ্ধতিটি ব্যবহারের কারণে এটি অকারণে বাক্সে আসবে।
MgSam

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


40

'হিসাবে' ব্যবহার করা ব্যবহারকারীর সংজ্ঞায়িত রূপান্তরগুলি প্রয়োগ করে না যেখানে কাস্ট তাদের উপযুক্ত যেখানে ব্যবহার করবে। এটি কিছু ক্ষেত্রে একটি গুরুত্বপূর্ণ পার্থক্য হতে পারে।


5
এটি মনে রাখা গুরুত্বপূর্ণ। এরিক লিপার্ট এখানে এটি পেরেছেন: ব্লগস.এমএসডিএন
পি ড্যাডি

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

36

আমি এই সম্পর্কে এখানে কিছু লিখেছি:

http://blogs.msdn.com/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx

আমি আপনার বক্তব্য বুঝতে পারি। এবং আমি এর জোরের সাথে একমত হই: যে একজন castালাই অপারেটর যোগাযোগ করেন "আমি নিশ্চিত যে এই বস্তুটি সেই ধরণের রূপান্তরিত হতে পারে, এবং আমি ভুল হলে আমি একটি ব্যতিক্রম ঝুঁকি নিতে ইচ্ছুক, যেখানে" হিসাবে "অপারেটর যোগাযোগ করে "আমি নিশ্চিত নই যে এই বস্তুটি সেই ধরণের রূপান্তরিত হতে পারে; আমি ভুল হলে আমাকে শূন্য করুন"।

তবে, একটি সূক্ষ্ম পার্থক্য আছে। (এক্স হিসাবে টি হিসাবে)। "যা কিছু () যোগাযোগ করে" আমি জানি না যে কেবল এক্সকে একটি টিতে রূপান্তর করা যায়, তবে তদুপরি, এটি করার ক্ষেত্রে কেবল রেফারেন্স বা আনবক্সিং রূপান্তর জড়িত থাকে এবং তদ্ব্যতীত, এক্সটি শূন্য হয় না "। এটি ((টি) x) এর চেয়ে পৃথক তথ্য যোগাযোগ করে W যা কিছু (), এবং সম্ভবত কোডটির লেখক এর ইচ্ছাই তাই।


1
আমি আপনার শেষ বাক্যে কোডের লেখকের আপনার অনুমানমূলক প্রতিরক্ষার সাথে একমত নই। [ যেহেতু নালার উদ্দেশ্য নয়] ((T)x).Whatever() তাও যোগাযোগ করে xএবং আমি অত্যন্ত সন্দেহ করি যে একজন লেখক সাধারণত যত্নবান হন যে রূপান্তরটি Tকেবলমাত্র রেফারেন্স বা আনবক্সিং রূপান্তরগুলির সাথে ঘটেছিল, অথবা যদি এটির জন্য কোনও ব্যবহারকারী-সংজ্ঞায়িত বা প্রতিনিধিত্ব-পরিবর্তনকারী রূপান্তর প্রয়োজন। সর্বোপরি, আমি যদি সংজ্ঞায়িত করি public static explicit operator Foo(Bar b){}তবে এটি স্পষ্টভাবে আমার অভিপ্রায় যা Barসামঞ্জস্যপূর্ণ বলে বিবেচিত Foo। এটি বিরল যে আমি এই রূপান্তর এড়াতে চাই।
পি ড্যাডি

4
ভাল, সম্ভবত কোডের বেশিরভাগ লেখক সেই সূক্ষ্ম পার্থক্য তৈরি করবেন না। আমি ব্যক্তিগতভাবে হতে পারি তবে আমি যদি থাকি তবে আমি সেই প্রভাবটিতে একটি মন্তব্য যুক্ত করব।
এরিক লিপার্ট

16

আমি প্রায়ই এই বিভ্রান্তিকর নিবন্ধের উল্লেখগুলি প্রমাণ হিসাবে দেখেছি যে "" হিসাবে "castালাইয়ের চেয়ে দ্রুত is

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

আপনি যদি পরিমাপগুলি করার জন্য সময় নেন, তবে আপনি দেখতে পাবেন যে কাস্টিং আপনার প্রত্যাশাটি তত দ্রুত হয় "হিসাবে" চেয়ে ।

আমি সন্দেহ করি এটি "কার্গো কাল্ট" কাস্টারের পরিবর্তে মূল শব্দ হিসাবে ব্যবহারের এক কারণ হতে পারে।


2
লিঙ্কটির জন্য ধন্যবাদ, এটি খুব আকর্ষণীয়। কীভাবে আমি নিবন্ধটি বোঝা থেকে তিনি করে অ ব্যতিক্রম ক্ষেত্রে তুলনা করুন। তবুও, নিবন্ধটি .NET 1.1 এর জন্য লেখা হয়েছিল, এবং মন্তব্যগুলি নির্দেশ করে যে এটি নেট নেট ২.০ এ পরিবর্তিত হয়েছে: উপস্থাপনাটি এখন প্রায় সমান, উপসর্গের কাস্টটি কিছুটা দ্রুত গতির সাথেও রয়েছে।
হেইনজি

1
নিবন্ধটি বোঝায় যে তিনি অ-ব্যাতিক্রমের ক্ষেত্রে তুলনা করছেন, তবে আমি অনেকদিন আগে কিছু পরীক্ষা করেছি এবং তার দাবিযুক্ত ফলাফলগুলি পুনরায় উত্পাদন করতে সক্ষম হইনি, এমনকি নেট নেট। এক্স। এবং নিবন্ধটি যেহেতু মানদণ্ড চালানোর জন্য ব্যবহৃত কোড সরবরাহ করে না, তাই কি তুলনা করা যায় তা বলা অসম্ভব।
জো

"কার্গো কাল্ট" - নিখুঁত। সম্পূর্ণ তথ্যের জন্য "কার্গো কাল্ট সায়েন্স রিচার্ড ফেনম্যান" দেখুন।
বব ডেনি

11

সরাসরি কাস্টটির চেয়ে আরও বেশি এক জোড়া বন্ধনী প্রয়োজন as কীওয়ার্ডের । এমনকি আপনি যে ধরণেরটি 100% নিশ্চিত তা সত্ত্বেও এটি ভিজ্যুয়াল বিশৃঙ্খলা হ্রাস করে।

যদিও ব্যতিক্রম বিষয়টিতে একমত হয়েছেন। তবে কমপক্ষে আমার asজন্য, nullপরে সিলেক্ট করার জন্য সিদ্ধের সর্বাধিক ব্যবহার , যা আমি একটি ব্যতিক্রম ধরা ভাল বলে মনে করি।


8

আমি যখন "হিসাবে" ব্যবহার করি তখন 99% হয় যখন আমি নিশ্চিত না যে আসল অবজেক্টের ধরণটি কী

var x = obj as T;
if(x != null){
 //x was type T!
}

এবং আমি স্পষ্ট কাস্ট ব্যতিক্রমগুলি ধরতে চাই না বা "এটি" ব্যবহার করে দুবার কাস্ট করতে চাই না:

//I don't like this
if(obj is T){
  var x = (T)obj; 
}

8
আপনি স্রেফ সঠিক ব্যবহারের ক্ষেত্রে বর্ণনা করেছেন as। অন্য 1% কি?
পি বাবা

টাইপোয়? =) আমি এই সঠিক কোড স্নিপেট ব্যবহার করার সময়টির 99% অর্থ বোঝাতে চেয়েছি , আবার কখনও কখনও আমি কোনও পদ্ধতি কল বা অন্য কোনও জায়গায় "হিসাবে" ব্যবহার করতে পারি।
ম্যাক্স গ্যালকিন

ডিওহ, এবং দ্বিতীয় জনপ্রিয় উত্তরের চেয়ে কম কার্যকর কীভাবে ???
সর্বাধিক গালকিন

2
+1 আমি সম্মত হই যে এটিকে ডাকা রুবেন ফারিয়াসের উত্তরের মতো মূল্যবান - লোকেরা আশা করি এখানে আসবে এবং এটি একটি দরকারী উদাহরণ হবে
মতই

8

এটি কেবল কারণ লোকেরা দেখতে পছন্দ করে, এটি খুব পাঠযোগ্য।

আসুন এটির মুখোমুখি হোন: সি-জাতীয় ভাষায় ingালাই / রূপান্তরকারী অপারেটরটি অত্যন্ত ভয়ঙ্কর, পাঠযোগ্যতা-ভিত্তিক। আমি এটি আরও ভাল চাই যদি সি # এর জাভাস্ক্রিপ্টের বাক্য গঠনটি গ্রহণ করে:

object o = 1;
int i = int(o);

বা একটি toঅপারেটর, .ালাই সমতুল্য সংজ্ঞায়িত করুনas :

object o = 1;
int i = o to int;

ঠিক তাই আপনি জানেন, আপনি যে জাভাস্ক্রিপ্ট সিনট্যাক্সটি উল্লেখ করেছেন সেটিও সি ++ এ অনুমোদিত।
পি বাবা

@ প্যাডি: এটি সরাসরি ১০০% সামঞ্জস্যপূর্ণ বিকল্প সিনট্যাক্স নয় এবং এটির মতো নয় (অপারেটর এক্স বনাম রূপান্তর কনস্ট্রাক্টর)
রুবেন বারটেলিংক ২

আমি এটিকে dynamic_cast<>()(এবং অনুরূপ) এর সি ++ সিনট্যাক্স ব্যবহার করতে পছন্দ করব । আপনি কুরুচিপূর্ণ কিছু করছেন, এটি কুরুচিপূর্ণ হওয়া উচিত।
টম হাটিন - ২

5

লোকজন পছন্দ করেas এত কারণ এটি ব্যতিক্রমগুলি থেকে তাদের নিরাপদ বোধ করে ... একটি বাক্সে গ্যারান্টি পছন্দ করে। একটি লোক বাক্সে অভিনব গ্যারান্টি রেখেছিল 'কারণ সে আপনাকে ভিতরে সমস্ত উষ্ণ এবং টোস্টি বোধ করতে চায়। আপনি অঙ্কিত করলেন আপনি সেই ছোট বাক্সটি রাতে আপনার বালিশের নীচে রেখেছেন, গ্যারান্টি পরী নীচে নেমে আসতে পারে এবং এক চতুর্থাংশ রেখে যেতে পারে, আমি কি টেড?

বিষয়টিতে ফিরে ... সরাসরি কাস্ট ব্যবহার করার সময়, একটি অবৈধ কাস্ট ব্যতিক্রম হওয়ার সম্ভাবনা রয়েছে । সুতরাং লোকেরা asতাদের সমস্ত কাস্টিং প্রয়োজনীয়তার কম্বল সমাধান হিসাবে প্রয়োগ করে কারণ as(নিজে থেকে) কখনও ব্যতিক্রম ছুঁড়ে না ফেলে। তবে এ সম্পর্কে মজার বিষয়টি উদাহরণটি যা আপনি দিয়েছেন (x as T).SomeMethod();তা হল নাল রেফারেন্স ব্যতিক্রমের জন্য আপনি একটি অবৈধ কাস্ট ব্যতিক্রম ট্রেড করছেন। আপনি যখন ব্যতিক্রমটি দেখেন তখন আসল সমস্যাটি বিস্মৃত করে।

আমি সাধারণত asখুব বেশি ব্যবহার করি না আমি isপরীক্ষাটি পছন্দ করি কারণ আমার কাছে এটি আরও পঠনযোগ্য বলে মনে হয় এবং এরপরে আরও কস্ট চেষ্টা করে এবং শূন্যতার জন্য পরীক্ষা করা হয়।


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

মধ্যভাগে গুরুত্বপূর্ণ বক্তব্যটি হ'ল লোকেরা asকম্বল সমাধান হিসাবে কীভাবে প্রয়োগ করে কারণ এটি তাদের নিরাপদ বোধ করে।
বব

5

এটি আমার শীর্ষ পীভগুলির মধ্যে একটি হতে হবে ।

স্ট্রাস্ট্রপের ডিঅ্যান্ডই এবং / অথবা এখনই আমি খুঁজে পাচ্ছি না এমন কোনও ব্লগ পোস্ট কোনও toঅপারেটরের ধারণা নিয়ে আলোচনা করেছে যা https://stackoverflow.com/users/73070/johannes-rossel দ্বারা তৈরি পয়েন্টটি সম্বোধন করবে (যেমন, তবে একই সিনট্যাক্স asসহDirectCast শব্দার্থবিদ্যা )।

এটি বাস্তবায়িত না হওয়ার কারণ হ'ল কোনও কাস্টের ব্যথা হওয়া উচিত এবং কুশ্রী হওয়া উচিত যাতে আপনি এটি ব্যবহার থেকে দূরে সরে যান।

'চালাক' প্রোগ্রামাররা (প্রায়শই বুক লেখক (জুভাল লোই আইআইআরসি)) asএই ফ্যাশনে গালি দিয়ে এই চারপাশে পদক্ষেপ করুন ( asসম্ভবত এই কারণেই সি ++ একটি প্রস্তাব দেয় না)।

এমনকি ভিবি একটি অভিন্ন সিনট্যাক্স থাকার আরও দৃঢ়তা যে বাহিনী আপনি একটি বেছে নিতে হয়েছে TryCastবা DirectCastএবং আপনার মন আপ !


+1 টি। আপনি সম্ভবত DirectCast আচরণ ব্যবহার করেছেন , সিনট্যাক্স নয় ।
হেইনজি

@ হাইঞ্জি: +1 এর জন্য টা। ভাল যুক্তি. একটি semantics
স্মার্টসার

সি #, সি ++, বা জাভা এর সাথে সামঞ্জস্যের কোনও ভ্রান্তি নেই বলে প্রদত্ত যে, আমি সেগুলি সেগুলি থেকে languages ​​ভাষাগুলির কাছ থেকে নেওয়া কিছু জিনিসগুলিতে নিজেকে আবিষ্কার করি। এটি "আমি জানি এটি একটি এক্স" এর বাইরে চলে গেছে, এবং "আমি জানি এটি এক্স নয়, তবে এটি একটি হিসাবে উপস্থাপিত হতে পারে", "আমি জানি এটি এক্স নয়, এবং সম্ভবত এটি একটি হিসাবে উপস্থাপিত হতে পারে না , তবে যাইহোক আমাকে একটি এক্স দিন। " আমি এমন একটি double-to-intকাস্টের জন্য দরকারীতা দেখতে পেলাম যে ব্যর্থ হবে যদি এটি doubleকোনও উপযুক্ত মান উপস্থাপন না করে যা কোনও ক্ষেত্রে মানানসই হয় Int32তবে (int)-1.5ফলন -১ পাওয়া কেবল কুৎসিত হয়।
সুপারক্যাট

@ সুপের্যাট ইয়েপ, তবে ভাষা নকশা সহজ তবে আমরা সকলেই জানি - সি # নলবলের সাথে জড়িত ট্রেড অফসের সেটটি দেখুন। একমাত্র পরিচিত প্রতিষেধক হ'ল গভীরতার সংস্করণগুলিতে নিয়মিত সি # পড়ার সাথে সাথে তারা এলো :) শুকরিয়া আমি আজকাল এফ # এর ঘনত্বগুলি বোঝার জন্য আরও বেশি উদ্বিগ্ন এবং এই বিষয়গুলির মধ্যে এটি অনেক বেশি বুদ্ধিমান।
রুবেন বারটেলিংক

@ রুবেনবার্টেলিংক: অণ্যযোগ্য প্রকারগুলি কী সঠিক সমস্যাগুলি সমাধান করার কথা বলেছিল তা আমি পুরোপুরি পরিষ্কার করছি না তবে আমি মনে করব বেশিরভাগ ক্ষেত্রে MaybeValid<T>দুটি পাবলিক ফিল্ডের সাথে থাকতে পারলে ভাল হত IsValidএবং Valueকোন কোডটি উপযুক্ত দেখায় তা করতে পারত। যে যেমন অনুমতি দেওয়া হবে MaybeValid<TValue> TryGetValue(TKey key) { var ret = default(MaybeValid<TValue>); ret.IsValid = dict.TryGetValue(key, out ret.Value); return ret; }। এটি কেবল তুলনায় কমপক্ষে দুটি অনুলিপি অপারেশন সংরক্ষণ Nullable<T>করতে পারে তা নয়, তবে এটি কোনও ধরণের - Tকেবল ক্লাসগুলির জন্যও মূল্যবান হতে পারে ।
সুপারক্যাট

2

আমি বিশ্বাস করি যে কী- asওয়ার্ডটি dynamic_castসি ++ এর আরও মার্জিত বর্ণন সংস্করণ হিসাবে ভাবা যেতে পারে ।


আমি বলতে চাই যে সি # তে একটি সরাসরি cast dynamic_castালাই সি ++ এর মতো।
পি ড্যাডি

আমি মনে করি যে সি # তে সরাসরি castালাই সি ++ এর স্ট্যাটিক_কাস্টের তুলনায় আরও সমান।
অ্যান্ড্রু গ্যারিসন

2
@ রুবেন বারটেলিংক: এটি কেবল পয়েন্টার সহ বাতিল করে দেয়। রেফারেন্স সহ, যা সম্ভব হলে আপনার ব্যবহার করা উচিত, এটি নিক্ষেপ করে std::bad_cast
পি ড্যাডি

1
@ অ্যান্ড্রু গ্যারিসন: static_castকোনও রানটাইম টাইপ চেক করেন না। সি # তে এর সাথে কোনও মিল নেই is
পি বাবা 17

দুঃখের বিষয়, আমি জানতাম না আপনি এমনকি রেফারেন্সগুলিতে কাস্টগুলিও ব্যবহার করতে পারেন, কারণ আমি কেবল পয়েন্টারগুলিতে এগুলি ব্যবহার করেছি, তবে পি ড্যাডি একেবারে সঠিক!
অ্যান্ড্রু গ্যারিসন

1

কোনও প্রযুক্তিগত কারণেই এটি সম্ভবত বেশি জনপ্রিয় তবে কেবল এটি পড়া সহজ এবং আরও স্বজ্ঞাত। (এটি না বলে কেবল প্রশ্নের উত্তর দেওয়ার চেষ্টা করা আরও ভাল হয়)


1

"হিসাবে" ব্যবহারের একটি কারণ:

T t = obj as T;
 //some other thread changes obj to another type...
if (t != null) action(t); //still works

(খারাপ কোড) এর পরিবর্তে:

if (obj is T)
{
     //bang, some other thread changes obj to another type...
     action((T)obj); //InvalidCastException
}

2
আপনি যদি এই কুৎসিতের জন্য রেস কনডিটন পেয়ে থাকেন তবে আপনার আরও বড় সমস্যা রয়েছে (তবে অন্যদের সাথে যাওয়ার জন্য এটি একটি চমৎকার নমুনাটিকে সম্মত করুন তাই +1
রুবেন বারটেলিংক

-1 এটি একটি ভ্রান্তি স্থায়ী হিসাবে। অন্যান্য থ্রেড যদি আপত্তিটির ধরণ পরিবর্তন করতে পারে তবে আপনার এখনও সমস্যা আছে have দাবিটি "// এখনও কাজ করে" এটি সত্যই ধরে রাখতে খুব অপ্রকাশ্য, যেহেতু টি টিতে পয়েন্টার হিসাবে ব্যবহৃত হবে, তবে এটি মেমরিটিকে নির্দেশ করে যা আর টি নয় solution অন্য থ্রেডের ধরণের পরিবর্তন করলে কোনও সমাধানই কাজ করবে না ক্রিয়া (টি) চলছে যখন আপত্তি।
স্টিফেন সি স্টিল

5
@ স্টেফেন সি স্টিল: আপনি বেশ বিভ্রান্ত বলে মনে করছেন। প্রকারের objপরিবর্তনের অর্থ হ'ল objভেরিয়েবলটি পরিবর্তন করে অন্য কোনও বস্তুর রেফারেন্স রাখা। এটি মেমরির বিষয়বস্তুগুলিকে পরিবর্তন করতে পারে না যেখানে মূলত রেফারেন্স করা অবজেক্টটি থাকে obj। এই আসল অবজেক্টটি অপরিবর্তিত থাকবে এবং tভেরিয়েবলটি এখনও এটির একটি রেফারেন্স রাখবে।
পি বাবা 21


1
@ পি ড্যাডি - আমি মনে করি আপনি সঠিক, এবং আমি ভুল ছিলাম: যদি কোনও টি-টি থেকে টি -২০ অবজেক্টটি পুনরায় প্রত্যাবর্তন করা হয়, তবে টি এখনও পুরানো টি অবজেক্টটির দিকে ইশারা করে। যেহেতু টি এখনও পুরাতন বস্তুর উল্লেখ করে, এটি আবর্জনা সংগ্রহ করা যায় না, সুতরাং পুরাতন টি অবজেক্টটি বৈধ থাকবে। আমার রেস কন্ডিশন ডিটেক্টর সার্কিটগুলি সি ++ তে প্রশিক্ষিত হয়েছিল, যেখানে ডায়নামিক_কাস্ট ব্যবহার করে অনুরূপ কোড সম্ভাব্য সমস্যা হতে পারে।
স্টিফেন সি স্টিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.