কীভাবে সম্ভব নাল বস্তুর জন্য টস্ট্রিং করবেন?


104

নিম্নলিখিতগুলি করার কোনও সহজ উপায় আছে:

String s = myObj == null ? "" : myObj.ToString();

আমি জানি যে আমি নিম্নলিখিতগুলি করতে পারি তবে সত্যই আমি এটিকে হ্যাক হিসাবে বিবেচনা করি:

String s = "" + myObj;

কনভার্ট.টস্ট্রিং () এর এর জন্য যথাযথ ওভারলোড থাকলে এটি দুর্দান্ত হবে।


4
আমি প্রথমটির সাথে কিছু ভুল দেখছি না। আপনি যদি দ্বিতীয়টিকে হ্যাক হিসাবে বিবেচনা করেন তবে আপনার পক্ষে সেরা বাজি হ'ল একটি ইউটিলিটি ফাংশন লিখুন যা নাল চেক করে।
নিক লারসেন

plz আপনি আপনার প্রশ্ন সম্পর্কে আরও সুনির্দিষ্ট হতে পারেন
ফস্টারস্টার

4
স্ট্রিং.ফর্ম্যাট ("{0}", মওবজ) নাল মান গ্রহণ করে।
হোলস্টেব্রো

4
? উইথ সি শার্প 6.0 আমরা এখন theText .ToString () বা theText .Trim মত () নাল-শর্তাধীন অপারেটর, ব্যবহার করতে পারেন
সন্তোষ

4
প্রতি এই উত্তরটি Convert.ToString() ঠিক প্রথম জিনিস আপনি নীচে লিখেছিলেন আছে।
ড্রজাউস

উত্তর:


184

সি # 6.0 সম্পাদনা করুন:

সি # 6.0 এর সাথে আমরা এখন অরাইনাল পদ্ধতির একটি সংক্ষিপ্ত, কাস্ট-ফ্রি সংস্করণ রাখতে পারি:

string s = myObj?.ToString() ?? "";

অথবা এমনকি বিরক্তি ব্যবহার করে:

string s = $"{myObj}";

আসল উত্তর:

string s = (myObj ?? String.Empty).ToString();

বা

string s = (myObjc ?? "").ToString()

আরও সংক্ষিপ্ত হতে।

দুর্ভাগ্যক্রমে, যেমনটি উল্লেখ করা হয়েছে যে আপনার স্ট্রিংহীন বা অবজেক্টের ধরণের সাথে এই কাজটি করার জন্য আপনার প্রায়শই উভয় পক্ষের কাস্টের প্রয়োজন হয়:

string s = (myObjc ?? (Object)"").ToString()
string s = ((Object)myObjc ?? "").ToString()

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

অন্য কোথাও প্রস্তাবিত হিসাবে, আমি সম্ভবত এই ক্লিনারটি তৈরি করতে কোনও এক্সটেনশন পদ্ধতি ব্যবহার করার পরামর্শ দিচ্ছি:

public static string ToStringNullSafe(this object value)
{
    return (value ?? string.Empty).ToString();
}

এই সংকলন করবে? Coalescing অপারেটর চেক টাইপ না?
নিক লারসন

4
(অবজেক্ট ?? স্ট্রিং) বস্তুটি ফেরত দেওয়ার পরে এটি কাজ করে, কারণ কোলেসেস সর্বনিম্ন সাধারণ ধরণের ব্যবহার করে। তবে আমি মনে করি এটি ইন্টারফেসের জন্য কাজ করবে না কারণ কোন ইন্টারফেসটি বেছে নেবে তা সিদ্ধান্ত নিতে পারে না (যেহেতু ক্লাসে একাধিক ইন্টারফেস অনুমোদিত)।
কোডিমানিক্স

4
আমি যে সমাধানটির জন্য আশা করছিলাম তা আসলে নয় তবে আমি এটি গ্রহণ করব
কোডিমানিক্স

4
সেই অবজেক্ট কাস্ট হিসাবে ডাউনভোটিং মারাত্মক কুৎসিত এবং বক্সিং জড়িত।
স্টেইনার

