সি # এর জন্য সম্পত্তি-কোলেসিং অপারেটর


9

সি # তে নাল-কোয়েলসিং অপারেটর আপনাকে কোডটি ছোট করার অনুমতি দেয়

  if (_mywidget == null)
     return new Widget();
  else
     return _mywidget;

নিচে:

  return _mywidget ?? new Widget();

আমি সন্ধান করে চলেছি যে সি # তে থাকা একটি দরকারী অপারেটর এমন এক হবে যা আপনাকে কোনও জিনিসের সম্পত্তি বা অন্য কোনও মানটি যদি শূন্য থাকে তবে ফিরিয়ে দিতে দেয়। সুতরাং আমি প্রতিস্থাপন করতে চাই

  if (_mywidget == null)
     return 5;
  else
     return _mywidget.Length;

সঙ্গে:

  return _mywidget.Length ??! 5;

এই অপারেটরটির অস্তিত্ব না থাকার কিছু কারণ থাকতে হবে তা ভেবে আমি সাহায্য করতে পারি না। এটি কি কোডের গন্ধ? এটি লেখার আরও ভাল কোনও উপায় আছে কি? (আমি নাল অবজেক্টের ধরণ সম্পর্কে সচেতন তবে এই চারটি কোডের কোডটি প্রতিস্থাপনের জন্য এটি ব্যবহার করা ওভারকিল বলে মনে হচ্ছে))


1
শর্তসাপেক্ষ অপারেটর কি এখানে যথেষ্ট হবে?
আনন

1
কেউ এমন কিছু লিখেছেন যা আপনাকে এরকম কিছু করতে সক্ষম করে: স্ট্রিং অবস্থান = কর্মচারী offঅফিস.এড্রেস.লোকেশন ?? "অজানা"; । এই উইলটির অবস্থানটি "অজানা" তে সেট করে যখন কোনও বস্তুর ( কর্মী , অফিস , ঠিকানা বা অবস্থান ) শূন্য থাকে। দুর্ভাগ্যক্রমে, আমি মনে করি না কে এটি লিখেছিলেন বা কোথায় তিনি এটি পোস্ট করেছিলেন। যদি আমি এটি আবার খুঁজে পাই তবে আমি এটি এখানে পোস্ট করব!
ক্রিস্টফ ক্লেস

1
এই প্রশ্নটি স্ট্যাকওভারফ্লোতে আরও অনেক সন্ধান পাবে।
চাকরি

2
??!সি ++ এ অপারেটর। :-)
জেমস ম্যাকনেলিস

3
হ্যালো ২০১১, সবেমাত্র এই বলে ডাকা হয়েছে যে সি # একটি নিরাপদ নেভিগেশন অপারেটর
নাথান কুপার

উত্তর:


5

আমি খুব সহজেই একটি সি # ভাষার বৈশিষ্ট্য চাই যা আমাকে নিরাপদে x.Prop.SomeOtherProp.ThirdProp করতে দেয়, প্রত্যেকটি নালীর জন্য পরীক্ষা না করেই। একটি কোডবেসে যেখানে আমাকে এই ধরণের "গভীর সম্পত্তি ট্র্যাভারসাল" করতে হয়েছিল, আমি নেভিগেট নামক একটি এক্সটেনশন পদ্ধতি লিখেছিলাম যা নুলরফেরেন্সএক্সেপশনকে গ্রাস করেছে এবং পরিবর্তে একটি ডিফল্ট মান ফিরে এসেছে। সুতরাং আমি এই মত কিছু করতে পারে:

var propVal = myThing.Navigate(x => x.PropOne.PropTwo.PropThree.PropFour, defaultValue);

