?: ?? অপারেটরগুলি IF এর পরিবর্তে | ELSE SE


85
public string Source
{
    get
    {
        /*
        if ( Source == null ){
            return string . Empty;
        } else {
            return Source;
        }
        */
        return Source ?? string.Empty;
    }
    set
    {
        /*
        if ( Source == null ) {
            Source = string . Empty;
        } else {
            if ( Source == value ) {
                Source = Source;
            } else {
                Source = value;
            }
        }
        */
        Source == value ? Source : value ?? string.Empty;
        RaisePropertyChanged ( "Source" );
    }
}

আমি কি ?: ??অপারেটরগুলিকে ঠিক / অন্য হিসাবে ব্যবহার করতে পারি ?


আমার প্রশ্ন :
নিম্নলিখিতটি কীভাবে লিখবেন?: ?? অপারেটর

[1]

if ( Source == null ){
    // Return Nothing
} else {
    return Source;
}

[২]

if ( Source == value ){
    // Do Nothing
} else {
    Source = value;
    RaisePropertyChanged ( "Source" );
} 

সংক্ষিপ্তভাবে : কীভাবে কিছুই করবেন না, কিছুই ফেরবেন না এবং ?: ??অপারেটরের সাথে একাধিক নির্দেশনা করবেন ?


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

4
যদি উত্স সম্পত্তির গেট অ্যাকসেসর উত্স সম্পত্তিটি (এটির অ্যাক্সেসর পান) ফিরিয়ে দিচ্ছে তবে আপনার একটি অবিরাম / পুনরাবৃত্ত কল হবে।
জন কে

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

কিছুই ফেরত না? এটাই ভিবি। আপনি এখানে সি লিখছেন।
টাস্ক

@ টাস্ক মানে আমি কীভাবে এটি করব, এই লাইনটি প্রশ্নের একটি মন্তব্য
আহমেদ ঘোনিম

উত্তর:


199

[1] এর জন্য, আপনি পারবেন না: এই অপারেটরগুলি কোনও মান ফেরত দেওয়ার জন্য তৈরি করা হয়, অপারেশন না করে।

এখনও বিক্রয়ের জন্য

a ? b : c

মূল্যায়ণ bযদি aসত্য এবং মূল্যায়ণ cযদি aমিথ্যা।

এখনও বিক্রয়ের জন্য

b ?? c

নাল না bহলে মূল্যায়ন করে bএবং নাল cহলে মূল্যায়ন করে b

যদি লিখি

return a ? b : c;

বা

return b ?? c;

তারা সর্বদা কিছু ফেরত দেবে

[২] এর জন্য, আপনি এমন একটি ফাংশন লিখতে পারেন যা আপনার "একাধিক ক্রিয়াকলাপ" সম্পাদন করে এমন সঠিক মান দেয় যা কেবলমাত্র ব্যবহারের চেয়ে খারাপ if/else


41

টার্নারি অপারেটর ( ?:) কন্ট্রোল প্রবাহের জন্য ডিজাইন করা হয়নি , এটি কেবল শর্তাধীন অ্যাসাইনমেন্টের জন্য তৈরি করা হয়েছে । আপনি যদি আপনার প্রোগ্রামের প্রবাহ নিয়ন্ত্রণ করতে চান তবে একটি নিয়ন্ত্রণ কাঠামো, যেমন if/ ব্যবহার করুন else


4
আমি যুক্ত করব যে আমি দেখেছি লোকেরা নেস্টেড টের্নারি এক্সপ্রেশনগুলি ব্যবহার করে / অন্যথায় এর জায়গায় ব্যবহার করে এবং এটি এমন কোড তৈরি করে যা পড়তে অসুবিধা হয় এবং ডিবাগ হয়। চারিদিকে খারাপ মোজো।
ckramer

4
কখনও কখনও নেস্টেড টেরিনারি অপারেটরগুলি আরও পঠনযোগ্য কোড উত্পাদন করে, যদি সাদা স্থানটি সঠিকভাবে ব্যবহার করা হয়।
ট্রুথিলিটি

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

11

