কোনও বস্তু সি # তে নাল কিনা তা পরীক্ষা করা হচ্ছে


226

আমি যদি কোনও বস্তুটি শূন্য হয় তবে তার আরও প্রসেসিং রোধ করতে চাই।

নিম্নলিখিত কোডে আমি পরীক্ষা করে নিচ্ছি যে কোনওটি দ্বারা অবজেক্টটি বাতিল হয়ে গেছে:

if (!data.Equals(null))

এবং

if (data != null)

যাইহোক, আমি একটি NullReferenceExceptionএ গ্রহণ dataList.Add(data)। যদি বস্তুটি শূন্য থাকে তবে এটি কখনও ifস্টেস্টমেন্টে প্রবেশ করা উচিত ছিল না !

সুতরাং, আমি জিজ্ঞাসা করছি যে এটি পরীক্ষা করার কোনও সঠিক উপায় যদি কোনও বস্তু নাল থাকে:

public List<Object> dataList;
public  bool AddData(ref Object data)
    bool success = false;
    try
    {
        // I've also used "if (data != null)" which hasn't worked either
        if (!data.Equals(null))
        {
           //NullReferenceException occurs here ...
           dataList.Add(data);
           success = doOtherStuff(data);
        }
    }
    catch (Exception e)
    {
        throw new Exception(e.ToString());
    }
    return success;
}

যদি এটি পরীক্ষা করার সঠিক উপায়টি অবজেক্টটি শূন্য হয় কিনা, তবে আমি কী ভুল করছি (নালারফেরান এক্সেকশনটি এড়াতে কীভাবে আমি বস্তুর উপর আরও প্রসেসিং আটকাতে পারি)?


13
আপনার throw e;বনাম ব্যবহার করতে হবেthrow new Exception(e.ToString());
নিক্স

17
সি # তে আপনার সর্বদা != nullআপনার নাল চেক ব্যবহার করা উচিত । .Equalsযদি বস্তুটি নাল হয় তবে সর্বদা একটি ব্যতিক্রম ছুঁড়ে ফেলা হবে।
কাইল ট্রুবারম্যান

42
@ নিক্স: এর throw e;চেয়ে বেশি ভাল নয়। throw;অন্যদিকে ...
জন

4
@ ডেভেলপার: e.ToString()একটি স্ট্রিং তৈরি করবে যা কেবল ত্রুটি বার্তা নয়, সমস্ত InnerExceptionsএবং স্ট্যাক ট্রেসকে অন্তর্ভুক্ত করে। সুতরাং এটি খুব চর্বিযুক্ত-ভারী ব্যতিক্রম বার্তা of আপনি যদি (যথাযথভাবে!) এই তথ্যটি সংরক্ষণ করতে চান এবং এটি যেখানে থাকে তেমন রাখুন, সহজভাবে ব্যবহার করুন throw;
জন

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

উত্তর:


252

এটা না dataযে null, কিন্তু dataList

আপনার সাথে এটি তৈরি করতে হবে

public List<Object> dataList = new List<Object>();

আরও ভাল: যেহেতু এটি ক্ষেত্র, তাই এটি তৈরি করুন private। এবং যদি আপনাকে বাধা দেওয়ার কিছু নেই তবে এটিও তৈরি করুন readonly। শুধু ভাল অনুশীলন।

সরাইয়া

শালীনতা যাচাই করার সঠিক উপায় হ'ল if(data != null)। এই ধরণের চেকটি রেফারেন্স ধরণের জন্য সর্বব্যাপী; এমনকি ন্যূনতার জন্য পরীক্ষা Nullable<T>করার সময় সমতা অপারেটরকে প্রকাশ করার আরও সুবিধাজনক উপায় হতে ওভাররাইড করে nullable.HasValue

যদি আপনি না if(!data.Equals(null))তারপর আপনি একটি পাবেন NullReferenceExceptionযদি data == null। এই ব্যতিক্রমটি এড়ানো প্রথম যে গোলটি ছিল তা যেহেতু কোন ধরণের হাস্যকর।