এর নেতিবাচক দিকটি হ'ল এটিতে আলাদা কোড গন্ধ আছে: গিলে ব্যতিক্রম। আপনি যদি এই "ডান" মতো কিছু করতে চান, আপনি লামদ্বাটিকে একটি অভিব্যক্তি হিসাবে নিতে পারেন এবং প্রতিটি সম্পত্তি অ্যাক্সেসরের চারপাশে নাল চেক যোগ করতে ফ্লাইতে অভিব্যক্তিটি পরিবর্তন করতে পারেন। আমি "দ্রুত এবং নোংরা" হয়ে গেলাম এবং এটিকে "আরও ভাল" উপায়ে কার্যকর করি নি। তবে সম্ভবত যখন আমার কিছু অতিরিক্ত চিন্তা চক্র থাকবে আমি এটিকে আবার ঘুরে দেখব এবং এটি কোথাও পোস্ট করব।

আপনার প্রশ্নের আরও সরাসরি উত্তর দেওয়ার জন্য, আমি অনুমান করছি যে এটি কোনও বৈশিষ্ট্য নয় কারণ কারণ বৈশিষ্ট্যটি বাস্তবায়নের ব্যয়টি বৈশিষ্ট্যটি থাকা থেকে উপকারকে অতিক্রম করে। সি # টিমকে কোন বৈশিষ্ট্যগুলিতে ফোকাস করতে হবে তা বেছে নিতে হবে এবং এটি এখনও শীর্ষে উঠতে পারে নি। আমার কাছে কোনও অভ্যন্তরীণ তথ্য না থাকলেও কেবল একটি অনুমান।


