নাল কোলেসিং অপারেটর ব্যবহারের অনন্য উপায় [বন্ধ]


164

আমি জানি যে সি # তে নল কোয়েলসিং অপারেটরটি ব্যবহারের মানক উপায়টি হ'ল ডিফল্ট মান সেট করা।

string nobody = null;
string somebody = "Bob Saget";
string anybody = "";

anybody = nobody   ?? "Mr. T"; // returns Mr. T
anybody = somebody ?? "Mr. T"; // returns "Bob Saget"

তবে আর কী ??ব্যবহার করা যায়? এটি এর চেয়ে আরও সংক্ষিপ্ত এবং পড়া সহজ হওয়ার চেয়ে, টার্নারি অপারেটরের মতো কার্যকর বলে মনে হচ্ছে না:

nobody = null;
anybody = nobody == null ? "Bob Saget" : nobody; // returns Bob Saget

সুতরাং যে কম এমনকি নাল coalescing অপারেটর সম্পর্কে জানেন ...

  • আপনি ??অন্য কিছুর জন্য ব্যবহার করেছেন?

  • কি ??প্রয়োজন হয় তাহলে, অথবা আপনি শুধু তিন অপারেটর ব্যবহার করা উচিত (যে সবচেয়ে সাথে পরিচিত)

উত্তর:


216

ওয়েল, সবার আগে, স্ট্যান্ডার্ড টার্নারিগুলির চেয়ে চেইন করা আরও সহজ:

string anybody = parm1 ?? localDefault ?? globalDefault;

বনাম

string anyboby = (parm1 != null) ? parm1 
               : ((localDefault != null) ? localDefault 
               : globalDefault);

নাল-সম্ভব বস্তুটি পরিবর্তনশীল না হলে এটিও ভালভাবে কাজ করে:

string anybody = Parameters["Name"] 
              ?? Settings["Name"] 
              ?? GlobalSetting["Name"];

বনাম

string anybody = (Parameters["Name"] != null ? Parameters["Name"] 
                 : (Settings["Name"] != null) ? Settings["Name"]
                 :  GlobalSetting["Name"];

12
চেইনিং অপারেটরের জন্য একটি বড় প্লাস, অপ্রয়োজনীয়
আইএফগুলির

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

177

আমি এটি একটি অলস বোঝা ওয়ান-লাইনার হিসাবে ব্যবহার করেছি:

public MyClass LazyProp
{
    get { return lazyField ?? (lazyField = new MyClass()); }
}

রিডেবল? নিজের জন্য সিদ্ধান্ত নিন।


6
হুম, আপনি "কাউকে কেন এটিকে অবহেলিত আইএফ হিসাবে ব্যবহার করতে চান" - এর জন্য একটি পাল্টা নমুনা খুঁজে পেয়েছেন ... এটি আমার কাছে খুব পঠনযোগ্য।
গোদেকে

6
আমি হয়ত কিছু মিস করছি (আমি বেশিরভাগ জাভা ব্যবহার করি) তবে সেখানে কি রেসের শর্ত নেই?
জাস্টিন কে

9
@ জাস্টিন কে - যদি একাধিক থ্রেড একই বস্তুর লাজিপ্রপ সম্পত্তিটি অ্যাক্সেস করে তবে কেবলমাত্র রেসের শর্ত রয়েছে। এটি প্রতিটি তালিকার থ্রেড সাফটি প্রয়োজন হলে এটি একটি লক দিয়ে সহজেই ঠিক করা যায়। এই উদাহরণে পরিষ্কারভাবে, এটি প্রয়োজন হয় না।
জেফরি এল হুইলেটজ

5
@ জেফ্রি: যদি এটি পরিষ্কার হত তবে আমি প্রশ্ন জিজ্ঞাসা করতাম না। :) যখন আমি উদাহরণটি দেখেছি, আমি তত্ক্ষণাত্ সিঙ্গেলটন সদস্যের কথা ভেবেছিলাম, এবং যেহেতু আমি আমার বহু কোডিং একটি বহুবিধ পরিবেশে করি ... তবে, হ্যাঁ, আমরা যদি কোডটি সঠিক বলে ধরে নিই, তবে অতিরিক্ত কিছু অপ্রয়োজনীয় is
জাস্টিন কে