আপনি এটিও করছেন:

catch (Exception e)
{
    throw new Exception(e.ToString());
}

এটি অবশ্যই ভাল না। আমি কল্পনা করতে পারি যে আপনি এটি সেখানে রেখেছেন যাতে আপনি পদ্ধতিটির ভিতরে থাকা অবস্থায় ডিবাগারে প্রবেশ করতে পারেন, এই ক্ষেত্রে এই অনুচ্ছেদটিকে উপেক্ষা করুন। অন্যথায়, কিছুই জন্য ব্যতিক্রম ধরবেন না। এবং যদি আপনি তা করেন তবে ন্যায়সঙ্গত ব্যবহার করে তাদের পুনরায় পাঠাও throw;


5
এই উদ্দেশ্যে আমি অবজেক্টটিও দেখেছি e এটা কি সমতা উপেক্ষা করে এড়ানো?
লুকা

2
@ লুকাপিসিওনি জেনারিকগুলি ব্যবহার করার সময় মান-প্রকারের অভিযোগগুলি প্রতিরোধ করার জন্য আমি এটি ব্যবহার করেছি: geekality.net/2009/11/13/generics- and
checking-

4
আমি পছন্দ null != data। ধ্রুবকটি প্রথমে স্থাপন null = dataকরা হাড়ের মাথার টাইপকে অনিচ্ছাকৃত অ্যাসাইনমেন্টের পরিবর্তে সংকলক ত্রুটিতে পরিণত করে । (এছাড়াও এতে কাজ করে ==))
jpmc26

6
@ jpmc26: সি # if (data = null)তে ইতিমধ্যে একটি সংকলন সময় ত্রুটি, সুতরাং সেখানে পৌঁছতে কয়েক দশক সময় লাগলেও আমাদের আর এটি দেখার দরকার নেই। এমনকি সি ++ সংকলকরা সহজেই সেই কোডটির জন্য সম্ভাব্য অনিচ্ছাকৃত অ্যাসাইনমেন্ট সম্পর্কে একটি সতর্কতা তৈরি করে।
জন

লুকা, আপনি পরীক্ষায় 'অবজেক্ট' কাস্ট করে সমতা ওভাররাইডগুলি এড়াতে পারেন। অনুরূপ শিরাতে, এই উত্তরের পরিবর্তে এটি দাবি করা উচিত: "যদি ((অবজেক্ট) ডেটা! = নাল)" যেহেতু এটি সাম্যকে ছাড়িয়ে যাওয়ার পরে ত্রুটিগুলি এড়িয়ে চলে।
ডাগ

81

সি #> 7.0 ব্যবহারে

if (obj is null) ...

এটি কোনও == বা! = অবজেক্ট দ্বারা সংজ্ঞায়িত করা হবে (অবশ্যই যদি আপনি এগুলি ব্যবহার করতে চান না ...)

নাল ব্যবহার না করার জন্য if (obj is object)(বা if (!(obj is null)))


1
আমি ভাবছি সেখানে "নাল নট" আছে? (পাইথন বলতে হবে obj is not null)
sehe

1
(আবজ! = নাল) যা আরও পঠনযোগ্য তার চেয়ে কেন ভাল
অরন ক্রিস্টজানসন