4
সি # 6 এর প্রথম বিকল্পটি খুব মার্জিত
আলেকজান্দ্রি এন

40
string.Format("{0}", myObj);

স্ট্রিং.ফর্ম্যাট শূন্য স্ট্রিং হিসাবে নালকে ফর্ম্যাট করবে এবং নন-নাল অবজেক্টগুলিতে টুস্ট্রিং () কল করবে। আমি এটি বুঝতে পেরেছিলাম, আপনি যা খুঁজছিলেন এটি এটি।


4
আমি ব্যক্তিগতভাবে এটি পছন্দ করি না। কোডটি স্ট্রিং s = myObj == নাল থেকে তুচ্ছ হতে পারে? "": myObj.ToString (), তবে আপনি আপনার পদ্ধতির পিছনে যুক্তিটি পুরোপুরি গোপন করেন।
এজিওয়াইক্ল্যাড জেরাল্ড

অনুমোদিত এটি মাইক্রোপটিমাইজেশন, তবে এটি কেবল প্রায় 5x বেশি সময় নেয় "" + myObj। তবে আমি পড়েছি যা অতিরিক্ত স্ট্রিং তৈরি করে। str.Concat(myObj)মনে হচ্ছে ঠিক কাজ করছে এবং এটি "আরও দ্রুত"।
drzaus

19

কনভার্ট.টস্ট্রিং () এর এর জন্য যথাযথ ওভারলোড থাকলে এটি দুর্দান্ত হবে।

আছে এর একটি Convert.ToString(Object value)নেট 2.0 থেকে (প্রায় সামনে 5 বছর এই প্রশ্ন জিজ্ঞাসা করা হল।), ঠিক করতে কি আপনি চান যা প্রদর্শিত:

http://msdn.microsoft.com/en-us/library/astxcyeh(v=vs.80).aspx

আমি কি এখানে সত্যিই স্পষ্ট কিছু অনুপস্থিত / ভুল ব্যাখ্যা করছি?


4
তুমি করো না, তারা করে। কেন জটিল যখন জটিল হতে পারে :)
alex.peter

13

একটি এক্সটেনশন পদ্ধতিতে, আপনি এটি সম্পাদন করতে পারেন:

public static class Extension
{
    public static string ToStringOrEmpty(this Object value)
    {
        return value == null ? "" : value.ToString();
    }
}

নিম্নলিখিতগুলি স্ক্রিনে কিছুই লিখবে না এবং একটি ব্যতিক্রম ছুঁড়ে ফেলবে না:

        string value = null;

        Console.WriteLine(value.ToStringOrEmpty());

এক্সটেনশন পদ্ধতির কলগুলি কি নালার জন্য সাধারণ চেক বাদ দেয় ...?
ম্যাটি ভির্ককুনেন

4
এটি যোগ করেছে যে আপনাকে "{0}" টাইপ করতে হবে না এবং আপনি এমন একটি পদ্ধতির নাম চয়ন করতে পারেন যা আপনি কী করছেন তা বর্ণনা করে। এটি বিশেষত কার্যকর যখন আপনি অনেকবার এটি করেন। এমনকি আপনি ToStringOrEmptyWhenNull পদ্ধতির নামও রাখতে পারেন।
পিটার ভ্যান জিনকেল

4
যদি ওপি মনে করে যে string s = "" + myObj;এটি হ্যাকিশ, নাল বস্তুতে ফাংশন কল করা একই নৌকায় পড়ে। আমি এটিকে হ্রাস করব, তবে এটি সমস্যার সমাধান করবে, আমি কেবল ব্যবহারের সাথে একমত নই। নাল বস্তুগুলি NullReferenceExceptionএমনকি ছড়িয়ে দেওয়া উচিত এমনকি এক্সটেনশন পদ্ধতিতে।
নিক লারসেন

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