7
রেসের শর্ত থাকতে এটি একক হতে হবে না। LazyProp, এবং LazyProp অ্যাক্সেস একাধিক থ্রেড রয়েছে এমন শ্রেণীর কেবলমাত্র একটি ভাগ করা উদাহরণ। অলস <T> এই ধরণের কাজ করার একটি ভাল উপায় এবং এটি ডিফল্টরূপে থ্রেডসফেট হয় (আপনি অলস <টি> এর থ্রেডফ্যাটি পরিবর্তন করতে নির্বাচন করতে পারেন)।
নিলাল কানফটন

52

আমি এটি দুটি "সামান্য বিজোড়" উপায়ে দরকারী বলে মনে করেছি:

  • রুটিনগুলি outলেখার সময় প্যারামিটার থাকার বিকল্প হিসাবে TryParse(যেমন পার্সিং ব্যর্থ হলে নাল মানটি ফেরান)
  • তুলনা করার জন্য "জানেন না" প্রতিনিধিত্ব হিসাবে

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

public int Compare(Person p1, Person p2)
{
    return PartialComparer.Compare(p1.Age, p2.Age)
        ?? PartialComparer.Compare(p1.Name, p2.Name)
        ?? PartialComparer.Compare(p1.Salary, p2.Salary)
        ?? 0;
}

স্বীকারোক্তিজনকভাবে আমার এখন কিছু এক্সটেনশান সহ মিস্কটিলের প্রজেকশনকম্পার রয়েছে, যা এই ধরণের জিনিসটিকে আরও সহজ করে তোলে - তবে এটি এখনও ঝরঝরে।

সমান বাস্তবায়ন শুরুতে রেফারেন্স সমতা (বা নালিকা) জন্য পরীক্ষা করার জন্য এটি একই কাজ করা যেতে পারে।


আমি আংশিক কম্পিউটারের সাথে আপনি যা করেছেন তা পছন্দ করি তবে আমি এমন কেস খুঁজছিলাম যেখানে আমাকে মূল্যায়িত এক্সপ্রেশন ভেরিয়েবলগুলি রাখা দরকার। আমি ল্যাম্বডাস এবং এক্সটেনশানগুলিতে পারদর্শী নই, সুতরাং আপনি কি দেখতে পাচ্ছেন যে নীচেরগুলি একই ধরণটির (যেমন এটি কাজ করে) মেনে চলে? স্ট্যাকওভারফ্লো.com
প্রশ্নগুলি /

33

আরেকটি সুবিধা হ'ল টার্নারি অপারেটরের জন্য একটি দ্বিগুণ মূল্যায়ন বা একটি অস্থায়ী পরিবর্তনশীল প্রয়োজন।

উদাহরণস্বরূপ এটি বিবেচনা করুন:

string result = MyMethod() ?? "default value";

টেরিনারি অপারেটরের সাথে থাকাকালীন আপনি উভয়ের সাথেই রয়েছেন:

string result = (MyMethod () != null ? MyMethod () : "default value");

যা মাইমেথোদকে দু'বার কল করে বা:

string methodResult = MyMethod ();
string result = (methodResult != null ? methodResult : "default value");

যে কোনও উপায়ে, নাল কোলেসিং অপারেটরটি আরও পরিষ্কার এবং আমার ধারণা, আরও দক্ষ efficient


1
+1 টি। নাল কোয়েলসিং অপারেটরটি কেন পছন্দ করার এটি একটি বড় কারণ। কলিংয়ের MyMethod()কোনও ধরণের পার্শ্ব প্রতিক্রিয়া থাকলে এটি বিশেষভাবে কার্যকর ।
একটি সিভিএন

যদি MyMethod()কোনও মান ফেরত দেওয়ার বাইরে কোনও প্রভাব না থাকে তবে সংকলক দুটি বার এটি কল করতে না জানে, তাই আপনাকে বেশিরভাগ ক্ষেত্রেই দক্ষতার বিষয়ে চিন্তা করতে হবে না।
টিনিটাইমজম্বনি

যখন MyMethod()বিন্দুযুক্ত বস্তুর একটি শৃঙ্খলিত ক্রম হয় তখন এটি জিনিসগুলিকে আরও পঠনযোগ্য আইএমএইচও রাখে । উদা:myObject.getThing().getSecondThing().getThirdThing()
xdmoore