38
তারা বাস্তবায়ন করতে চান if (obj aint null):(
নিক বুল

9
কারণ এখানে নাল নয়if (obj is object)
ইয়টস্কোভস্কি

3
@ ওর্নক্রিস্টজানসন কারণ! = এবং == ওভাররাইড করা যেতে পারে।
মিচেলজে

61

সি # 6 এ মোনাডিক নাল চেকিং রয়েছে :)

আগে:

if (points != null) {
    var next = points.FirstOrDefault();
    if (next != null && next.X != null) return next.X;
}   
return -1;

পরে:

var bestValue = points?.FirstOrDefault()?.X ?? -1;

7
কারণ "মন্তব্যগুলি কেবল 5 মিনিটের জন্য সম্পাদনা করা যেতে পারে"? কি? যাইহোক ... আমি যেমন এটি পেয়ে যাচ্ছিলাম..আমি প্রকাশ করার জন্য আরও ভাল বাক্য গঠন করার সন্ধানে এখানে এসেছি result = myObject == null ? null : myObject.SomePropertyএবং আপনার উদাহরণ আমাকে লেখার জন্য পরামর্শ দিয়েছে result = myObject?.SomeProperty। মানুষ!! ওটা লুক্কায়িত। আমি এখনও কোডিং পছন্দ করি ...
অ্যাডাম কক্স

27

আপনার পোস্টলিস্টটি বাতিল হয়েছে কারণ এটি তাত্ক্ষণিকভাবে চালু করা হয়নি, আপনি পোস্ট করেছেন এমন কোড দ্বারা বিচার করে।

চেষ্টা করুন:

public List<Object> dataList = new List<Object>();
public  bool AddData(ref Object data)
bool success = false;
try
{
    if (!data.Equals(null))   // I've also used if(data != null) which hasn't worked either
    {
       dataList.Add(data);                      //NullReferenceException occurs here
       success = doOtherStuff(data);
    }
}
catch (Exception e)
{
    throw new Exception(e.ToString());
}
return success;

}


3
এছাড়াও, কেবল যুক্ত করতে, যদি ডেটা নাল হয় তবে এটি ক্রাশ হবে না, আপনি << বিষয়> একটি তালিকায় নাল যুক্ত করতে পারেন।
ডেভশো

7
তবে করার চেষ্টা করছেন। নালার উপরে একটি ব্যতিক্রম ছুঁড়ে ফেলা হবে। করা উচিত! = নাল
glosrob

@glosrob: আহ !! কী নজরদারি! আমি ভাবছিলাম যে নালরফেরেন্স এক্সেপশনটি বস্তুটি থেকে ছিল .. তালিকাটি নয়! আমি সি # তে নতুন এবং আমি বুঝতে পেরেছিলাম যে সি # তে নাল পরীক্ষা করার একটি বিশেষ উপায় ছিল!
বিকাশকারী

এটিও, তবে আমি দেখেছি এড এস এটি .েকে রেখেছিলেন।
ডেভশো

1
@ ডেভশা: মাথা উঁচু করার জন্য ধন্যবাদ আমি যদিও পরে প্রক্রিয়াকরণের জন্য একটি নাল বস্তু যুক্ত হওয়া এড়াতে চাই, তাই আমি এখনও একটি চেক করব। :)
বিকাশকারী

19

[@ Kelton52 দ্বারা ইঙ্গিত প্রতিফলিত সম্পাদিত]

সহজ উপায় হল object.ReferenceEquals(null, data)

যেহেতু (null==data)কাজের নিশ্চয়তা নেই:

class Nully
{
    public static bool operator ==(Nully n, object o)
    {
        Console.WriteLine("Comparing '" + n + "' with '" + o + "'");
        return true;
    }
    public static bool operator !=(Nully n, object o) { return !(n==o); }
}
void Main()
{
    var data = new Nully();
    Console.WriteLine(null == data);
    Console.WriteLine(object.ReferenceEquals(null, data));
}

উত্পাদন:

'' নুলির সাথে '' তুলনা করা

সত্য

মিথ্যা


1
আসলে আমি এটি চেষ্টা করেছি এবং মন্তব্যটি 'অন্তর্নিহিত সুবিধাটি হ'ল এটি "অপারেটর! =" এর মতো ডেটা ক্লাসে উপস্থিত থাকতে পারে এমন কোনও ওভাররাইড উপেক্ষা করে।' সত্য বলে মনে হচ্ছে না।
কেলি এলটন