1
ঠিক আমি কী ভেবেছিলাম তবে নিরাপদ উপায়ে পারফরম্যান্সটি খুব খারাপ হবে বলে আমি অনুমান করি (অনেক এক্সপ্রেশন.কম্পাইল () এর কারণে ... খুব খারাপ এটি সি # তে কার্যকর করা হয়নি (ওবজে। প্রপো।
গিলাইউমূম

x.PropOne.PropTwo.PropThree.PropFour একটি নিম্ন নকশা পছন্দ কারণ এটি ডেমিটারের আইন লঙ্ঘন করে। আপনার পদ্ধতিগুলি / ক্লাসগুলি আবার ডিজাইন করুন যাতে আপনার এটি ব্যবহার করার প্রয়োজন না হয়।
জাস্টিন শিল্ড

আইন-কানুনের আলোকে নিরবচ্ছিন্নভাবে গভীর সম্পত্তি অ্যাক্সেস এচুয়েচ করা নির্বোধভাবে একটি ডেটাবেসকে স্বাভাবিক করার মতোই বিপজ্জনক। আপনি খুব দূরে যেতে পারেন।
মীর

3
সি # 6.0 এই নাল-শর্তসাপেক্ষ অপারেটর (ওরফে এলভিস অপারেটর) ব্যবহার করে সম্ভব msdn.microsoft.com/en-us/magazine/dn802602.aspx
victorvartan

15

আমি বিশ্বাস করি আপনি এখন খুব সহজেই সি # 6 দিয়ে এটি করতে সক্ষম হবেন:

return _mywidget?.Length ?? 5;

?.বাম দিকে নাল শর্তযুক্ত অপারেটর নোট করুন । _mywidget?.Lengthনাল হলে _mywidgetনাল ফেরায়।

একটি সাধারণ টেরিনারি অপারেটর পড়তে আরও সহজ হতে পারে, যদিও অন্যরা যেমন পরামর্শ দিয়েছে।


9

কেন তারা তা করেনি তা কেবল এটিই জল্পনা। সর্বোপরি, আমি বিশ্বাস করি না ?? প্রথম সি # সংস্করণে ছিল।

যাইহোক, আমি কেবল শর্তসাপেক্ষ অপারেটরটি ব্যবহার করব এবং একটি দিন কল করব:

return (_mywidget != null) ? _mywidget.Length : 5;

দ্য ?? শর্তসাপেক্ষ অপারেটরের জন্য একটি শর্টকাট।


5
ব্যক্তিগতভাবে এটি প্রথমে এটি করার জন্য অপারেটর থাকার মতোই খারাপ (ইমো) is আপনি কোনও বস্তুর কাছ থেকে কিছু চান ... সেই বস্তুটি সেখানে নাও থাকতে পারে ... সুতরাং 5উত্তর না থাকলে ক্ষেত্রে এটি দেওয়া উচিত। বিশেষ অপারেটরদের জিজ্ঞাসা করা শুরু করার আগে আপনাকে আপনার নকশার দিকে নজর দেওয়া দরকার।
মু-রস

1
@ মু-রস আমি এই কোডটি রক্ষণাবেক্ষণকারী ব্যক্তিকে কেবল কল্পনা করছি, 'কেন এটি আমাকে 5 দিচ্ছে? Hrmmm। কি?!'
মিশরচেট 26'11


3

ব্যক্তিগতভাবে, আমি মনে করি এটি পাঠযোগ্যতার নিচে। প্রথম উদাহরণে, ??অনুবাদটি বেশ সুন্দরভাবে অনুবাদ করে "আপনি সেখানে আছেন? না, না, আসুন এটি করা যাক"।

দ্বিতীয় উদাহরণে, ??!স্পষ্টতই ডাব্লুটিএফ এবং এর অর্থ প্রোগ্রামারটির কাছে কিছুই নয় .... অবজেক্টটির অস্তিত্ব নেই, তাই আমি সম্পত্তিটিতে যেতে পারব না তাই আমি ফিরে আসব 5.. এর অর্থ কী? 5 কি? আমরা কীভাবে এই সিদ্ধান্তে পৌঁছব যে ৫ টি একটি ভাল মান?

সংক্ষেপে, প্রথম উদাহরণটি বোঝায় ... সেখানে নেই, এটি নতুন । দ্বিতীয়টিতে, এটি বিতর্কের জন্য উন্মুক্ত।


2
ঠিক আছে, আপনি যে সত্য উপেক্ষা করতে হবে ??! অস্তিত্ব নেই। ভাবুন তো ?? সাধারণ ছিল এবং যদি এটি ব্যবহার করা হয় তবে তার ভিত্তিতে সিদ্ধান্ত নিন make
26:41 'এ 0:41-

3
এটি আমাকে সি ++ তে তথাকথিত "ডাব্লুটিএফ অপারেটর" সম্পর্কে মনে করিয়ে দেয় (এটি আসলে কাজ করে:। (foo() != ERROR)??!??! cerr << "Error occurred" << endl;)
ট্যামস সেজেলি ২i

@ হোয়াটসিসনাম, সিদ্ধান্তটি গ্রহণের পক্ষে এটি যথাযথ ছিল এ বিষয়টি আরও বেশি প্রতিফলিত হয়েছিল। কোনও বস্তু তৈরি করা কারণ এটি ছিল না তাই বোঝা যায়। একটি আরবিটুরি মান নির্ধারণ করা যার অর্থ পাঠকের কাছে কিছুই নয় কারণ আপনি কোনও কিছুর কোনও সম্পত্তি পেতে পারেন না , এটি আসলে একটি ডাব্লুটিএফ দৃশ্য scenario
মু-রস

আমি মনে করি আপনি আমার উদাহরণটি পেয়ে যাচ্ছেন। হতে পারে 0 টি 5 এর চেয়ে ভাল Maybe সম্ভবত সম্পত্তিটি কোনও বস্তু তাই _ মাইউইডজেট নালার হলে আপনি একটি নতুন ফডল () ফিরিয়ে দিতে চান। আমি পুরোপুরি একমত নই ?? এর চেয়ে বেশি পাঠযোগ্য কি ?? যদিও :)
বেন ফুলটন

, @Ben যদিও আমি সম্মত হন যে অপারেটর নিজেই আপনার প্রশ্নের অত্যধিক ধার নেই উপর নিকটতর নিবদ্ধ, আমি প্রোগ্রামার এবং যে অবাধ উপলব্ধি করার জন্য একটি সমান্তরাল অঙ্কন ভোরের 5। আমি সত্যিই মনে করি এমন আরও কিছু সমস্যা রয়েছে যা আপনাকে এই জাতীয় কিছু করতে হবে, তবে আপনার প্রথম উদাহরণে প্রয়োজনটি বেশ স্পষ্টতই বিশেষত ক্যাশে পরিচালকদের মতো বিষয়গুলিতে।
মু-রস

2