4
"প্রথম" পরামিতি ( thisপরামিতি) যখন এক্সটেনশন পদ্ধতিগুলি ছুঁড়ে না কারণ তারা কেবল সিনট্যাকটিক চিনি। যে x.SomeExtensionMethod()জন্য অন্বিত চিনি SomeStaticClass.SomeExtensionMethod(x);সুতরাং যখন xহয় nullআমরা একটি উপর একটি পদ্ধতি ডাকা প্রয়াস নেই nullবস্তু বরং ক্ষণস্থায়ী nullএকটি স্ট্যাটিক পদ্ধতিতে অবজেক্ট। যদি এবং কেবল যদি সেই পদ্ধতিটি কোনও nullপ্যারামিটারের জন্য পরীক্ষা করে এবং যখন এরকম মুখোমুখি হয় তখন একটি nullবস্তু নিক্ষেপগুলিতে একটি এক্সটেনশন পদ্ধতি "আহ্বান" করা হবে ।
জেসন

7

আমি এর সাথে একমত নই:

String s = myObj == null ? "" : myObj.ToString();

যে কোনও উপায়ে হ্যাক। আমি মনে করি এটি পরিষ্কার কোডের একটি ভাল উদাহরণ। আপনি কী অর্জন করতে চান এবং এটি নালার প্রত্যাশা করছেন তা একেবারে সুস্পষ্ট।

হালনাগাদ:

আমি এখন দেখছি যে আপনি বলছেন না যে এটি একটি হ্যাক। তবে এই প্রশ্নের মধ্যেই বোঝানো হয়েছে যে আপনি মনে করেন যে এই পথটি যাওয়ার পথ নয়। আমার মনে এটি অবশ্যই স্পষ্ট সমাধান।


তিনি বলেননি যে এই পদ্ধতিটি হ্যাক। বাস্তবে তিনি এটিতে কী ভুল ছিল তা বলেননি কেবল এটি বোঝানো যে এটি সহজ নয়। আমি মনে করি না যে এই পদ্ধতিতে কোনও সমস্যা আছে। +1 কারণ আমি এটি এইভাবে করব।
বায়ার্সকে চিহ্নিত করুন

আমি ওপি এর সাথে একমত ... সি # তে ইতিমধ্যে একটি নাল কোলেসিং অপারেটর রয়েছে - নীচে আমার পোস্টটি দেখুন।
অ্যান্ড্রু হ্যানলন

আমি মনে করি নাল কোলেসিং অপারেটর এই ক্ষেত্রে কিছুটা কম পরিষ্কার, তবে আমি এটি ব্যবহারের সাথে ঠিক ঠিক থাকব।
স্টেইনার

@ পিটার ফেয়ার যথেষ্ট। তবে তা করে। প্রশ্নটি হল "নিম্নলিখিতগুলি করার কি কোনও সহজ উপায় আছে: ..."। সঠিক উপায় সহজ!
স্টেইনার

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

4
string s = String.Concat(myObj);

আমার অনুমানের সবচেয়ে সংক্ষিপ্ততম উপায়ে এটি হতে পারে এবং উপেক্ষিত পারফরম্যান্সের ওভারহেডও থাকবে। মনে রাখবেন যদিও কোডটি পাঠকের পক্ষে উদ্দেশ্যটি কী তা পুরোপুরি পরিষ্কার হবে না।


4
এটি "" MyObj এর সুস্পষ্ট রূপ তবে এখানে কী চলছে তা বলার চেয়েও খারাপ। আকর্ষণীয় যাইহোক।
কোডিমানিক্স

@ কোডিমানিক্স আমি এটি একই বলে মনে করি না - Concatআসলে নীচে একটি নাল চেক করে ফিরে আসে string.Emptyবা arg0.ToString()যা কিছুটা আরও পারফরম্যান্ট বলে মনে হয় (মানে আমরা এখানে এমএস করছি)।
ড্রাজস

2

আপনি কি করতে চান তা আসলে আমি বুঝতে পারি নি। আমি যেমন বুঝতে পেরেছি আপনি এই কোডটি এভাবে অন্যভাবে লিখতে পারেন। আপনি এই জিজ্ঞাসা বা না? আপনি আরও ব্যাখ্যা করতে পারেন?