9

না, আপনি ব্যবহার করা উচিত !=। যদি dataআসলে নাল হয় তবে আপনার প্রোগ্রামটি পদ্ধতিটি NullReferenceExceptionকল করার চেষ্টা করার ফলে কেবল ক্রাশ হবে । এছাড়াও বুঝতে হবে যে, আপনি যদি নির্দিষ্টভাবে রেফারেন্সের সমতার জন্য পরীক্ষা করতে চান তবে আপনার পদ্ধতিটি ব্যবহার করা উচিত কারণ আপনি কখনই জানেন না যে কীভাবে প্রয়োগ করা হয়েছে।EqualsnullObject.ReferenceEqualsEquals

আপনার প্রোগ্রামটি ক্রাশ হচ্ছে কারণ dataListআপনি কখনই এটি আরম্ভ করেন না তাই নাল।


7

এই ক্ষেত্রে সমস্যাটি dataনাল নয়। এটাই হল সেইটাdataList নিজেই নাল।

আপনি যে জায়গায় ঘোষণা করেছেন সেখানে আপনার dataListএকটি নতুন Listঅবজেক্ট তৈরি করা উচিত এবং এটিকে ভেরিয়েবলের জন্য বরাদ্দ করা উচিত ।

List<object> dataList = new List<object>();

5

@ জোসে অরতেগা উত্তর ছাড়াও , এটি এক্সটেনশন পদ্ধতির জন্য আরও ভাল

 public static bool IsNull(this object T)
     {
        return T == null;
     } 

এবং IsNullসমস্ত বস্তুর জন্য পদ্ধতি ব্যবহার করুন:

object foo = new object(); //or any object from any class
if (foo.IsNull())
   {
     // blah blah //
   }

1
কেন return T == null ? true : false;এবং শুধু না return T == null;?
md2perpe

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

জ্যামি সঠিক কিনা তা পুরোপুরি নিশ্চিত করতে পারে - এটি কাজ করবে না। আমি জানি কারণ আমার একটি দুর্ভাগ্যযুক্ত মুহুর্ত ছিল এবং একই ধরণের এক্সটেনশন পদ্ধতিটি লিখেছিল: পি কোডটি সর্বদা একটি নাল রেফারেন্স ব্যতিক্রম ছুঁড়ে মারে, এটি পুরোপুরি এক্সটেনশন পদ্ধতিতে যায় না।
জেমস কিং

আসলে আমি বলতে চাই যে আপনি এক্সটেনশন পদ্ধতিতে এটি করতে পারেন ... কোডটিতে কিছু সমস্যা হতে পারে এবং উন্নতি করতে পারে!
আলী

আপনি নাল বস্তুতে একটি এক্সটেনশন পদ্ধতি কল করতে পারেন; সতর্কতা অবলম্বন করার জন্য আপনাকে কেবল নলের সাথে টি (এই ক্ষেত্রে) তুলনা করতে হবে। জেমি ঠিক আছে, যদিও এটি অদ্ভুত দেখাচ্ছে।
টিম ব্যারাস

3

এর হিসাবে সি # 8 আপনি 'খালি' সম্পত্তি ধরণ (সাথে ব্যবহার করতে পারেন প্যাটার্ন ম্যাচিং ) একটি বস্তু নিশ্চিত না নাল:

if (obj is { })
{
    // 'obj' is not null here
}

এই পদ্ধতির অর্থ " যদি বস্তুটি কোনও কিছুর উদাহরণকে উল্লেখ করে " (যেমন এটি নাল নয়)।

আপনি বিপরীত হিসাবে এই মনে করতে পারেন: if (obj is null)...। যা সত্যের দিকে ফিরে আসবে যখন বস্তুটি কোনও কিছুর উদাহরণকে উল্লেখ না করে।

সি # 8.0 তে নিদর্শনগুলি সম্পর্কে আরও তথ্যের জন্য এখানে পড়ুন


