নাল কোলেসিং অপারেটরের কোনও "বিপরীত" আছে? (… কোন ভাষায়?)


93

নাল কোয়েলসিং মোটামুটিভাবে অনুবাদ করে return x, unless it is null, in which case return y

আমার প্রায়শই প্রয়োজন return null if x is null, otherwise return x.y

আমি ব্যাবহার করতে পারি return x == null ? null : x.y;

খারাপ নয়, তবে nullমাঝখানে যে আমাকে সর্বদা বিরক্ত করে - এটি অতিমাত্রায় লাগে। আমি এমন কিছু পছন্দ করতাম return x :: x.y;, যেখানে যা অনুসরণ করা ::হয় কেবল তার পরে যদি তা না হয় তবে মূল্যায়ন করা হয় null

আমি এটিকে নাল একত্রিত হওয়ার প্রায় বিপরীত হিসাবে দেখছি , এক প্রকার মিশ্রিত মিশ্রিত, ইনলাইন নাল-চেক, তবে আমি [ প্রায় ] নিশ্চিত যে সি # তে এরকম কোনও অপারেটর নেই।

অন্য ভাষা আছে যে যেমন একটি অপারেটর আছে? যদি তাই হয়, এটা কি বলা হয়?

(আমি জানি যে আমি সি # তে এর জন্য একটি পদ্ধতি লিখতে পারি; আমি ব্যবহার করি return NullOrValue.of(x, () => x.y);তবে আপনার যদি আরও ভাল কিছু থাকে তবে আমি এটিও দেখতে চাই))


কিছু সি # তে x? .Y এর মতো কিছু জিজ্ঞাসা করেছেন, তবে এর মতো কিছুই নেই।
অ্যান্টনি পেগ্রাম

4
@ অ্যান্টনি ওহ, এটি সুন্দর হবে। ধন্যবাদ
জে

4
সি ++ এ, এটি হিসাবে প্রকাশ করা যথেষ্ট সহজ হবে return x ? x.y : NULL। পয়েন্টার ধরণগুলি বুলিয়ানগুলিতে রূপান্তর করার জন্য হ্যাঁ!
ফিল মিলার

4
@ নভোলোকেট যা সি # তে আমাকে সবচেয়ে বেশি বিরক্ত করে তা হ'ল তারা সি অনুসরণ করেনি যদি তবে যদি (কিছু) = সত্য হয় তবে যদি এটি হয় (0, মিথ্যা, নাল)
ক্রিস মেরিসিক

4
@ ক্রিস: এটি সি সম্পর্কে সঠিক বিবৃতি নয় তবে আপনার যদি স্ক্যানারবিহীন ভেরিয়েবল (যেমন স্ট্রাক্ট) থাকে তবে আপনি এটি একটি পরিস্থিতিতে ব্যবহার করতে পারবেন না।
ফিল মিলার

উত্তর:


62

আছে নাল-নিরাপদ dereferencing অপারেটর (?)। খাঁজকাটা করুন ... আমি মনে করি কি আপনি পরে থাকেন যে।

(একে নিরাপদ নেভিগেশন অপারেটরও বলা হয় ))

উদাহরণ স্বরূপ:

homePostcode = person?.homeAddress?.postcode

এই নাল যদি দেব person, person.homeAddressঅথবা person.homeAddress.postcodeনাল হয়।

