নাল-কোলেসিং অপারেটর দিয়ে নাল অবজেক্ট ইনস্ট্যান্ট করা হচ্ছে


12

নিম্নলিখিত সাধারণ দৃশ্য বিবেচনা করুন:

if(myObject == null) {
    myObject = new myClass();
}

নাল-কোলেসিং অপারেটরটি ব্যবহার করে নিম্নলিখিত প্রতিস্থাপনের বিষয়ে কী ভাবা হচ্ছে তা আমি ভাবছি:

myObject = myObject ?? new myClass();

আমি নিশ্চিত না যে আমার দ্বিতীয় ফর্মটি ব্যবহার করা উচিত। দেখে মনে হচ্ছে এটি একটি দুর্দান্ত শর্টহ্যান্ড, তবে myObject = myObjectশুরুতে নির্মাণটি মনে হচ্ছে এটি কিছুটা গন্ধযুক্ত হতে পারে।

এটি করার মতো কি যুক্তিসঙ্গত জিনিস, বা এর চেয়ে ভাল শর্টহ্যান্ড যা আমি মিস করছি? অথবা হতে পারে, "এটি তিনটি লাইন, এটি পেরে উঠুন!"?

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

myClass myObject = myClassService.getById(id);
myObject.myChildObject = myObject.myChildObject ?? new myChildClass();

15
নবজাতকরা বিশ্বাস করেন যে এই জাতীয় জিনিসগুলিকে "হ্যাকিশ" বলে মনে করা হয়, আরও অভিজ্ঞ ডেভগুলি কেবল এটিকে "আইডোমেটিক" বলে ডাকে।
ডক ব্রাউন

যদি অবজেক্টটি কোনও মান অবজেক্টের মতো দেখাচ্ছে ("আইডিয়োম্যাটিক স্পোকে" এর মান শব্দার্থক রয়েছে), তার ধরণের মানটির MyClassএকটি public static readonlyসদস্য সরবরাহ করা উচিত EmptyString.Emptyএমএসডিএন-এ দেখুন ।
রোবং


5
সেখানে একটি নয় ??=অপারেটর?
আভিভ

1
@ আভিভ আমার ইচ্ছা সেখানে থাকত!
লরেন পেচটেল

উত্তর:


16

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

আমি এই অপারেটরটিকে প্রকৃতিতে টের্নারি অপারেটরের সাথে সমান বলে মনে করি (এ? বি: সি)। এটি পড়ার দ্বিতীয় প্রকৃতি হওয়ার আগে এটি একটু অনুশীলন করে তবে আপনি একবার এটি ব্যবহার করতে পেরে আমি অনুভব করি দীর্ঘমেয়াদী সংস্করণগুলির চেয়ে পাঠযোগ্যতা উন্নত হয়।

এছাড়াও, আপনি যে পরিস্থিতিটি বর্ণনা করেছেন তা হ'ল একটি দৃশ্য যেখানে অপারেটর কার্যকর। এটির মতো নির্মাণগুলি প্রতিস্থাপন করাও সহজ:

if (value != null)
{
    return value;
}
else
{ 
    return otherValue;
}

অথবা

return value != null ? value : otherValue;

সঙ্গে

return value ?? otherValue;

এই অপারেটরটি ব্যবহারের বিষয়ে অবশ্যই সাধারণভাবে সম্মত হন। আমি যখন এটি ব্যবহারের রেফারেন্সগুলি দেখি, যদিও এটি সাধারণত এর মতো কিছু myObject = myObject2 ?? myObject3। আমি বিশেষত যা সম্পর্কে ভাবছি তা অপারেটরটি নিজের কাছে কোনও বস্তু সেট করার জন্য ব্যবহার না করে যদি এটি শূন্য হয়।
grin0048

2
আমি মনে করি একই যুক্তি উভয় ক্ষেত্রেই প্রযোজ্য। একই যুক্তি প্রকাশ করার জন্য এটি আরও সংক্ষিপ্ত উপায়।
26

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

2

আমি বিশেষত যা সম্পর্কে ভাবছি তা অপারেটরটি নিজের কাছে কোনও বস্তু সেট করার জন্য ব্যবহার না করে যদি এটি শূন্য হয়।

?? operatorনাল-কোয়ালেসিং অপারেটর বলা হয় এবং nullable মান ধরনের বা রেফারেন্স ধরনের জন্য ডিফল্ট মান নির্ধারণ করতে ব্যবহৃত হয়। অপারেন্ডটি শূন্য না হলে এটি বাম-হাতের অপারেন্ডকে ফিরিয়ে দেয়; অন্যথায় এটি সঠিক অপারেন্ড ফেরত দেয়।

myObject = myObject ?? new myObject(); - instantiate default value of object

নাল-কোয়েলসিং অপারেটর সম্পর্কে আরও বিশদ এবং কোডের নমুনা - এমএসডিএন নিবন্ধ

আপনি যদি more than nullableশর্তটি পরীক্ষা করেন তবে বিকল্প হিসাবে আপনি টার্নারি অপারেটর ব্যবহার করতে পারেন।

টার্নারি অপারেটর

আপনিও দেখতে পারেন ?: অপারেটর । একে বলা হয় টার্নারি বা শর্তসাপেক্ষ অপারেটর। শর্তসাপেক্ষ অপারেটর (? :) বুলিয়ান এক্সপ্রেশনের মানের উপর নির্ভর করে দুটি মানগুলির মধ্যে একটি প্রদান করে।