3

সি # 9 হিসাবে আপনি করতে পারেন

if (obj is null) { ... }

নাল ব্যবহার না করার জন্য

if (obj is not object) { ... }

আপনার যদি এই আচরণটি ওভাররাইড করার প্রয়োজন হয় ==এবং সে !=অনুযায়ী ব্যবহার করুন ।


2

জেফরি এল হুইলেটজ ঠিক আছে। আপনার `ডেটালিস্ট-অবজেক্ট নিজেই শূন্য।

আপনার কোডের সাথে আরও একটি সমস্যা রয়েছে: আপনি রেফ-কীওয়ার্ডটি ব্যবহার করছেন, যার অর্থ আর্গুমেন্টের ডেটা বাতিল হতে পারে না! এমএসডিএন বলে:

একটি রেফ প্যারামিটারে পৌঁছে একটি যুক্তি প্রথমে শুরু করা উচিত। এটি বাইরে থেকে আলাদা, যার যুক্তিগুলি পাস হওয়ার আগে স্পষ্টভাবে শুরু করতে হবে না

`অবজেক্ট type টাইপ সহ জেনেরিক ব্যবহার করাও ভাল ধারণা নয় ´ জেনারিকদের বক্সিং / আনবক্সিং এড়ানো উচিত এবং ধরণের সুরক্ষাও নিশ্চিত করা উচিত। আপনি যদি একটি সাধারণ ধরণ চান তবে আপনার পদ্ধতিটিকে জেনেরিক করুন। অবশেষে আপনার কোডটি দেখতে এমন হওয়া উচিত:

public class Foo<T> where T : MyTypeOrInterface {

      public List<T> dataList = new List<T>();

      public bool AddData(ref T data) {
        bool success = false;
        try {
          dataList.Add(data);                   
          success = doOtherStuff(data);
        } catch (Exception e) {
          throw new Exception(e.ToString());
        }
        return success;
      }

      private bool doOtherStuff(T data) {
        //...
      }
    }

2

যেমন অন্যরা ইতিমধ্যে চিহ্নিত করেছে, এটি dataসম্ভবত dataListএটি নয় বরং সম্ভবতnull । তা ছাড়াও ...

catch- throwএটি একটি অ্যান্টিপ্যাটার্ন যা প্রায়শই আমাকে যতবার দেখা যায় ততবার আমাকে ফেলে দিতে চায়। doOtherStuff()কল করুন যে কল করে এমন কিছুতে কিছু গভীর হয়ে যায় । সমস্ত ফিরে পেতে একটি হল Exceptionবস্তু, নিক্ষিপ্ত throwমধ্যে AddData()। কোনও স্ট্যাক ট্রেস, কোনও কল তথ্য, কোনও রাজ্য, সমস্যাটির আসল উত্সকে নির্দেশ করার জন্য কিছুই নয়, যদি না আপনি প্রবেশ করেন এবং আপনার ডিবাগারটি ব্যতিক্রমহীন ব্যতিরেকে ফেলে দেওয়া ব্যতিক্রম ভাঙতে স্যুইচ করেন। যদি আপনি কোনও ব্যতিক্রম ধরা পড়ে থাকেন এবং কেবল কোনও উপায়ে এটিকে আবার ছুঁড়ে মারছেন , বিশেষত যদি চেষ্টা ব্লকের কোডটি কোনওভাবেই অকারণীয় হয় তবে নিজেকে (এবং আপনার সহকর্মীরা, বর্তমান এবং ভবিষ্যত) কোনও পক্ষ নিন এবং পুরোটি ফেলে দিনtry - catchব্লক । এটা ঠিক যে,throw;বিকল্পগুলির চেয়ে ভাল, তবে আপনি এখনও নিজেকে (বা অন্য কেউ কোডটিতে কোনও বাগ সমাধানের চেষ্টা করছেন) সম্পূর্ণ অপ্রয়োজনীয় মাথা ব্যথা করছেন। এটি বলার অপেক্ষা রাখে না যে চেষ্টা-ধরা-নিক্ষেপ করা অবশ্যই অপরিহার্যভাবে খারাপ, যতক্ষণ আপনি ক্যাচ ব্লকের ভিতরে ফেলে দেওয়া ব্যতিক্রম বিষয়টির সাথে প্রাসঙ্গিক কিছু করেন