string s = string.Empty;
    if(!string.IsNullOrEmpty(myObj))
    {
    s = myObj.ToString();
    }

অবশ্যই আমি এটি এটি লিখতে পারি তবে আমি একটি সাধারণ ছোট ফাংশন কল চাই, আমি ভাবছিলাম কেন নেট
বিসিএলে

আমাদের ইসনুলআরএম্পটি () পদ্ধতি থাকা অবস্থায় আপনার কি সত্যিই কোনও ফাংশন প্রয়োজন?
সারকান হেকিমোগলু

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

4
string s = string.IsNullOrEmpty(myObj) ? string.Empty : myObj.ToString();
নিক লারসেন

2

আমি আমার উত্তরের জন্য মারপিট করতে পারি তবে এখানে যাই হোক:

আমি সহজভাবে লিখতে হবে

স্ট্রিং s = "" যদি (myObj! = নাল) {x = myObj.to স্ট্রিং (); }

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

এবং পরিষ্কারভাবে, উপরে উল্লিখিত কেউ হিসাবে, আপনি এই আচরণটিকে সেফস্ট্রিং (মাইওবিজে) এর মতো একটি পদ্ধতির মধ্যে রাখতে পারেন যা পুনরায় ব্যবহারের অনুমতি দেয়।


ওএমজি যদি বস্তুটি শূন্য হয় তবে তার উপর টসস্ট্রিং () কল করুন?
কোডিমানিক্স

আসুন, এটি একটি টাইপো। আমি প্রথম = এর সাথে প্রতিস্থাপন করেছি! এটি সঠিক করতে। তবে আপনি কি সত্যিই আমাকে টাইপ করতে যাচ্ছেন?
jaydel

2

আমার একই সমস্যা ছিল এবং কেবল স্ট্রিংয়ে বস্তুটি কাস্ট করে এটি সমাধান করেছি। এটি নাল বস্তুর জন্যও কাজ করে কারণ স্ট্রিংগুলি নাল হতে পারে। আপনি যদি একেবারে নাল স্ট্রিংটি না চান, তবে এটি ঠিকভাবে কাজ করা উচিত:

string myStr = (string)myObj; // string in a object disguise or a null

সবচেয়ে সংক্ষিপ্ত এবং সর্বোত্তম সমাধান। (Obj1 ?? "")। টুস্ট্রিং () আসলে প্রথম স্ট্রিং হিসাবে ওজেজে 1 কেস করেছে :)
টিপাকটোপা

2

কিছু (গতি) পারফরম্যান্স পরীক্ষা বিভিন্ন বিকল্পের সংক্ষিপ্তসার করে, এটি আসলে # মাইক্রোপটিমাইজেশনের ( লিনকপ্যাড এক্সটেনশন ব্যবহার করে ) গুরুত্বপূর্ণ নয়

বিকল্পগুলি

void Main()
{
    object objValue = null;
    test(objValue);
    string strValue = null;
    test(strValue);
}

// Define other methods and classes here
void test(string value) {
    new Perf<string> {
        { "coallesce", n => (value ?? string.Empty).ToString() },
        { "nullcheck", n => value == null ? string.Empty : value.ToString() },
        { "str.Format", n => string.Format("{0}", value) },
        { "str.Concat", n => string.Concat(value) },
        { "string +", n => "" + value },
        { "Convert", n => Convert.ToString(value) },
    }.Vs();
}

void test(object value) {
    new Perf<string> {
        { "coallesce", n => (value ?? string.Empty).ToString() },
        { "nullcheck", n => value == null ? string.Empty : value.ToString() },
        { "str.Format", n => string.Format("{0}", value) },
        { "str.Concat", n => string.Concat(value) },
        { "string +", n => "" + value },
        { "Convert", n => Convert.ToString(value) },
    }.Vs();
}

এটি উল্লেখ করা সম্ভবত গুরুত্বপূর্ণ যে এটি Convert.ToString(...)নাল স্ট্রিং ধরে রাখবে।