একটি nullable টাইপ একটি মান থাকতে পারে, বা এটি অপরিবর্তিত করা যেতে পারে। দ্য ?? অপারেটর যখন একটি nullable টাইপ একটি নন-প্রজননযোগ্য টাইপকে বরাদ্দ করা হয় তখন ফিরে আসার জন্য ডিফল্ট মানটিকে সংজ্ঞায়িত করে। আপনি যদি ব্যবহার না করে একটি নন-অযোগ্য মান প্রকারকে একটি স্থায়ী মান প্রকারটি নির্ধারণের চেষ্টা করেন ?? অপারেটর, আপনি একটি সংকলন-সময় ত্রুটি তৈরি করবেন। আপনি যদি একটি castালাই ব্যবহার করেন এবং অণ্যযোগ্য মান প্রকারটি বর্তমানে অপরিজ্ঞাত করা হয় তবে একটি অবৈধপ্রকাশের ব্যতিক্রম ছুঁড়ে দেওয়া হবে।

এমএসডিএন-এর একটি কোড উদাহরণ -?: অপারেটর (সি # রেফারেন্স) :

int? input = Convert.ToInt32(Console.ReadLine());
string classify;

// ?: conditional operator.
classify = (input.HasValue) ? ((input < 0) ? "negative" : "positive") : "undefined";

প্রশ্নটি থেকে উদাহরণ গ্রহণ এবং শর্তাধীন অপারেটর আবেদন সুতরাং, আমরা ভালো কিছু আছে চাই myObject = (myObject == null) ? new myClass() : myObject। সুতরাং, আমি শর্তসাপেক্ষ অপারেটরের আরও ভাল ব্যবহার অনুপস্থিত না হলে, নিজেকে নাল-কোলেসিং অপারেটর হিসাবে কোনও বস্তু নিজেই সেট করার ক্ষেত্রে (যদি এটি নাল না হয়) একই "সমস্যা" বলে মনে হয় - এবং এটি কম সংক্ষিপ্ত হয়।
grin0048

যদি আপনি একাধিক শর্তের জন্য পরীক্ষা করছেন (নাল নয় এবং শূন্যের চেয়ে বড় নয়) - তবে শর্তসাপেক্ষ অপারেটর এটি করবে। তবে, শুধু নাল চেকিংয়ের জন্য কাজ করবে ?? অপারেটর.
ইউসুবভ

2

আমি মনে করি না যে দৃশ্যাবলি সাধারণত (বা কমপক্ষে হওয়া উচিত)।

আপনি যদি কোনও ক্ষেত্রের ডিফল্ট মান না চান nullতা ক্ষেত্র আরম্ভকারীতে সেট করুন:

myClass myObject = new myClass();

অথবা, যদি সূচনাটি আরও জটিল হয় তবে এটি কনস্ট্রাক্টরে সেট করুন।

যদি আপনি myClassকেবল তখনই তৈরি করতে চান যখন আপনার এটির প্রয়োজন হয় (যেমন কারণ এটি তৈরি করতে দীর্ঘ সময় লাগে) তবে আপনি ব্যবহার করতে পারেন Lazy<T>:

Lazy<myClass> myObject = new Lazy<myClass>();

(এটি ডিফল্ট কন্সট্রাকটর কল। আরম্ভের আরো জটিল হয়, তাহলে ল্যামডা যে সৃষ্টি পাস myClassকরার Lazy<T>কন্সট্রাকটর।)

মানটি অ্যাক্সেস করতে, ব্যবহার করুন myObject.Value, যা আপনি যদি প্রথমবার অ্যাক্সেস করে থাকেন তবে সূচনা বলবে myObject.Value


আইএমও অলস সৃষ্টি কেবলমাত্র তখনই কার্যকর যখন আপনি ফলস্বরূপ অবজেক্টের প্রয়োজনের গ্যারান্টি না থাকলে, আমি যখন অলস সৃষ্টিটি ব্যবহার করি তখনই যখন আমার কোনও ক্যাশেড প্রাপ্ত ফলাফল হয় যখন আমি কিছু পরিবর্তন করি তখন পুনরায় সেট করি এবং আমি জানি যে আমার একই ফলাফলের প্রচুর প্রয়োজন হবে এবং recalc ব্যয়বহুল। অন্যভাবে আমি কেবল নাল চেক নিয়ে বিরক্ত করতে চাই না
রাচেট ফ্রিক

@ratchetfreak হ্যাঁ, এজন্য আমি প্রথমে ফিল্ড ইনিশিয়ালাইজারের পরামর্শ দিয়েছি।
সোভিক

এছাড়াও অন্যান্য মামলা আছে। আমি এই মুহূর্তে যা দেখছি: প্রথম পাস ব্যতিক্রমের ক্ষেত্রে সেট করে। দ্বিতীয় পাসটি অন্য কিছুর জন্য ডিফল্ট সেট করে। ?? = অর্ধেক লাইন কাটা হবে
লরেন পেচটেল

1

আমি বিশেষত ??optionচ্ছিক পদ্ধতি পরামিতিগুলির সাথে একযোগে ব্যবহার করতে পছন্দ করি । আমি ওভারলোডগুলির প্রয়োজনীয়তা সীমাবদ্ধ করি এবং নিশ্চিত করি যে জিনিসটির কোনও মূল্য রয়েছে।

public void DoSomething (MyClass thing1 = null) {
    thing1 = thing1 ?? new MyClass();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.