(এটি এখন সি # 6.0 এ উপলব্ধ তবে পূর্ববর্তী সংস্করণগুলিতে নয়)


4
গ্রোভির "এলভিস অপারেটর" রয়েছে, যা ডিফল্ট মানগুলি nullযেমন, যেমন:def bar = foo ?: "<null>"
ক্রেগ স্টান্টজ

28
আমি সি # 5.0 এর জন্য এই বৈশিষ্ট্যটি মনোনীত করি। গ্রোভি আসলে কী তা আমি জানি না বা যত্ন করি না, তবে এটি কোনও ভাষায় ব্যবহারের জন্য যথেষ্ট স্বজ্ঞাত।
গিরিগিরিস আন্দ্রেসেক

এটি এখন সি # 6 এ যুক্ত হচ্ছে, হুরয়।
জেফ মার্কাডো

4
তুচ্ছ উদাহরণস্বরূপ নিরাপদ-গৌণ কাজ পোস্ট, কিন্তু আপনি এখনও উদাহরণস্বরূপ আপনি একটি ফাংশন কল অ নাল মান ব্যবহার করতে মনস্থ তিন অপারেটর ব্যবহার করতে প্রয়োজন: Decimal? post = pre == null ? null : SomeMethod( pre );। যদি আমি এটিকে "দশমিক? পোস্ট = প্রাক :: সোমমেথোদ (প্রাক)" এ নামিয়ে আনতে পারি তবে ভাল লাগবে;
দাই

@ ডাই: আপনি যে পরিমাণ অনুমানের প্রয়োজন হতে পারে তা প্রদত্ত, আমরা যা পেয়েছি তাতে আমি যথেষ্ট খুশি।
জন স্কিটি

36

আমরা যুক্ত বিবেচনা ?. সি # 4. এটি কাটা হয়নি; এটি একটি "ভাল লাগবে" বৈশিষ্ট্য, একটি "থাকতে হবে" বৈশিষ্ট্য নয়। ভাষার অনুমানমূলক ভবিষ্যতের সংস্করণগুলির জন্য আমরা এটি আবার বিবেচনা করব, তবে আমি যদি আপনি থাকতাম তবে আমি অপেক্ষা করছিলাম না। সময়ের সাথে সাথে এটি আর কোনও জটিল হওয়ার সম্ভাবনা নেই। :-)


কোনও বৈশিষ্ট্য প্রয়োগ করার স্বাচ্ছন্দ্য কি এটিকে যুক্ত করার সিদ্ধান্ত নিয়েছে? আমি এটি জিজ্ঞাসা করছি কারণ অপারেটরটি প্রয়োগ করা মোটামুটি সোজা এগিয়ে, ভাষায় সহজ সংযোজন বলে মনে হয়। আমি কোনও বিশেষজ্ঞ নই (সি # এর জন্য বড় ভালবাসার সাথে সাম্প্রতিক গ্রেড), তাই দয়া করে আমাকে সংশোধন করুন!
নিক স্ট্রাপ্যাট

14
@ নিক: অবশ্যই, লেক্সার এবং পার্সার কার্যকর করা পাঁচ মিনিটের কাজ। তারপরে আপনি "ইন্টেলিজেন্স ইঞ্জিনটি কী এটি ভালভাবে পরিচালনা করে?" এবং "টাইপ করার সময় ত্রুটি-পুনরুদ্ধার সিস্টেমটি এর সাথে কীভাবে কাজ করবে? তবে এখনও নয়?" এবং ঠিক কতগুলি ভিন্ন কাজ করে ""। যাইহোক যাইহোক, সি # এর অর্থ কী, এবং তাদের মধ্যে কতটি পাওয়ার যোগ্য? এটির আগে এবং ত্রুটি বার্তাগুলি কী হওয়া উচিত যদি আপনি এটির ভুল হয়ে যান এবং এই বৈশিষ্ট্যটির কতটা পরীক্ষার প্রয়োজন হবে (ইঙ্গিত: প্রচুর)) এবং আমরা কীভাবে এটি নথিভুক্ত করব এবং পরিবর্তনটি যোগাযোগ করব, এবং ...
এরিক লিপার্ট

4
@ নিক: আপনার প্রশ্নের উত্তর দেওয়ার জন্য - হ্যাঁ, বাস্তবায়ন ব্যয় একটি ফ্যাক্টর তবে একটি ছোট্ট। আমরা যে স্তরে কাজ করি সেখানে কোনও সস্তা বৈশিষ্ট্য নেই, কেবলমাত্র কম বা বেশি ব্যয়বহুল বৈশিষ্ট্য। সঠিক কোডের ক্ষেত্রে পার্সারকে তৈরি করার জন্য পাঁচ ডলার মূল্যের কাজটি সহজেই কয়েক হাজার ডলার মূল্যের নকশা, বাস্তবায়ন, পরীক্ষা, ডকুমেন্টেশন এবং শিক্ষায় রূপান্তর করতে পারে।
এরিক লিপার্ট

11
@ এরিকলিপার্ট আমি মনে করি এটি মেজোরের মধ্যে একটি হতে পারে "ভাল লাগছে", যা সি # কে এত সফল করে তুলেছে এবং যথাযথভাবে সংক্ষিপ্ত এবং মত প্রকাশের কোড তৈরির মিশনকে নিখুঁতভাবে পরিবেশন করবে!
কনস্টান্টিন

: আমি এই যোগ দেখতে একটা কাজ যা আমি চাই এলভিস অপারেটর চাই stackoverflow.com/questions/2929836/...
ক্রিস Marisic

16

যদি আপনি একটি বিশেষ ধরণের শর্ট সার্কিট বুলিয়ান যুক্তি পেয়ে থাকেন তবে আপনি এটি করতে পারেন (জাভাস্ক্রিপ্ট উদাহরণ):

return x && x.y;

যদি xনাল হয় তবে তা মূল্যায়ন করবে না x.y


4
এটি 0, "" এবং NaN এও শর্ট সার্কিট বাদে, তাই এটি ?? এর বিপরীত নয়। এর বিপরীত ||
রিতাজ

7

উত্তর হিসাবে এটি যুক্ত করা ঠিক মনে হয়েছিল।

আমি ধারণা করি যে সি # তে এ জাতীয় কোনও জিনিস নেই কেননা, কোলেসিং অপারেটর (যা কেবলমাত্র রেফারেন্স টাইপের জন্য বৈধ) এর বিপরীতে, বিপরীতমুখী ক্রিয়াকলাপটি কোনও রেফারেন্স বা মান প্রকার (যেমন class xসদস্য সহ প্রাপ্ত int yহতে পারে - সুতরাং দুর্ভাগ্যক্রমে হবে) অনেক পরিস্থিতিতে ব্যবহারের অযোগ্য।

আমি অবশ্য বলছি না যে আমি এটি দেখতে চাই না!

এই সমস্যার একটি সম্ভাব্য সমাধান অপারেটরকে স্বয়ংক্রিয়ভাবে ডান-হাতের দিকের একটি মান ধরণের এক্সপ্রেশনটি একটি শুরুর দিকে নিয়ে যেতে পারে। তবে তারপরে আপনার ইস্যুটি রয়েছে যে x.yy যেখানে কোন অন্তর্নিহিত হবে আসলে int?একটি ব্যথা হবে return

আরেকটি, সম্ভবত আরও ভাল, সমাধানটি বাম দিকের এক্সপ্রেশনটি শূন্য হলে ডান হাতের প্রকারটির জন্য অপারেটরের জন্য ডিফল্ট মান (অর্থাত নাল বা শূন্য) ফেরত দেওয়া হবে। তবে তারপরে আপনার কাছে পরিস্থিতিগুলি আলাদা করার সমস্যা রয়েছে যেখানে শূন্য / নালটি আসলে পড়েছিল x.yবা সেফ-অ্যাক্সেস অপারেটর দ্বারা সরবরাহ করা হয়েছিল।


আমি যখন প্রথমবার ওপির প্রশ্নটি পড়ি, তখন এই সঠিক বিষয়টিটি আমার মাথায় .ুকে গেল, তবে কীভাবে তা স্পষ্ট করে বলতে পারি তা আমি পেরে উঠতে পারি নি। এটি একটি খুব গুরুতর সমস্যা। +1
রোমেডোর

এটি কোনও গুরুতর সমস্যা নয়। কেবলমাত্র int?ডিফল্ট রিটার্ন মান হিসাবে ব্যবহার করুন , এবং ব্যবহারকারী চাইলে এটি একটি ইনট এ পরিবর্তন করতে পারে। উদাহরণস্বরূপ, যদি আমি আমার কোনও Lookupউল্লেখের ক্ষেত্রে -1 এর একটি ডিফল্ট মান সহ কিছু পদ্ধতি কল করতে চাই null:foo?.Bar?.Lookup(baz) ?? -1
কুয়েরটি

?. :টেরিনারি অপারেটর হওয়ার বিষয়ে কীভাবে ডান-হাতটি মাঝখানে প্রদত্ত উপযুক্ত সদস্য হিসাবে একই ধরণের হওয়া প্রয়োজন?
সুপারক্যাট

6

ডেলফির রয়েছে: (পরিবর্তে) অপারেটর, যা নাল-নিরাপদ।

তারা একটি যুক্ত করার কথা ভাবছিলেন? অপারেটর সি # 4.0 এ একই কাজ করুন তবে এটি চপিং ব্লক পেয়েছে।

এরই মধ্যে, ifNotNull () রয়েছে যা কোন ধরণের স্ক্র্যাচ চুলকায় । এটা অবশ্যই বড়?? বা:, তবে এটি আপনাকে এমন একটি ক্রিয়াকলাপ রচনা করতে দেয় যা কোনও সদস্যের শূন্য থাকলে আপনার কাছে নুলারফেরান এক্সেপশনকে ব্যাহত করবে না।


আপনি এই অপারেটর ব্যবহার করে একটি উদাহরণ দিতে পারেন দয়া করে?
সর্বাধিক ক্যারল

4
?.একটি সি # 6.0 ভাষা বৈশিষ্ট্য, এবং হ্যাঁ এটা ঠিক কি ওপি এখানে আসতে বলেছি না। কখনও না late
T_D

3

হাসকেলে, আপনি >>অপারেটরটি ব্যবহার করতে পারেন :

  • Nothing >> Nothing হয় Nothing
  • Nothing >> Just 1 হয় Nothing
  • Just 2 >> Nothing হয় Nothing
  • Just 2 >> Just 1 হয় Just 1

3

হাস্কেলের রয়েছে fmap, যা এই ক্ষেত্রে আমি সমতুল্য বলে মনে করি Data.Maybe.map। হাস্কেল নিখুঁতভাবে কার্যকরী, তাই আপনি যা খুঁজছেন তা হবে

fmap select_y x

যদি xহয় Nothing, এই ফিরে আসে Nothing। যদি xহয় Just object, এই ফিরে আসে Just (select_y object)। বিন্দু চিহ্নিতকরণের মতো সুন্দর নয়, তবে এটি একটি কার্যকরী ভাষা বলে শৈলীগুলি পৃথক।


2

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

$x = $null
$result = $x.y  # $result is null

$x = New-Object PSObject
$x | Add-Member NoteProperty y 'test'
$result = $x.y  # $result is 'test'

এটি সুন্দর নয় তবে আপনি একটি এক্সটেনশন পদ্ধতি যুক্ত করতে পারেন যা আপনার বর্ণনার মতো কাজ করবে।

public static TResult SafeGet<T, TResult>(this T obj, Func<T, TResult> selector) {
    if (obj == null) { return default(TResult); }
    else { return selector(obj); }
}

var myClass = new MyClass();
var result = myClass.SafeGet(x=>x.SomeProp);

2
public class ok<T> {
    T s;
    public static implicit operator ok<T>(T s) { return new ok<T> { s = s }; }
    public static implicit operator T(ok<T> _) { return _.s; }

    public static bool operator true(ok<T> _) { return _.s != null; }
    public static bool operator false(ok<T> _) { return _.s == null; }
    public static ok<T> operator &(ok<T> x, ok<T> y) { return y; }
}

স্ট্রিংগুলির জন্য আমার প্রায়শই এই যুক্তি প্রয়োজন:

using ok = ok<string>;

...

string bob = null;
string joe = "joe";

string name = (ok)bob && bob.ToUpper();   // name == null, no error thrown
string boss = (ok)joe && joe.ToUpper();   // boss == "JOE"

1

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

উদাহরণ স্বরূপ:

z = new Thingy { y=null };

তার পরিবর্তে আপনার

return x != null ? x.y : null;

তুমি লিখতে পারো

return (x ?? z).y;

আমি সেই কৌশলটি মাঝে মাঝে ব্যবহার করি (যেমন (x ?? "")। টোস্ট্রিং ()) তবে এটি কেবলমাত্র কয়েকটি ডেটা ধরণের যেমন পিওডি এবং স্ট্রিংগুলিতে ব্যবহারিক।
কিওয়ারটি

1

এটি সি # ভিএনেক্সটে যুক্ত করা হচ্ছে (রোজলিন চালিত সি #, ভিজ্যুয়াল স্টুডিও 2014 এর সাথে প্রকাশিত)।

একে নুল প্রচার বলা হয় এবং এখানে সম্পূর্ণ হিসাবে তালিকাভুক্ত করা হয়। https://roslyn.codeplex.com/wikipage?title=Language%20 ফিচার ১০০ স্ট্যাটাস

এটি সম্পূর্ণ হিসাবে এখানেও তালিকাভুক্ত করা হয়েছে: https://visualstudio.uservoice.com/forums/121579- ভিজ্যুয়াল- স্টুডিও / সাগেশনস / 3990187- অ্যাড- কপিরেটর- to-c


1

তথাকথিত "নাল-কন্ডিশনাল অপারেটর" সি # 6.0 এবং ভিজ্যুয়াল বেসিক 14
এ চালু করা হয়েছে । অনেক পরিস্থিতিতে এটি নাল-কোয়েলসিং অপারেটরের ঠিক বিপরীত হিসাবে ব্যবহার করা যেতে পারে:

int? length = customers?.Length; // null if customers is null   
Customer first = customers?[0];  // null if customers is null  
int? count = customers?[0]?.Orders?.Count();  // null if customers, the first customer, or Orders is null

https://docs.microsoft.com/en-us/dotnet/csharp/language-references/operators/null-conditional-operators

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