@ টিনিটিমজাম্বোনি, সংকলকের এই আচরণের জন্য আপনার কাছে কি কোনও রেফারেন্স রয়েছে?
কুবা ওয়াইরোস্টেক

@ কুবাওয়াইরোস্টেক সি # সংকলকের নির্দিষ্ট কাজ সম্পর্কে আমার জ্ঞান নেই তবে আমার কাছে এলএলভিএম সহ স্থির সংকলক তত্ত্বের কিছু অভিজ্ঞতা আছে। একটি সংকলক এরকম কলটিকে অনুকূল করতে অনেকগুলি পন্থা নিতে পারে। গ্লোবাল মান সংখ্যাকরণ লক্ষ্য করবে যে দুটি কল MyMethodএই প্রসঙ্গে একই, এটি ধরে নেওয়া যে MyMethodএটি একটি বিশুদ্ধ ফাংশন। আরেকটি বিকল্প হ'ল স্বয়ংক্রিয় স্মৃতিচারণ বা কেবল ক্যাশে ফাংশনটি বন্ধ করা। অন্যদিকে: en.wikipedia.org/wiki/Global_value_numbering
TinyTimZamboni

23

আরেকটি বিষয় বিবেচনা করার বিষয় হ'ল কোলেসেস অপারেটর ত্রৈমাসিকের মতো কোনও সম্পত্তি পাওয়ার পদ্ধতিটিকে দু'বার কল করে না।

সুতরাং এমন পরিস্থিতিতে রয়েছে যেখানে আপনার তিনটি ব্যবহার করা উচিত নয়, উদাহরণস্বরূপ:

public class A
{
    var count = 0;
    private int? _prop = null;
    public int? Prop
    {
        get 
        {
            ++count;
            return _prop
        }
        set
        {
            _prop = value;
        }
    }
}

আপনি যদি ব্যবহার করেন:

var a = new A();
var b = a.Prop == null ? 0 : a.Prop;

প্রাপ্তকারীটিকে দু'বার কল করা হবে এবং countভেরিয়েবল 2 এর সমান হবে এবং আপনি যদি ব্যবহার করেন:

var b = a.Prop ?? 0

countপরিবর্তনশীল হিসাবে এটি করা উচিত, 1 সমান হতে হবে।


4
এটি আরও উন্নয়নের দাবিদার। আমি যে sooo অনেক বার পড়েছি ??হয় সমতুল্য করার ?:
কুবা ওয়াইরোস্টেক

1
একজন গেটর সম্পর্কে দু'বার কল করা সম্পর্কে বৈধ পয়েন্ট। তবে এই উদাহরণটি আমি খারাপ ডিজাইনের প্যাটারটিকে এই ধরণের বিভ্রান্তিকরভাবে নামকরণকারী হিসাবে আসলে অবজেক্টে পরিবর্তন আনতে বিবেচনা করব।
লিনাস

15

??অপারেটরের কাছে আমার সর্বাধিক সুবিধাটি হ'ল আপনি সহজেই মূল্যহীন মান ধরণেরকে অ-শনাক্তযোগ্য ধরণের রূপান্তর করতে পারেন:

int? test = null;
var result = test ?? 0; // result is int, not int?

আমি প্রায়শই লিনক ক্যোয়ারিতে এটি ব্যবহার করি:

Dictionary<int, int?> PurchaseQuantities;
// PurchaseQuantities populated via ASP .NET MVC form.
var totalPurchased = PurchaseQuantities.Sum(kvp => kvp.Value ?? 0);
// totalPurchased is int, not int?

আমি এখানে কিছুটা দেরি করতে পারি, তবে সেই দ্বিতীয় উদাহরণটি যদি ফেলে দেয় kvp == null। এবং আসলে Nullable<T>একটি GetValueOrDefaultপদ্ধতি রয়েছে যা আমি সাধারণত ব্যবহার করি।
CompuChip

6
KeyValuePair .NET ফ্রেমওয়ার্কে একটি মান ধরণের, সুতরাং এর কোনও বৈশিষ্ট্য অ্যাক্সেস করা কখনই শূন্য রেফারেন্স ব্যতিক্রম নষ্ট করে না। এমএসডিএন.মাইক্রোসফট.এইন.উস
রায়ান