উল্লেখ করছি?: অপারেটর (সি # রেফারেন্স)

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

রেফারিং করছেন ?? অপারেটর (সি # রেফারেন্স)

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

এর মানে:

[অংশ 1]

return source ?? String.Empty;

[অংশ 2] প্রযোজ্য নয় ...


4
এটি কিছুই না করার থেকে আলাদা। এটি একটি খালি স্ট্রিং প্রদান করে।
ট্রুথিলিটি

4
অবশ্যই, তবে ওপি যা চেয়েছিল তা নয়। যাই হোক না কেন - এটা আমার দোষ যে ওপি থেকে "রিটার্ন কিছুই" জিজ্ঞাসা না করে সম্ভবত অর্থ করতে পারেন।
ট্রুথিলিটি

4
@ সংশ্লেষ: কোনও সংস্থা বলেনি এটি আপনার দোষ However
আকরাম শাহদা

3

"কিছুই করবেন না" আসলেই কাজ করে না?

যদি // রিটার্ন কিছুই না আপনি আসলে রিটার্ন নাল বোঝাচ্ছেন তবে লিখুন

return Source;

আপনি যদি বলতে চান, কোডপথ উপেক্ষা করুন তবে লিখুন

 if ( Source != null )
            {
                return Source;
            }
// source is null so continue on.

এবং শেষের জন্য

 if ( Source != value )
            { Source = value;
                RaisePropertyChanged ( "Source" );
            }

// nothing done.

3

তিনটি অপারেটর দুটি মানগুলির মধ্যে একটিকে প্রত্যাবর্তন করে। অথবা, এটি তার অবস্থার উপর ভিত্তি করে দুটি বিবৃতিগুলির মধ্যে একটি কার্যকর করতে পারে তবে এটি সাধারণত ভাল ধারণা নয়, কারণ এটি অনিচ্ছাকৃত পার্শ্ব-প্রতিক্রিয়া সৃষ্টি করতে পারে।

bar ? () : baz();

এই ক্ষেত্রে, () কিছুই করে না, যখন বাজ কিছু করে। তবে আপনি কেবল কোডটি কম পরিষ্কার করেছেন। আমি আরও ভার্বোজ কোড যাব যা এটিকে পরিষ্কার এবং বজায় রাখা সহজ।

তদ্ব্যতীত, এটি মোটেও সামান্য অর্থ দেয়:

var foo = bar ? () : baz();

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


2

আপনি যদি আপনার কোডটির ভার্বোসটি নিয়ে উদ্বিগ্ন হন তবে আমি অভিব্যক্তিগুলিকে অপব্যবহার করার চেয়ে বরং এটি লিখব would

if (Source == value) return;
Source = value;
RaisePropertyChanged("Source");

আমি অভিব্যক্তিগুলিকে গালি দিচ্ছি না, আমি কেবল ভাবছি!
আহমেদ ঘোনিম

1

?? - এর ভ্রমণকারী অপারেটর। (বিশ্বাস করুন যে আমি এটি সঠিকভাবে বানান করেছি) এবং এটি ব্যবহার করা সহজ। যেমন একটি বুলিয়ান প্রিডিকেট? iftrue: ifalse; তবে আপনার অবশ্যই একটি মূল্য / লভালু যেমন rvalue = predict হিসাবে আছে? iftrue: iffalse;

প্রাক্তন int i = x < 7 ? x : 7;

যদি x 7 এর চেয়ে কম ছিল, আমি এক্স বরাদ্দ করতাম, না হলে আমি 7 হব।

আপনি যেমনটি ফেরতও ব্যবহার করতে পারেন return x < 7 ? x : 7;

আবার উপরে হিসাবে, এটি একই প্রভাব ফেলবে।

সুতরাং, Source = Source == value ? Source : string.Empty;আমি বিশ্বাস করি যে আপনি যা সচেষ্ট করার চেষ্টা করছেন।


6
আমি এটা পছন্দ করি. ভ্রমণপথ অপারেটর : এটা সাহায্য করে আপনি A থেকে সি বি A থেকে ... অথবা ... উ: তার উপর নির্ভর করে
রিক Sladkey

হ্যাঁ, তার অর্থ তিনটি। তবে সঠিক নামটি "শর্তসাপেক্ষ"।
এরিক জি। হ্যাজস্ট্রোম

1

?:অপারেটর একটি বুলিয়ান অভিব্যক্তি মান উপর নির্ভর করে দুইটি মানের এক ফেরৎ।

Condition-Expression ? Expression1 : Expression2

?:অপারেটরে এখানে আরও সন্ধান করুন , টার্নারি অপারেটর হিসাবেও জানেন:


0

আমি মনে করি না আপনি এটির কোনও অপারেটর এবং এটি মনে করতে পারেন যে তারা এক বা অন্যটিকে ফেরত দিতে পারেন। এটি অন্য কোনও বিবৃতি প্রতিস্থাপন নয় যদিও এটি নির্দিষ্ট ক্ষেত্রে এটির জন্য ব্যবহার করা যেতে পারে।

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