আমি মনে করি আপনি ফিরে আসা "5" তে লোকেরা খুব বেশি ধরা পড়বে ... সম্ভবত 0 ভাল হত :)

যাইহোক, আমি মনে করি সমস্যাটি হ'ল ??!প্রকৃতপক্ষে কোনও একক অপারেটর নয়। এর অর্থ কী হবে তা বিবেচনা করুন:

var s = myString ??! "";

সেক্ষেত্রে এটি কোনও তাত্পর্যপূর্ণ নয়: বাম-হাতের ক্রিয়াকলাপ যদি কোনও সম্পত্তি অ্যাক্সেসর হয় তবে তা কেবলমাত্র বোধগম্য হয়। বা এই সম্পর্কে কি:

var s = Foo(myWidget.Length) ??! 0;

সেখানে একটি সম্পত্তি অ্যাক্সেসর রয়েছে, তবে আমি এখনও মনে করি না যে এটি বোধগম্য হয় (যদি myWidgetহয় null, তবে এর অর্থ আমরা কি আদৌ ফোন করি না Foo()?), বা এটি কি কেবল একটি ত্রুটি?

আমি মনে করি যে সমস্যাটি এটি ঠিক যেমন ভাষা ঠিক তেমন ফিট করে না ??


1

কেউ একটি ইউটিলিটি ক্লাস তৈরি করেছেন যা এটি আপনার জন্য করবে। তবে আমি এটি খুঁজে পাচ্ছি না। আমি যা পেয়েছি তা এমএসডিএন ফোরামে একই রকম ছিল (দ্বিতীয় উত্তরটি দেখুন)।

সামান্য কাজ করে, আপনি পদ্ধতি কল এবং নমুনা সমর্থন করে না এমন অন্যান্য এক্সপ্রেশন মূল্যায়নের জন্য এটি প্রসারিত করতে পারেন। আপনি একটি ডিফল্ট মান গ্রহণ করতে এটি বাড়িয়েও দিতে পারেন।


1

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

উদাহরণস্বরূপ, আপনার মানচিত্রের সাথে আবদ্ধ বস্তু রয়েছে এবং আপনি সেগুলি যথাযথ উত্থানে থাকতে চান। ডিটিইডি মানচিত্রে তাদের ডেটাগুলিতে ছিদ্র থাকতে পারে তাই নাল মান, পাশাপাশি -100 থেকে 8900 মিটারের মতো কোনও মানের মানও পাওয়া সম্ভব। আপনি এর লাইনে কিছু চাইবেন:

mapObject.Altitude = mapObject.Coordinates.DtedAltitude ?? DEFAULT_ALTITUDE;

এই ক্ষেত্রে নাল কৌলেসেসিং অপারেটরটি ডিফল্ট উচ্চতাকে পপুলেশন করতে পারে যদি স্থানাঙ্কগুলি এখনও সেট না করা হয় বা কোর্ডিনেটস অবজেক্ট সেই অবস্থানের জন্য ডিটিইডি ডেটা লোড করতে না পারে।

আমি এটিকে খুব মূল্যবান হিসাবে দেখছি, তবে কেন এটি করা হয়নি তা নিয়ে আমার জল্পনা কল্পনা জটিলতার মধ্যে সীমাবদ্ধ। এমন কিছু ঘটনাও থাকতে পারে যেখানে আচরণটি যেমন অনুমানযোগ্য না হয়।


1