তারপরে Exceptionপ্রথম স্থানে ধরা সম্ভাব্য সমস্যা রয়েছে তবে এটি অন্য একটি বিষয়, বিশেষত যেহেতু আপনি এই ব্যতিক্রমটি ছুঁড়ে ফেলেছেন।

আরেকটি বিষয় যা আমাকে সামান্য বিপজ্জনক হিসাবে আঘাত করে তা হ'ল dataফাংশনটি কার্যকর করার সময় মানটি সম্ভবত পরিবর্তন করতে পারে, যেহেতু আপনি রেফারেন্স দিয়ে যাচ্ছেন। সুতরাং নাল চেকটি পাস হতে পারে তবে কোডটি মান সহ কোনও কিছু করার আগে, এটি পরিবর্তিত হয়েছে - সম্ভবত null। এটি যদি উদ্বেগজনক হয় বা না হয় তবে আমি ইতিবাচক নই (এটি নাও হতে পারে) তবে এটি সন্ধান করা উপযুক্ত বলে মনে হয়।


2
  public static bool isnull(object T)
  {
      return T == null ? true : false;
  }

ব্যবহার করুন:

isnull(object.check.it)

শর্তসাপেক্ষ ব্যবহার:

isnull(object.check.it) ? DoWhenItsTrue : DoWhenItsFalse;

আপডেট (অন্য উপায়) 08/31/2017 আপডেট হয়েছে। মন্তব্যের জন্য ধন্যবাদ.

public static bool isnull(object T)
{
    return T ? true : false;
}

5
cond ? true : false;সম্পূর্ণ ন্যায়বিচারের সমতুল্য cond। এটি কিছুই যোগ করে না।
ল্যারিকসন

আমি দুঃখিত তবে আপনি যদি ফাংশনটি পরীক্ষা করেন তবে এটি অবশ্যই একটি মান মূল্য প্রদান করবে। আমি ফরমালিজম করছি। সুতরাং এটি আবার পরীক্ষা করুন
জোসে অরতেগা

3
তার মানে return T == null;বুলিয়ানও ফেরত!
এমকিউডার

আমি জানি হিচকি কি বলছে। ty
জোসে অরতেগা

1
পরিবর্তে return T == null ? true : false;শুধু ব্যবহার return T == null;
md2perpe

1

আপনি যখনই ক্লাসের অবজেক্ট তৈরি করছেন তখন আপনাকে নীচের কোডটি ব্যবহার করে নাল কিনা তা পরীক্ষা করে দেখতে হবে।

উদাহরণ: অবজেক্ট 1 হ'ল ক্লাসের অবজেক্ট

void myFunction(object1)
{
  if(object1!=null)
  {
     object1.value1 //If we miss the null check then here we get the Null Reference exception
  }
}

0

আমি কেবল একটি পদ্ধতি অনুসরণ করেছি যা আমরা সাধারণত জাভা স্ক্রিপ্টে অনুসরণ করব follow বস্তুকে স্ট্রিংয়ে রূপান্তর করতে এবং তারপরে সেগুলি নাল কিনা check

var obj = new Object();
var objStr = obj.ToString();
if (!string.IsNullOrEmpty(objStr)){
  // code as per your needs
}

0

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

যেহেতু যে কোনও ধরণের "অবজেক্ট" অন্তত একটি বস্তু


    if (MyObj is Object)
    {
            //Do something .... for example:  
            if (MyObj is Button)
                MyObj.Enabled = true;
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.