টু স্ট্রিং ()


142

আমি সর্বত্র নির্মাণগুলি দেখতে চাই যেমন:

int? myVar = null;
string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty;

কেন সহজভাবে ব্যবহার করবেন না:

string test = myVar.ToString();

আসলে কি একই রকম নয়? কমপক্ষে রিফ্লেক্টর বলেছেন যে:

public override string ToString()
{
  if (!this.HasValue)
  {
    return "";
  }
  return this.value.ToString();
}

সুতরাং, এটি সঠিক (সংক্ষিপ্ত সংস্করণ) বা আমি কিছু মিস করছি?


1
আমি এর মতো কোডটি দেখিনি :)
টিমটাম

উত্তর:


112

আপনি বেশ সঠিক। এছাড়াও এই প্রশ্নের সাবেক সমাধান প্রস্তাব যখন কেউ কিছু আসলে নোটিশ করা হয় ToString()ইতিমধ্যে সঠিক উত্তর দেয়।

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


21
আসলে, কমপক্ষে দু'জন লোক লক্ষ্য করেছেন: এরিক লিপার্ট এবং জোহানেস রাসেল।
জন স্কিটি

7
যদিও আমি নিশ্চিত যে আপনি যা বোঝাতে চেয়েছিলেন তা নয়, রেফারেন্সটি এখানে আসলে নਾਲ নয়। অবিচ্ছিন্ন <T> একটি মান ধরণের। এই কারণেই কলিং ToString()কোনও NullReferenceExceptionছোঁড়া ছাড়াই কাজ করে ।
থোররিন

2
যদি সেই মানসিকতা থাকে তবে .HasValueআপনি এখনও এই ব্যতিক্রমটি ছুঁড়ে ফেলার আশা করবেন
এক্সট্রাগোরি

লোকেদের ভার্বোজ সংস্করণ ব্যবহার করার আরেকটি কারণ myNullableDateTime.HasValue ? myNullableDateTime.Value.ToString("d") : nullহ'ল পছন্দসই ToStringপদ্ধতিতে অ্যাক্সেসের জন্য মোড়কযুক্ত বস্তুর দরকার নেই এমন মত প্রকাশের সাথে সমতা পোষণ করতে পারে । অবশ্যই, এর জন্য আরও সংক্ষিপ্ত সমাধান রয়েছে:$"{myNullableDateTime:d}"
এক্সট্রাগোরি

14

আমি মনে করি যে অনেক লোকের এমন চেক রয়েছে কারণ এটি কোনও বস্তুর স্বাভাবিক আচরণ নয় যা নাল মান ধরে রাখতে পারে।


@ অ্যান্ড্রু সম্মত হয়েছেন, কারণ লোকেরা (আমার মতো) প্রথমে মনে করে যে এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে।
নাথান কোপ

1
এই আচরণটি আমার কোনও ধারণা ছিল না। আমি অবশ্যই ভেবে দেখেছি যে কোনও নির্মাণ (x == নাল) এর ক্ষেত্রে সত্যিকার অর্থে ফিরে আসে যদি আপনি x.ToString () কল করেন তবে একটি নালারফেরান এক্সেপশন নিক্ষেপ করবে।
ড্যান ব্রায়ান্ট

5

না, আপনি সঠিক, সংক্ষিপ্ত সংস্করণটি অন্যান্য লোকেরা সে ক্ষেত্রে যা করেছে তা হ'ল। অন্যান্য কন্সট্রাক্ট আমি নালাগুলির সাথে টার্নারি পরিবর্তে অনেকগুলি ব্যবহার করার প্রবণতা হ'ল নাল কোয়েলসিং অপারেটর, ,. যা আপনাকে নালাগুলি থেকে রক্ষা করে। ToString () এর জন্য এটি প্রয়োজনীয় নয় (যেমন আপনি দেখিয়েছেন) তবে ডিফল্ট ইনট মানগুলির জন্য (উদাহরণস্বরূপ) এটি দুর্দান্তভাবে কাজ করে, যেমন:

int page = currentPage ?? 1;

এটি আপনাকে পৃষ্ঠায় সমস্ত পূর্ণসংখ্যার ক্রিয়াকলাপ করতে দেয় / ডব্লু / ও প্রথমে স্পষ্টভাবে নাল চেক করা এবং কারেন্টপেজের মানটি কল করার জন্য (যেখানে কারেন্টপেজটি কোনও অন্তর্গত? সম্ভবত প্যারাম হিসাবে পাস হয়েছে)


5

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


3

এটা কি ঠিক প্যাটার্ন অনুসরণ করা যেতে পারে? অথবা তারা ব্যাকএন্ড জানে না। আপনি ঠিক কোড ঠিক একই। আপনি এমনকি করতে পারেন:

int? i = null;
i.ToString(); //No NullReferenceException

টোস্ট্রিং () যদি অবিস্মরণীয় সংস্কৃতির হতে হয় তবে আপনার দীর্ঘ মেনু নিয়ে যেতে হবে, কারণ মেনুতে nullaables না থাকে।
Г И І И

1

int?সিনট্যাক্স চিনির যা নাল পরিবর্তনশীল ঘোষণাকে সহজ করে। এটা যেমন হয় Nullable<int>

সুতরাং যদি আপনি (নীচে দেখুন) এরToString() জন্য পদ্ধতির বাস্তবায়নটি একবার দেখুন , আপনি খেয়াল করতে পারেন, এটির কোনও মূল্য না থাকলে ক্ষেত্রে খালি স্ট্রিংটি ফিরে আসে।Nullable<T>

public struct Nullable<T> where T : struct
{
    public override string ToString()
    {
      if (!this.hasValue)
        return "";
      return this.value.ToString();
    }
}

এমএসডিএন যা বলে:

নলেবল.টোস্ট্রিং পদ্ধতি

যদি হ্যাসভ্যালু সম্পত্তিটি সত্য হয় তবে বর্তমান নুলযোগ্য বস্তুর মানটির পাঠ্যের উপস্থাপনা বা হ্যাসভ্যালু সম্পত্তিটি মিথ্যা হলে একটি ফাঁকা স্ট্রিং ("") প্রদান করে।

সুতরাং নিম্নলিখিত কোডটি ArgumentNullExceptionব্যতিক্রম ছোঁড়ার পরিবর্তে কনসোলে খালি স্ট্রিংটি মুদ্রণ করবে ।

static void Main(string[] args)
{
    int? a = null;
    Console.WriteLine(a.ToString()); // Prints empty string to console.
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.