গভীরভাবে বাসা বাঁধতে না পেরে আমি এটি ব্যবহার করেছি (সি # 6 এ নাল কোয়েলসিং অপারেটর চালু হওয়ার আগে)। আমার পক্ষে এটি বেশ স্পষ্ট, তবে এটি সম্ভবত কারণ আমি অভ্যস্ত, অন্য লোকেরা এটি বিভ্রান্তিকর বলে মনে হতে পারে।

return ( _mywidget ?? new MyWidget() {length = defaultLength}).Length;

অবশ্যই এটি সর্বদা প্রযোজ্য নয়, যেহেতু কখনও কখনও আপনার যে সম্পত্তিটি অ্যাক্সেসের প্রয়োজন হয় তা সরাসরি সেট করা যায় না, বা যখন অন্য কোনও কারণে অবজেক্টের নির্মাণ ব্যয়বহুল হয়।

আরেকটি বিকল্প হ'ল নুলবজেক্ট প্যাটার্নটি ব্যবহার করা । আপনি বুদ্ধিমান ডিফল্ট মান সহ শ্রেণীর একক স্থিতিক উদাহরণ সংজ্ঞায়িত করেন এবং এর পরিবর্তে এটি ব্যবহার করেন।

return ( _mywidget ?? myWidget.NullInstance).Length;

0

ম্যাজিক নম্বরগুলি সাধারণত একটি দুর্গন্ধযুক্ত। 5 যদি একটি স্বেচ্ছাসেবী সংখ্যা হয়, তবে এটির বানানটি আরও ভাল যাতে এটি আরও স্পষ্টভাবে নথিভুক্ত হয়। আমার মতে একটি ব্যতিক্রম হ'ল যদি আপনার কাছে মানগুলির একটি সংগ্রহ থাকে যা কোনও নির্দিষ্ট প্রসঙ্গে ডিফল্ট মান হিসাবে কাজ করে।

যদি আপনার কোনও অবজেক্টের জন্য ডিফল্ট মানগুলির সেট থাকে তবে আপনি এটি ডিফল্ট সিঙ্গলটন উদাহরণ তৈরি করতে সাবক্লাস করতে পারেন।

এর মতো কিছু: ফিরুন (myobj ?? default_obj) ob


0

দৈর্ঘ্যের সম্পত্তিটি সাধারণত একটি মান ধরণের হয় তাই এটি নাল হতে পারে না, সুতরাং নাল-কোলেসিং অপারেটরটি এখানে বোঝায় না।

তবে আপনি এটি এমন কোনও সম্পত্তি দিয়ে করতে পারেন যা একটি রেফারেন্স টাইপ, উদাহরণস্বরূপ: var window = App.Current.MainWindow ?? new Window();


উদাহরণটি বর্তমানের শূন্য থাকলে আপনার পরিস্থিতিতে কী হবে তা বিবেচনা করার চেষ্টা করা হচ্ছে। আপনার উদাহরণটি কেবল ক্র্যাশ করবে ... তবে অপারেটর থাকা যে ভুল দিকনির্দেশ শৃঙ্খলে যে কোনও জায়গায় কোয়েলেস করতে পারে having
মীর

-1

আমি আগেও একইরকম ধারণা নিয়ে কাউকে দেখেছি তবে বেশিরভাগ সময় আপনি শূন্য ক্ষেত্রে নতুন মানটিও অর্পণ করতে চান, এরকম কিছু:

return _obj ?? (_obj = new Class());

সুতরাং ধারণাটি ছিল ??এবং =অ্যাসাইনমেন্টটি এর সাথে একত্রিত করা:

return _obj ??= new Class();

আমি মনে করি এটি বিস্মৃত চিহ্নটি ব্যবহার করার চেয়ে আরও বেশি অর্থবোধ করে।

এই ধারণাটি আমার নয় তবে আমি এটি সত্যিই পছন্দ করি :)


1
আপনি কি দরিদ্র উদাহরণের শিকার? আপনার উদাহরণটি সংক্ষিপ্ত করা যেতে পারে এখানে return _obj ?? new Class();কোনও প্রয়োজন ??=নেই।
ম্যাট এলেন

@ ম্যাট এলেন আপনার ভুল হয়েছে। অ্যাসাইনমেন্টটি উদ্দেশ্যযুক্ত । আমি একটি ভিন্ন বিকল্প প্রস্তাব করছি। এটি ওপি যা যা চেয়েছিল ঠিক তেমনটি নয় তবে আমি বিশ্বাস করি এটি ঠিক ততটাই কার্যকর হবে।
চকৃত

2
আপনি যদি কোনও মান ফেরত দিতে চলেছেন তবে আপনি কেন এই নিয়োগটি চান?
ম্যাট এলেন

অলস-আরম্ভের?
চক্রত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.