9

আমি ব্যবহার করেছি ?? আমার IDataErrorInfo বাস্তবায়নে:

public string Error
{
    get
    {
        return this["Name"] ?? this["Address"] ?? this["Phone"];
    }
}

public string this[string columnName]
{
    get { ... }
}

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


মজাদার. আপনি সম্পত্তি হিসাবে "এটি" ব্যবহার করছেন। আমি কখনই করিনি।
আর্মস্ট্রোনস্ট

হ্যাঁ, এটি IDataErrorInfo কীভাবে কাজ করে তার একটি অংশ। সাধারণত সংশ্লেষ শুধুমাত্র সংগ্রহের ক্লাসে কার্যকর।
ম্যাট হ্যামিল্টন

4
আপনি ত্রুটি বার্তা সঞ্চয় করেছেন this["Name"], this["Address"]ইত্যাদি ??
অ্যান্ড্রু

7

Anচ্ছিক পরামিতি সেট করা নেই এমন ক্ষেত্রে এটি পরিচালনা করতে আপনি কিছুটা পরিষ্কার করতে নাল কোলেসিং অপারেটরটি ব্যবহার করতে পারেন:

public void Method(Arg arg = null)
{
    arg = arg ?? Arg.Default;
    ...

এই লাইনটি যেমন লেখা যেতে পারে তবে কি দুর্দান্ত লাগবে না arg ?= Arg.Default?
জেসি ডি উইট

6

আমি অলস লোড নির্দিষ্ট বৈশিষ্ট্যগুলির জন্য নাল কোলেসেস অপারেটরটি ব্যবহার করতে চাই।

কেবলমাত্র আমার বক্তব্য চিত্রিত করার জন্য একটি খুব সাধারণ (এবং স্বীকৃত) উদাহরণ:

public class StackOverflow
{
    private IEnumerable<string> _definitions;
    public IEnumerable<string> Definitions
    {
        get
        {
            return _definitions ?? (
                _definitions = new List<string>
                {
                    "definition 1",
                    "definition 2",
                    "definition 3"
                }
            );
        }
    } 
}

রিশার্পার আসলে এটি একটি "traditionalতিহ্যবাহী" অলস লোডের জন্য একটি চুল্লি হিসাবে পরামর্শ দেবে।
আরিচার্ডস

5

হয় ?? প্রয়োজনীয়, বা আপনার কেবলমাত্র টার্নারি অপারেটরটি ব্যবহার করা উচিত (যার সাথে সর্বাধিক পরিচিত)

প্রকৃতপক্ষে, আমার অভিজ্ঞতাটি হ'ল খুব কম লোকই টেরিনারি অপারেটরের সাথে পরিচিত (বা আরও সঠিকভাবে শর্তসাপেক্ষ অপারেটর; ?:একই অর্থে ||বাইনারি বা "টেরিনারি")+ পারেন ইউনারী বা বাইনারি হয়; তবে হতে ঘটতে নেই অনেক ভাষায় কেবলমাত্র টেরিনারি অপারেটর), তাই কমপক্ষে সেই সীমাবদ্ধ নমুনায় আপনার বক্তব্যটি ঠিক সেখানে ব্যর্থ।

এছাড়াও, যেমনটি আগেই উল্লেখ করা হয়েছে, নাল কোয়েলসিং অপারেটর যখন খুব কার্যকর তখন একটি বড় পরিস্থিতি রয়েছে এবং তা যখনই হয় তখনই অভিব্যক্তিটির মূল্যায়নের কোনও পার্শ্ব প্রতিক্রিয়া হয়। সেক্ষেত্রে আপনি (ক) অস্থায়ী পরিবর্তনশীল প্রবর্তন না করে বা (খ) অ্যাপ্লিকেশনটির আসল যুক্তি পরিবর্তন না করে শর্তযুক্ত অপারেটরটি ব্যবহার করতে পারবেন না । (খ) কোনও পরিস্থিতিতে স্পষ্টতই উপযুক্ত নয়, এবং এটি ব্যক্তিগত পছন্দ হওয়ার পরেও আমি ঘোষণার সুযোগটিকে প্রচুর পরিমাণে বহিরাগতের সাথে আঁকড়ে ধরতে পছন্দ করি না, এমনকি স্বল্প-জীবনী, ভেরিয়েবলগুলিও তাই (ক) এর বাইরেও রয়েছে নির্দিষ্ট দৃশ্য

অবশ্যই, যদি আপনাকে ফলাফলটিতে একাধিক চেক করার প্রয়োজন হয় তবে শর্তসাপেক্ষ অপারেটর, বা ifব্লকের একটি সেট সম্ভবত কাজের জন্য সরঞ্জাম। তবে সরল "যদি এটি নাল হয় তবে এটি ব্যবহার করুন, অন্যথায় এটি ব্যবহার করুন", নাল কোলেসিং অপারেটরটি ??সঠিক।


আমার কাছ থেকে খুব দেরিতে মন্তব্য - তবে কারও প্রচ্ছদ দেখে খুশি হলেন যে কোনও তিন্নি অপারেটর এমন তিনটি যুক্তিযুক্ত অপারেটর (যার মধ্যে এখন সি # তে একাধিক লোক রয়েছে)।
স্টিভ কিড

5

একটি জিনিস যা আমি ইদানীং অনেকগুলি করছি ব্যাকআপগুলিতে নাল কোলেসিং ব্যবহার করা as। উদাহরণ স্বরূপ:

object boxed = 4;
int i = (boxed as int?) ?? 99;

Console.WriteLine(i); // Prints 4

এটি লম্বা চেইনের ব্যাক আপ করার জন্যও কার্যকর ?.যা এতে প্রতিটি ব্যর্থ হতে পারে

int result = MyObj?.Prop?.Foo?.Val ?? 4;
string other = (MyObj?.Prop?.Foo?.Name as string)?.ToLower() ?? "not there";

4

নাল-কোলেস অপারেটর খালি স্ট্রিং সনাক্ত করতে পারে না শুধুমাত্র সমস্যা।


অর্থাত

string result1 = string.empty ?? "dead code!";

string result2 = null ?? "coalesced!";

আউটপুট:

result1 = ""

result2 = coalesced!

আমি বর্তমানে ওভাররাইডের দিকে তাকাচ্ছি ?? এই চারপাশে কাজ অপারেটর। এটি ফ্রেমওয়ার্কে তৈরি করা নিশ্চিত হবে।

থটস?


আপনি এটি এক্সটেনশন পদ্ধতিগুলির সাহায্যে করতে পারেন তবে আমি সম্মত, এটি কোডের জন্য একটি দুর্দান্ত সংযোজন এবং ওয়েব প্রসঙ্গে খুব দরকারী।
আর্মস্ট্রোনস্ট

হ্যাঁ, এটি একটি ঘন ঘন দৃশ্যের ... এখানে একটি বিশেষ পদ্ধতিও রয়েছে স্ট্রিং.আইএসনুলআরএম্পটি (স্ট্রিং) ...
ম্যাক্স গ্যালকিন

12
"নাল-কোলেস অপারেটর খালি স্ট্রিং সনাক্ত করতে পারে না।" আচ্ছা এটি নাল- কোয়েলেসিং অপারেটর, নালআরএম্পটি- কোয়েলেসিং অপারেটর নয়। এবং ব্যক্তিগতভাবে, আমি দু'জনের মধ্যে পার্থক্য করে এমন ভাষাগুলিতে নাল এবং ফাঁকা মানগুলির মিশ্রণকে তুচ্ছ করে যা কিছু বিরক্তিকর নয় এমন জিনিসগুলির সাথে ইন্টারফেস করে। এবং আমি কিছুটা আবেগপ্রবণ - বাধ্য, তাই যখন ভাষা / বাস্তবায়নগুলি যেভাবেই দুজনের মধ্যে পার্থক্য না করে, তা আমাকে বিরক্ত করে, যদিও আমি যুক্তিটি কেন বুঝতে পারি ([বেশিরভাগ বাস্তবায়নে?] এসকিউএল এর মতো))।
জ্যাব

3
??অতিরিক্ত লোড করা যায় না: এমএসডিএন.মাইক্রোসফট.ইন- ইউএস / লিবারি /8 edha89s ( v=vs.100 ) .aspx - যদিও ওভারলোডযোগ্য এটি দুর্দান্ত হবে। আমি একটি সংমিশ্রণ ব্যবহার করেছি: s1.Nullify() ?? s2.Nullify()যেখানে স্ট্রিং ফাঁকা থাকলে ক্ষেত্রে string Nullify(this s)একটি প্রদান nullকরে।
কিট

সমস্যাটি? আমি সবেমাত্র নিজেকে খুঁজে পেতে পেয়েছি ?? = এবং এটি করার কোনও উপায় আছে কিনা তা দেখার সময় এই থ্রেডটি পেয়েছি। (পরিস্থিতি: প্রথম পাসটি ব্যতিক্রমের ক্ষেত্রে লোড হয়েছে, এখন আমি আবার যেতে চাই এবং ডিফল্ট মানগুলিকে এমন কোনও কিছুতে লোড করতে চাই যা ইতিমধ্যে লোড হয়নি।)
লরেন পেচটেল

3

হয় ?? প্রয়োজনীয়, বা আপনার কেবলমাত্র টার্নারি অপারেটরটি ব্যবহার করা উচিত (যার সাথে সর্বাধিক পরিচিত)

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

অন্যদিকে, যেহেতু এটি এতটা বিশেষজ্ঞ, তাই আমি এর অন্যান্য ব্যবহার আছে বলে মনে করি না। আমি ||অন্যান্য ভাষার মতো অপারেটরের একটি উপযুক্ত ওভারলোড পছন্দ করতাম । এটি ভাষা নকশায় আরও পার্সামোনিয়াস হবে। কিন্তু ভাল …


3

শান্ত! আমাকে এমন একজন হিসাবে গণ্য করুন যিনি নাল কোলেসিং অপারেটর সম্পর্কে জানেন না - এটি বেশ নিফটি স্টাফ।

টার্নারি অপারেটরের চেয়ে পড়া আমার কাছে অনেক সহজ মনে হয়েছে।

আমি যেখানে এটি ব্যবহার করতে পারি তার মনে প্রথম স্থানটি হ'ল আমার ডিফল্ট পরামিতিগুলিকে এক জায়গায় রাখা।

public void someMethod( object parm2, ArrayList parm3 )
{ 
  someMethod( null, parm2, parm3 );
}
public void someMethod( string parm1, ArrayList parm3 )
{
  someMethod( parm1, null, parm3 );
}
public void someMethod( string parm1, object parm2, )
{
  someMethod( parm1, parm2, null );
}
public void someMethod( string parm1 )
{
  someMethod( parm1, null, null );
}
public void someMethod( object parm2 )
{
  someMethod( null, parm2, null );
}
public void someMethod( ArrayList parm3 )
{
  someMethod( null, null, parm3 );
}
public void someMethod( string parm1, object parm2, ArrayList parm3 )
{
  // Set your default parameters here rather than scattered through the above function overloads
  parm1 = parm1 ?? "Default User Name";
  parm2 = parm2 ?? GetCurrentUserObj();
  parm3 = parm3 ?? DefaultCustomerList;

  // Do the rest of the stuff here
}

2

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

এটি ব্যবহার করার জন্য, কোডটি দেখতে পছন্দ মতো হয়েছিল

Channel channel;
Authentication authentication;

if (entities == null)
{
    using (entities = Entities.GetEntities())
    {
        channel = entities.GetChannelById(googleShoppingChannelCredential.ChannelId);
        [...]
    }
}
else
{
    channel = entities.GetChannelById(googleShoppingChannelCredential.ChannelId);
    [...]
}

তবে নাল কোলেস দিয়ে অনেক বেশি পরিষ্কার হয়ে যায়

using (entities ?? Entities.GetEntities())
{
    channel = entities.GetChannelById(googleShoppingChannelCredential.ChannelId);
    [...]
}

0

আমি এটি ব্যবহার করেছি:

for (int i = 0; i < result.Count; i++)
            {
                object[] atom = result[i];

                atom[3] = atom[3] ?? 0;
                atom[4] = atom[4] != null ? "Test" : string.Empty;
                atom[5] = atom[5] ?? "";
                atom[6] = atom[6] ?? "";
                atom[7] = atom[7] ?? "";
                atom[8] = atom[8] ?? "";
                atom[9] = atom[9] ?? "";
                atom[10] = atom[10] ?? "";
                atom[12] = atom[12] ?? false; 
            }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.