আপডেট: ভিজ্যুয়াল স্টুডিও 2015 দিয়ে শুরু করে, সি # সংকলক (ভাষার সংস্করণ 6) এখন ?.
অপারেটরকে স্বীকৃতি দেয় যা "ডিপ নাল চেকিং" বাতাস তৈরি করে। এই উত্তর দেখুনবিস্তারিত জানার জন্য ।
আপনার কোডটি পুনরায় নকশা করা ছাড়াও,
মুছে ফেলা উত্তরের মতো প্রস্তাবিত, অন্য একটি (ভয়ানক হলেও) বিকল্পটি হ'ল সেই গভীর সম্পত্তি সম্পত্তি অনুসন্ধানের সময় কিছুটা ঘটেছিল try…catch
কিনা তা দেখতে একটি ব্লক ব্যবহার করা হবে NullReferenceException
।
try
{
var x = cake.frosting.berries.loader;
...
}
catch (NullReferenceException ex)
{
// either one of cake, frosting, or berries was null
...
}
নিম্নলিখিত কারণে আমি ব্যক্তিগতভাবে এটি করব না:
- দেখতে সুন্দর লাগছে না।
- এটি ব্যতিক্রম হ্যান্ডলিং ব্যবহার করে, যা ব্যতিক্রমী পরিস্থিতি লক্ষ্য করে এবং এমন কোনও কিছু নয় যা আপনি সাধারণত অপারেশন চলাকালীন সময়ে ঘটবে বলে আশা করেন।
NullReferenceException
গুলি সম্ভবত স্পষ্টভাবে ধরা উচিত নয়। ( এই প্রশ্নটি দেখুন ।)
তাহলে কি কিছু এক্সটেনশন পদ্ধতি ব্যবহার করা সম্ভব বা এটি কোনও ভাষা বৈশিষ্ট্য হবে, [...]
এই প্রায় অবশ্যই একটি ভাষা বৈশিষ্ট্য (যা আকারে সি # 6 পাওয়া যায় হতে হবে .?
এবং?[]
যদি না C # এর ইতিমধ্যে আরো পরিশীলিত অলস মূল্যায়ন ছিল অপারেটার), অথবা আপনি প্রতিফলন (যা সম্ভবত একটি নয় ব্যবহার করতে চান, যদি না কর্মক্ষমতা এবং ধরণের-সুরক্ষার কারণে ভাল ধারণা)।
যেহেতু কেবল কোনও কার্যক্রমে যাওয়ার কোনও উপায় নেই cake.frosting.berries.loader
(এটি মূল্যায়ন করা হবে এবং একটি নাল রেফারেন্স ব্যতিক্রম ছুঁড়ে ফেলা হবে), আপনাকে নিম্নলিখিত পদ্ধতিতে একটি সাধারণ বর্ণন পদ্ধতি প্রয়োগ করতে হবে: এটি কোনও বস্তু এবং বৈশিষ্ট্যের নাম গ্রহণ করে খুঁজে দেখো:
static object LookupProperty( object startingPoint, params string[] lookupChain )
{
// 1. if 'startingPoint' is null, return null, or throw an exception.
// 2. recursively look up one property/field after the other from 'lookupChain',
// using reflection.
// 3. if one lookup is not possible, return null, or throw an exception.
// 3. return the last property/field's value.
}
...
var x = LookupProperty( cake, "frosting", "berries", "loader" );
(দ্রষ্টব্য: কোড সম্পাদিত)
আপনি এই জাতীয় পদ্ধতির সাথে দ্রুত বেশ কয়েকটি সমস্যা দেখতে পাচ্ছেন। প্রথমত, আপনি কোনও সহজ ধরণের সম্পত্তি মূল্যগুলির কোনও ধরণের সুরক্ষা এবং সম্ভাব্য বক্সিং পাবেন না। দ্বিতীয়ত, null
কিছু ভুল হয়ে গেলে আপনি ফিরে আসতে পারেন, এবং আপনার কলিং ফাংশনটিতে আপনাকে এটি পরীক্ষা করতে হবে, বা আপনি একটি ব্যতিক্রম ছুঁড়েছেন এবং আপনি যেখানে ফিরে এসেছেন সেখানে ফিরে এসেছেন। তৃতীয়ত, এটি ধীর হতে পারে। চতুর্থত, আপনি যেটি শুরু করেছিলেন তার চেয়ে দেখতে এটি দেখতে আরও খারাপ লাগে।
[...], বা এটি একটি খারাপ ধারণা?
আমি হয় সাথে থাকব:
if (cake != null && cake.frosting != null && ...) ...
বা মেহরদাদ আফশারী উপরের উত্তরটি দিয়ে যান।
পিএস: ফিরে যখন আমি এই উত্তরটি লিখেছিলাম, আমি স্পষ্টতই ল্যাম্বডা ফাংশনের জন্য অভিব্যক্তি গাছগুলি বিবেচনা করি নি; এই দিক থেকে সমাধানের জন্য যেমন @ ডিরিয়াসের উত্তর দেখুন। এটি একধরণের প্রতিবিম্বের উপরও নির্ভরশীল এবং এটি একটি সহজ সমাধান ( if (… != null & … != null) …
) এর পাশাপাশি কার্যকরভাবে সম্পাদন করতে পারে না তবে এটি সিনট্যাক্স পয়েন্ট অফ ভিউ থেকে আরও ভাল বিচার করা যেতে পারে।