ফলাফল

অবজেক্ট

  • নালচেক 1.00x 1221 টিকগুলি কেটে গেছে (0.1221 এমএস) [10 কে রেপিতে, 1.221E-05 এমএস প্রতি]
  • কয়লাশী 1.14x 1387 টিকগুলি বিভক্ত (0.1387 এমএস) [10 কে রেপিতে, 1.387E-05 এমএস প্রতি]
  • স্ট্রিং + 1.16x 1415 টিকগুলি কেটে গেছে (0.1415 এমএস) [10 কে রেপিতে, 1.415E-05 এমএস প্রতি]
  • str.Cccat 1.16x 1420 টিকগুলি কেটে গেছে (0.142 এমএস) [10 কে রেপিতে, 1.42E-05 এমএস প্রতি]
  • 1.58x 1931 টিকগুলি কেটে গেছে (0.1931 এমএস) [10 কে রেপিতে, 1.931E-05 এমএস প্রতি]
  • str. Format 5.45x 6655 টিক্স কেটে গেছে (0.6655 এমএস) [10 কে রেপিতে, 6.655E-05 এমএস প্রতি]

স্ট্রিং

  • নালচেক 1.00x 1190 টিকগুলি কেটে গেছে (0.119 এমএস) [10 কে রেপিতে, 1.19E-05 এমএস প্রতি]
  • 1.01x 1200 টিকগুলি কেটে গেছে (0.12 এমএস) রূপান্তর করুন [10 কে রেপিতে, 1.2E-05 এমএস প্রতি]
  • স্ট্রিং + 1.04x 1239 টিকগুলি বিভক্ত (0.1239 এমএস) [10 কে রেপিতে, 1.239E-05 এমএস প্রতি]
  • কয়লাশী 1.20x 1423 টিকগুলি কেটে গেছে (0.1423 এমএস) [10 কে রেপিতে, 1.423E-05 এমএস প্রতি]
  • str.Concat 4.57x 5444 টিক্স কেটে গেছে (0.5444 এমএস) [10 কে রেপে, 5.444E-05 এমএস প্রতি]
  • str. Format 5.67x 6750 টিক্স কেটে গেছে (0.675 এমএস) [10 কে রেপিতে, 6.75E-05 এমএস প্রতি]

1

হলস্টব্রয়ের মন্তব্যটি আপনার সেরা উত্তর হবে:

string s = string.Format("{0}", myObj);

যদি myObjনাল হয় তবে ফর্ম্যাটটি খালি স্ট্রিংয়ের মান রাখে।

এটি আপনার এক লাইনের প্রয়োজনীয়তাও পূরণ করে এবং পড়া সহজ।


হ্যাঁ, তবে কোডটি পরিষ্কার নয়। আপনার সাধু বিকাশকারীদের মধ্যে কতজন জানেন যে আপনি কী সম্পাদনা করার চেষ্টা করছেন?
এজিওয়াইক্ল্যাড জেরাল্ড

0

যদিও এটি একটি পুরানো প্রশ্ন এবং সিপি # এর জন্য ওপি চেয়েছিল আমি তাদের জন্য একটি ভিবি. নেট সমাধান ভাগ করে নিতে চাই, যারা সি # এর চেয়ে ভিবি.নেটের সাথে কাজ করে:

Dim myObj As Object = Nothing
Dim s As String = If(myObj, "").ToString()

myObj = 42
s = If(myObj, "").ToString()

দুর্ভাগ্যক্রমে ভিবি.নেট মায়োবজ? ভেরিয়েবলের পরে? -অপারেটরটিকে অনুমতি দেয় না। পরিবর্তে আমি যদি MyObj কিছু না হয় তবে খালি স্ট্রিং ফিরিয়ে দিতে আমি ব্যবহার করি। সুতরাং প্রথম টস্টারিং-কল একটি খালি স্ট্রিং ফিরিয়ে দেয়, যখন দ্বিতীয় (যেখানে মাইওবিজ কিছুই নয়) "42" প্রদান করে।

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