কেন / কখন টোস্ট্রিংকে ওভাররাইড করা উপযুক্ত হবে?


103

আমি সি # অধ্যয়ন করছি এবং আমি অবাক হয়েছি যে ওভাররাইডের মূল বিষয় এবং উপকার কী ToStringহতে পারে, নীচের উদাহরণে দেখানো হয়েছে।

ওভাররাইড ছাড়াই একটি সাধারণ পদ্ধতি ব্যবহার করে এটি কি কিছু সহজ উপায়ে করা যেতে পারে?

public string GetToStringItemsHeadings
{
    get { return string.Format("{0,-20} {1, -20}", "Office Email", "Private Email"); }
}


public override string ToString()
{
    string strOut = string.Format("{0,-20} {1, -20}", m_work, m_personal);
    return strOut;
}

4
নির্ভর করে যদি আপনি বাস্তবে এটি ইউআইতে যে কোনও জায়গায় প্রদর্শন করতে ব্যবহার করতে চান তবে তা সাধারণত ডিবাগিংয়ের জন্য - আপনি ভিএস এর ঘড়ির উইন্ডোতে টসস্ট্রিং আউটপুট দেখতে পাবেন। (তবে আপনি ক্লাসের বৈশিষ্ট্যগুলির সাথে এটিও অর্জন করতে পারেন)) আপনি শিরোনাম এবং আউটপুট পেয়েছেন দেখে মনে হচ্ছে এই প্রোগ্রামটি ব্যবহার করে Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);বা অনুরূপ ব্যবহার করে বস্তুটি ফেলে দেওয়ার জন্য এটি ব্যবহার করছে ।
রুপ

2
আমি আসলে প্রশ্নটি বুঝতে পারি না। এটি কি অন্যভাবে করা যায়? হ্যাঁ. তবে কেন আপনি এটি অন্যভাবে করতে চান
কনরাড রুডল্ফ

5
আমি GetToStringসম্পত্তির নামটি সত্যিই এড়িয়ে যাব ... তারপরে আপনি উদাহরণস্বরূপ পাবেনConsole.WriteLine(obj.ItemHeadings)
Svish

এবং আইটেমহেডিংস সম্পত্তিটি স্থিতিশীল হওয়ার জন্য পরিবর্তন করুন কারণ এর কোনও "এটি" প্রয়োজন হয় না।
eFloh

: আপনি এই প্রশ্ন চেক আউট করতে চান হতে পারে stackoverflow.com/questions/7906828/oo-design-advice-tostring
ইউরি Ghensev

উত্তর:


127
  • আপনার ওভাররাইড করা দরকার ToString? না।

  • আপনি কি অন্য উপায়ে আপনার বস্তুর স্ট্রিং উপস্থাপনা পেতে পারেন? হ্যাঁ.

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

concretely,

Console.WriteLine(yourObject);

প্রার্থনা করবে yourObject.ToString()


13
হ্যাঁ. এছাড়াও এই MVC বা ASP.Net উন্নয়নে খুবই দরকারী যেখানে @yourObjectএবং <%=yourObject%>"ToString-ED" হতে যাচ্ছি।
বেন লেশ

4
কোনও কম্বোবক্স পপুলেশন করার সময়, টুস্ট্রিং আইটেমের পাঠ্য পেতে ডিফল্ট কল হয়
ডেভি ফামেঙ্গি

3
এ জাতীয় অনুশীলন থেকে সাবধান থাকুন। সত্য গল্প: একজন শিক্ষার্থী একটি স্ট্রিং ফিরিয়ে দেওয়ার সাথে সাথে ডেটা পরিবর্তন করে এমন একটি পদ্ধতিতে টুস্ট্রিংকে ওভাররড করে। তিনি প্রোগ্রামটি ডিবাগ করছিলেন তবে প্রোগ্রামটি যখন ব্রেক ব্রেকপয়েন্টে দাঁড়িয়েছিল তখন মানটি পরিবর্তন হতে থাকে। স্পষ্টতই - প্রতিবার তিনি টুস্ট্রিংয়ের মানটি পরীক্ষা করে কার্যকর করা হয়েছিল - সুতরাং প্রোগ্রামটি চালু না থাকলেও মানটি পরিবর্তিত হয়েছিল changed
জেএনএফ

3
@ জেএনএফ "" এই জাতীয় অনুশীলন "কী? ToStringআসলে কোনও বস্তুর অবস্থা পরিবর্তন করা উচিত নয়। তবে আমি এটাই বলিনি।
কনরাড রুডল্ফ

8
@ জেএনএফ আমি এটি গ্রহণ করি না। ToStringহয় অভিপ্রেত ওভাররাইড করা যেতে হয়। সময়কাল। এই বিবৃতিতে একটি সতর্কতা স্থাপন করা ফলপ্রসূ নয়। যদি আপনি এটি ভুল করেন - আপনার নিজের দোষ। আসলে, আপনার শিক্ষার্থী ToStringডেভিড অ্যান্ডারসনের উত্তরে পোস্ট করা হয়েছে ওভাররাইডের জন্য নির্দেশিকাগুলির সরকারী তালিকার 4 দফা লঙ্ঘন করেছে ।
কনরাড রুডল্ফ

129

আমি কেবল নেট নেট ডেভেলপমেন্ট সিরিজের ফ্রেমওয়ার্ক ডিজাইন নির্দেশিকাগুলি থেকে সরাসরি উত্তর দিতে যাচ্ছি ।

এভিআইডি থেকে ব্যতিক্রম ছোঁড়াToString

কনসাইডার উদাহরণের সাথে যুক্ত একটি অনন্য স্ট্রিং ফিরিয়ে দিচ্ছে।

কনসিডারের আউটপুট ToStringথাকা এই ধরণের কোনও পার্সিং পদ্ধতির বৈধ ইনপুট হতে পারে।

আপনি কি নিশ্চিত করুন যে ToStringকোন পর্যবেক্ষণযোগ্য পার্শ্ব প্রতিক্রিয়া হয়েছে।

আপনি কি রিপোর্টের একটি ওভাররাইড মাধ্যমে নিরাপত্তা সংবেদনশীল তথ্য ToStringএকটি যথাযথ অনুমতি দাবিতে পরই। যদি অনুমতি দাবিটি ব্যর্থ হয় তবে সুরক্ষা-সংবেদনশীল তথ্য বাদ দিয়ে একটি স্ট্রিং ফিরিয়ে দিন।

Object.ToStringপদ্ধতি সাধারণ ডিসপ্লে এবং ডিবাগ উদ্দেশ্যে ব্যবহার করা উদ্দেশ্যে। ডিফল্ট বাস্তবায়ন কেবল অবজেক্ট টাইপের নাম সরবরাহ করে। ডিফল্ট বাস্তবায়ন খুব কার্যকর নয় এবং এটি প্রস্তাবিত হয় যে পদ্ধতিটি ওভাররাইড করা হবে।

আপনি কি ওভাররাইড ToStringযখনই একটি আকর্ষণীয় চিহ্নকারী পাঠযোগ্য পংক্তি ফিরে যেতে পারে। ডিফল্ট বাস্তবায়ন খুব কার্যকর নয় এবং একটি কাস্টম বাস্তবায়ন প্রায় সবসময় আরও মান প্রদান করতে পারে।

কোনও অনন্য তবে পঠনযোগ্য আইডির চেয়ে বন্ধুত্বপূর্ণ নামটি পছন্দ করবেন না।

এটি উল্লেখ করার মতো কারণ ক্রিস সেলগুলি নির্দেশিকাগুলিতেও ব্যাখ্যা করে যা ToStringব্যবহারকারী ইন্টারফেসের জন্য প্রায়শই বিপজ্জনক। সাধারণত আমার থাম্বের নিয়মটি হ'ল এমন একটি সম্পত্তি প্রকাশ করা যা ইউআই-তে তথ্য বাঁধতে ব্যবহৃত হবে ToStringএবং বিকাশকারীকে ডায়াগনস্টিক তথ্য প্রদর্শনের জন্য ওভাররাইডটি রেখে যাবে । আপনি DebuggerDisplayAttributeপাশাপাশি আপনার টাইপ সাজাতে পারেন ।

স্ট্রিংটি ToStringছোট থেকে ফিরে আসার চেষ্টা করবেন DO ডিবাগারটি ToStringবিকাশকারীকে দেখানোর জন্য কোনও সামগ্রীর পাঠ্য উপস্থাপনা পেতে ব্যবহার করে। যদি স্ট্রিংটি ডিবাগারটি প্রদর্শন করতে পারে তার চেয়ে দীর্ঘ হয়, তবে ডিবাগিং অভিজ্ঞতা বাধাগ্রস্থ হয়।

আপনি কি স্ট্রিং যখন সংস্কৃতি নির্ভর তথ্য ফেরার বর্তমান থ্রেড সংস্কৃতির উপর ভিত্তি করে বিন্যাস।

আপনি কি জমিদার প্রদান ToString(string format), বা বাস্তবায়ন IFormattable, যদি থেকে STRING আগমন ToStringসংস্কৃতি সংবেদনশীল নয় অথবা সেখানে স্ট্রিং ফরম্যাট করতে বিভিন্ন উপায় আছে। উদাহরণস্বরূপ, DateTimeওভারলোড এবং সরঞ্জাম সরবরাহ করে IFormattable

একটি খালি স্ট্রিং বা এলোমেলো নাToString

আমি এই নির্দেশিকাগুলির শপথ করছি, এবং আপনার উচিত। আমি আপনাকে বলতে পারি না যে এই কোডটির জন্য কেবল আমার কোডটি কীভাবে উন্নত হয়েছে ToString। একই জিনিস IEquatable(Of T)এবং মত জিনিস জন্য যায় IComparable(Of T)। এই জিনিসগুলি আপনার কোডটিকে খুব কার্যকরী করে তোলে এবং এগুলির কোনও বাস্তবায়নের জন্য অতিরিক্ত সময় দেওয়ার জন্য আপনি দুঃখিত হবেন না।

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


6
উত্তম উত্তর, আপনি কি এই নির্দেশিকাগুলি যা msdn.microsoft.com/en-us/library/ms229042.aspx উল্লেখ করেন ?
জোডরেল

2
@ জোডরেল আমি বিশ্বাস করি এটি ফ্রেমওয়ার্ক ডিজাইনের গাইডলাইন
জিম শোবার্ট

6
ভাল উদ্ধৃতি প্রয়োজন।
বেন ভয়েগট

13
আমি জানতাম না এসও উইকিপিডিয়ায় পরিণত হচ্ছে।
ডেভিড অ্যান্ডারসন

14
এটি নয়, তবে আপনি যখন নির্দেশিকা উদ্ধৃত করেন, উত্স সরবরাহ করা এক অনিবার্য প্লাস।
ফ্যালানওয়ে

39

ওভাররাইডিং ToString()আপনাকে একটি শ্রেণীর একটি দরকারী মানব-পঠনযোগ্য স্ট্রিং প্রতিনিধিত্ব করতে দেয়।

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

আপনার উদাহরণের সাথে - এই শ্রেণিটি কী তা না জেনে আপনার ওভাররাইড কার্যকর কিনা তা বলা মুশকিল - তবে বাস্তবায়ন নিজেই ঠিক আছে।


13

এটি সর্বদা উপযুক্ত তবে আপনি যেটি প্রদর্শন করছেন তার পিছনে উদ্দেশ্যগুলি সাবধানতার সাথে বিবেচনা করুন

আরও ভাল প্রশ্ন জিজ্ঞাসা করা হবে:

কেন একজন টসস্ট্রিং () কে ওভাররাইড করবে?

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

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

আমি টুস্ট্রিং পদ্ধতিটি কোনও বস্তুর --help পরামিতি হিসাবে কল্পনা করতে চাই। এটি সংক্ষিপ্ত, পাঠযোগ্য, সুস্পষ্ট এবং প্রদর্শন করা সহজ। এটা তোলে প্রদর্শন করা উচিত কি বস্তু হল এটা কি না করে । এই সমস্ত বিবেচনা করে আসুন বিবেচনা করা যাক ...

কেস ব্যবহার করুন - একটি টিসিপি প্যাকেট পার্সিং:

কেবলমাত্র অ্যাপ্লিকেশন-স্তরের নেটওয়ার্ক ক্যাপচার নয়, পিসি্যাপ ক্যাপচারের মতো আরও মাংসযুক্ত কিছু।

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

যার মধ্যে রয়েছে:

  • উত্স বন্দর
  • গন্তব্য পোর্ট
  • ক্রমিক নম্বর
  • স্বীকৃতি নম্বর
  • ডেটা অফসেট
  • পতাকা
  • উইন্ডো অফসেট
  • চেকসাম
  • জরুরী পয়েন্টার
  • বিকল্পগুলি (আমি এমনকি সেখানে যাব না)

আপনি যদি 100 টি প্যাকেটে টিসিপি.টোস্ট্রিং () কল করে থাকেন তবে আপনি কি সেই সমস্ত আবর্জনা পেতে চান? অবশ্যই না, এটি তথ্য ওভারলোড হবে। সহজ এবং সুস্পষ্ট পছন্দটিও সবচেয়ে বুদ্ধিমান ...

লোকেরা কী প্রত্যাশা করবে তা প্রকাশ করুন:

  • উত্স বন্দর
  • গন্তব্য পোর্ট

আমি একটি বোধগম্য আউটপুট পছন্দ করি যা মানুষের পক্ষে পার্স করা সহজ তবে ওয়াইএমএমভি

TCP:[destination:000, source:000]

জটিল কিছু নয়, আউটপুটটি মেশিনগুলির বিশ্লেষণের জন্য নয় (অর্থাত্ লোকেরা আপনার কোডটি অপব্যবহার না করে), উদ্দেশ্যযুক্ত উদ্দেশ্য মানব পাঠযোগ্যতার জন্য।

তবে আমি আগে যে রসালো তথ্যটি নিয়ে বাকী কথা বললাম সেগুলি সম্পর্কে কী, এটিও কার্যকর নয়? আমি সেখানে যাব তবে প্রথমে ...


টোস্ট্রিং () সর্বকালের অন্যতম মূল্যবান এবং অনুন্নত পদ্ধতি

দুটি কারণে:

  1. লোকেরা বুঝতে পারে না টসস্ট্রিং () কীসের জন্য
  2. বেস 'অবজেক্ট' শ্রেণিতে অন্য একটি, একই গুরুত্বপূর্ণ, স্ট্রিং পদ্ধতি অনুপস্থিত।

কারণ 1 - টসস্ট্রিং () এর উপযোগিতাটি অপব্যবহার করবেন না:

প্রচুর লোক টুস্ট্রিং () ব্যবহার করে কোনও বস্তুর সাধারণ স্ট্রিং উপস্থাপনা টানতে। সি # ম্যানুয়াল এমনকি বলে:

টো স্ট্রিং .NET ফ্রেমওয়ার্কের প্রধান বিন্যাস পদ্ধতি। এটি কোনও বস্তুকে তার স্ট্রিং উপস্থাপনায় রূপান্তর করে যাতে এটি প্রদর্শনের জন্য উপযুক্ত।

প্রদর্শন করুন, আরও প্রক্রিয়াজাতকরণ নয়। এর অর্থ এই নয় যে, উপরের টিসিপি প্যাকেটের জন্য আমার দুর্দান্ত স্ট্রিং উপস্থাপনা নিন এবং একটি রেজেক্স :: ক্রিংজ :: ব্যবহার করে উত্স বন্দরটি টানুন।

ডান কিছু করার উপায়, কল ToString () সরাসরি SourcePort সম্পত্তি (যা BTW তাই ToString একটি ushort () ইতিমধ্যে পাওয়া উচিত) হয়।

মেশিন পার্সিংয়ের জন্য কোনও জটিল অবজেক্টের অবস্থা প্যাকেজ করার জন্য যদি আপনার আরও শক্তিশালী কিছু দরকার হয় তবে আপনি কাঠামোগত সিরিয়ালাইজেশন কৌশলটি ব্যবহার করা ভাল।

ভাগ্যক্রমে, এ জাতীয় কৌশলগুলি খুব সাধারণ:

  • ইশিরাইলাইজেবল (সি #)
  • আচার (পাইথন)
  • জেএসএন (জাভাস্ক্রিপ্ট বা এটি প্রয়োগকারী কোনও ভাষা)
  • সাবান
  • ইত্যাদি ...

দ্রষ্টব্য: আপনি যদি পিএইচপি ব্যবহার না করেন তবে, হার্প-ডার্প, তার জন্য একটি ফাংশন আছে :: স্নিকার ::

কারণ 2 - টুস্ট্রিং () যথেষ্ট নয়:

আমি এখনও এমন একটি ভাষা দেখতে পাই যা মূলত এটি প্রয়োগ করে তবে আমি বুনোতে এই পদ্ধতির বিভিন্নতা দেখেছি এবং ব্যবহার করেছি।

যার মধ্যে কিছু রয়েছে:

  • ToVerboseString ()
  • ToString (বাগাড়ম্বরপূর্ণ সত্য =)

মূলত, টিসিপি প্যাকেটের রাজ্যের সেই লোমশ জঞ্জালটি মানব পাঠযোগ্যতার জন্য বর্ণনা করা উচিত । টিসিপি নিয়ে কথা বলতে 'মৃত ঘোড়াটিকে মারধর' এড়াতে আমি # 1 মামলায় 'আঙুল তুলে দেখব' যেখানে আমি মনে করি যে ToString () এবং ToVerboseString () নিরূপিত করা হয়েছে ...

কেস ব্যবহার করুন - অ্যারে:

আপনি যদি প্রাথমিকভাবে একটি ভাষা ব্যবহার করেন তবে আপনি সম্ভবত সেই ভাষার পদ্ধতির সাথে স্বাচ্ছন্দ্য বোধ করেন। আমার মতো লোকদের জন্য যারা বিভিন্ন ভাষার মধ্যে লাফ দেন, বিভিন্ন পদ্ধতির সংখ্যা বিরক্তিকর হতে পারে।

অর্থাৎ, যে পরিমাণ বার আমাকে বিরক্ত করেছে, তা প্রতিটি হিন্দু দেবতার সমস্ত আঙুলের যোগফলের চেয়ে বড়।

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

আমি যা চাইছি তা হ'ল একটি খুব সহজ পদ্ধতির:

print(array.ToString());

আউটপুট: 'অ্যারে [এক্স]' বা 'অ্যারে [এক্স] [y]'

যেখানে x হ'ল প্রথম মাত্রায় আইটেমের সংখ্যা এবং y হ'ল দ্বিতীয় মাত্রায় আইটেমের সংখ্যা বা এমন কোনও মান যা ইঙ্গিত দেয় যে 2 য় মাত্রাটি জেগড (কমপক্ষে / মিনিটের সীমা হতে পারে?)।

এবং:

print(array.ToVerboseString());

পুরো শে-ব্যাংকে চমত্কার মুদ্রণে আউটপুট দেয় কারণ আমি সুন্দর জিনিসগুলির প্রশংসা করি।

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


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

1
@JCoombs- এর সাথে আমি একমত নই, বোঝাপড়া দুর্দান্ত। বোধগম্যতার মাধ্যমে পাইথনের ডেটা স্ট্রাকচারগুলি ট্র্যাভার করা জীবনকে অনেক সহজ করে তোলে তবে এই পদ্ধতির জন্য এখনও অবজেক্টের অভ্যন্তরীণ কাঠামোর অন্তরঙ্গ জ্ঞান প্রয়োজন। বাহ্যিক গ্রন্থাগার থেকে আমদানি করা শ্রেণীর সাথে এমন কিছু যা সর্বদা সুস্পষ্ট নয়। লাইব্রেরির লেখকদের পক্ষে ToString () ওভাররাইড করা এবং একটি দরকারী মানব-পঠনযোগ্য উপস্থাপনা সরবরাহ করা ভাল অভ্যাস তবে এটি সাধারণ ডাম্প পদ্ধতিতেও ভাল হবে যা সাধারণ কাঠামোগত মানব পাঠযোগ্য বিন্যাসে (প্রাক্তন জেএসওএন) অবজেক্টের কাঠামোকে ছাপিয়ে দেয়।
ইভান প্লেস

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

1
কার্যনির্বাহী স্তরে @ জ্যাকুমস ইয়েপ, জেএসওএন এবং এক্সএমএল একই উদ্দেশ্যে কাজ করে। প্রচুর লোক টসস্ট্রিংকে মেশিন-পঠনযোগ্য আউটপুট হিসাবে ব্যবহার করেন; তা খারাপ হোক বা না তা বিতর্কযোগ্য। আমার সবচেয়ে বড় গরুর মাংস হ'ল - প্রায়শই - এটি মানব-পঠনযোগ্য ফর্ম্যাটে কোনও বস্তুর অবস্থার আউটপুট দেওয়ার জন্য ব্যথা। টোস্ট্রিং () বাস্তবায়ন প্রায়শই স্বল্প-ব্যবহৃত হয় এবং ডিবাগার ওয়াচ তালিকার বাইরে কোনও অবজেক্টের রাজ্য পড়া ব্যথা হয়। সিরিয়ালযুক্ত উপস্থাপনাগুলি কোনও সামগ্রীর পুরো রাজ্য প্রদর্শনের ব্যাকআপ হিসাবে ভাল তবে টোস্ট্রিংয়ের আরও ভাল বাস্তবায়নই সেরা বিকল্প।
ইভান প্লেস

যদি ToString()এটি ডিবাগিংয়ের জন্য বোঝানো হয়, তবে স্ট্রিংবিল্ডার থেকে পুরো পাঠটি কেনার একমাত্র উপায় - এটি একটি গুরুত্বপূর্ণ ফাংশন?
ড্যান ডব্লু

9

এটি যথাযথ হিসাবে ভাল অনুশীলন সম্পর্কে।

ToString()সাধারণত কোনও মানুষের ব্যবহারের জন্য কোনও বস্তুর স্ট্রিং প্রতিনিধিত্ব ফিরিয়ে আনতে অনেক জায়গায় ব্যবহৃত হয়। প্রায়শই একই স্ট্রিংটি অবজেক্টটিকে পুনরায় জলস্রাব করতে ব্যবহার করা যেতে পারে (মনে করুন intবা DateTimeউদাহরণস্বরূপ) তবে এটি সর্বদা প্রদত্ত নয় (উদাহরণস্বরূপ একটি গাছের জন্য একটি কার্যকর স্ট্রিং উপস্থাপনা থাকতে পারে যা কেবল একটি গণনা প্রদর্শন করে, তবে স্পষ্টতই আপনি ব্যবহার করতে পারবেন না এটি পুনর্নির্মাণের জন্য)।

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

সাধারণভাবে, এছাড়াও, এই জাতীয় ধরণের প্রায়শই একটি স্পষ্ট সদস্য থাকে যা একটি স্ট্রিংও প্রদান করে। উদাহরণস্বরূপ একটি ল্যাট / লম্বা জুড়ি থাকতে পারে ToDecimalDegreesযা "-10, 50"উদাহরণস্বরূপ ফিরে আসে তবে এটিও থাকতে পারে ToDegreesMinutesSeconds, কারণ এটি ল্যাট / লং জুটির জন্য অন্য ফর্ম্যাট। একই ধরণের পরে ToStringডিবাগিংয়ের মতো জিনিসগুলির জন্য একটি 'ডিফল্ট' সরবরাহ করার জন্য, এমনকি ওয়েব পৃষ্ঠাগুলি রেন্ডারিংয়ের মতো সম্ভাব্যতার জন্যও উদাহরণস্বরূপ (উদাহরণস্বরূপ, @রেজারে ToString()তৈরি করা) একটি স্ট্রিং-বিহীন এক্সপ্রেশনটির ফলাফলটি লিখে দেয় আউটপুট স্ট্রিম)।


6

object.ToString()কোনও বস্তুকে তার স্ট্রিং প্রতিনিধিতে রূপান্তরিত করে। যদি আপনি যখন কোনও ব্যবহারকারী ToString()আপনার তৈরি ক্লাসে কল করেন তখন কী ফিরে আসে তা যদি আপনি পরিবর্তন করতে চান তবে আপনাকে ToString()সেই শ্রেণিতে ওভাররাইড করতে হবে ।


6

যদিও আমি মনে করি ইতিমধ্যে দরকারী তথ্য সরবরাহ করা হয়েছে, আমি আমার দুটি সেন্ট যুক্ত করব:

  • ToString()ওভাররাইড করা বোঝানো হয়। এর ডিফল্ট বাস্তবায়ন টাইপের নামটি দেয় যা সম্ভবত সময়ে সময়ে কার্যকর হয় (বিশেষত যখন প্রচুর পরিমাণে কাজ করে) বেশিরভাগ সময়েই যথেষ্ট হয় না।

  • মনে রাখবেন যে, ডিবাগিং উদ্দেশ্যে, আপনি নির্ভর করতে পারেন DebuggerDisplayAttribute। আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন ।

  • একটি নিয়ম হিসাবে, POCO- এ আপনি সর্বদা ওভাররাইড করতে পারেন ToString()। পোকো হ'ল ডেটার কাঠামোগত উপস্থাপনা যা সাধারণত স্ট্রিং হয়ে যেতে পারে।

  • ডিজাইন টোস্ট্রিং আপনার বস্তুর একটি পাঠ্য উপস্থাপনা হতে। হতে পারে এর প্রধান ক্ষেত্র এবং ডেটা, সংগ্রহের মধ্যে কতগুলি আইটেম রয়েছে তার বিবরণ হতে পারে etc.

  • এই স্ট্রিংটিকে সর্বদা একক লাইনে ফিট করার চেষ্টা করুন এবং কেবলমাত্র প্রয়োজনীয় তথ্য আছে। Personনাম, ঠিকানা, নম্বর ইত্যাদি বৈশিষ্ট্য সহ আপনার যদি কোনও শ্রেণি থাকে তবে কেবলমাত্র প্রধান ডেটা (কিছু আইডি নম্বর নাম দিন) ফিরিয়ে দিন।

  • একটি ভাল বাস্তবায়ন ওভাররাইড না সতর্কতা অবলম্বন করুন ToString()। কিছু ফ্রেমওয়ার্ক ক্লাস ইতিমধ্যে বাস্তবায়ন করেছে ToString()। ডিফল্ট বাস্তবায়ন ওভাররাইড করা একটি খারাপ জিনিস: লোকেরা একটি নির্দিষ্ট ফলাফল আশা করবে ToString()এবং অন্যটি পাবে।

সত্যিই ব্যবহার ভয় পাবেন না ToString()। সংবেদনশীল তথ্য ফিরিয়ে দেওয়া সম্পর্কে আমি কেবল সতর্ক থাকি। তা বাদে ঝুঁকি কম। অবশ্যই, কেউ কেউ উল্লেখ করেছেন যে, অন্যান্য ক্লাসগুলি যখনই তথ্যের জন্য পৌঁছেছে তখন আপনার টোস্ট্রিং ব্যবহার করবে। কিন্তু হেক, টাইপটির নামটি ফিরিয়ে দেওয়া কখন আসল তথ্য পাওয়ার চেয়ে ভাল বলে বিবেচিত হবে?


5

আপনি যদি ওভাররাইড না করেন ToStringতবে আপনি আপনার বেস ক্লাসগুলি বাস্তবায়ন পাবেন যা Objectকেবল ক্লাসের সংক্ষিপ্ত টাইপের নাম।

আপনি যদি আরও কিছু অর্থবহ বা কার্যকর বাস্তবায়ন চান ToStringতবে এটিকে ওভাররাইড করুন।


আপনার প্রকারের একটি ListBoxহিসাবে ডেটাসোর্স হিসাবে একটি হিসাবে ToStringস্বয়ংক্রিয়ভাবে প্রদর্শিত হবে তালিকা ব্যবহার করার সময় এটি দরকারী হতে পারে।

আপনি যখন আপনার টাইপটি পাস করতে চান তখন অন্য সিটেশনটি ঘটে যখন আপনার ধরণের উপস্থাপনা পেতে অনুরোধ String.Formatজানায় ToString


4

অন্য কেউ এখনও কিছু উল্লেখ করেনি: ওভাররাইড করে ToString()আপনি বাস্তবায়ন বিবেচনা IFormattableকরতে পারেন যাতে আপনি নিম্নলিখিতটি করতে পারেন:

 public override ToString() {
   return string.Format("{0,-20} {1, -20}", m_work, m_personal);
 }

 public ToString(string formatter) {
   string formattedEmail = this.ToString();
   switch (formatter.ToLower()) {
     case "w":
       formattedEmail = m_Work;
       break;
     case "p":
       formattedEmail = m_Personal;
       break;
     case "hw":
       formattedEmail = string.Format("mailto:{0}", m_Work);
       break;
   }
   return formattedEmail;
}

যা কাজে লাগতে পারে।


আপনি দয়া করে ফ্রেমওয়ার্ক শ্রেণীর একটি উদাহরণ দিতে পারেন যে পদ্ধতিটি ওভাররাইড করার জন্য সরবরাহ করে? ফ্রেমওয়ার্কে আমি কেবলমাত্র সম্পর্কিত জিনিসই সচেতন তা হ'ল IFormattibleইন্টারফেস।
tm1

@ টিএম 1 যে কোনও বস্তুর উত্তরাধিকার সূত্রে System.Objectউত্তোলনযোগ্য ToString()পদ্ধতি হবে তবে আপনি ঠিক বলেছেন যে ফর্ম্যাটর পদ্ধতিটি হওয়া উচিত নয় overrideএবং সত্যই IFormattibleসম্পূর্ণ সঙ্গতির জন্য ইন্টারফেসটি উল্লেখ করা উচিত ।
ঝাফ - বেন ডুগুইড

প্রায় - IFormattableএকটি IFormatProviderপ্যারামিটার লাগে । যদিও আপনার পোস্ট সম্পাদনা করার জন্য ধন্যবাদ।
tm1

প্রকৃতপক্ষে, এর দুটি পদ্ধতি রয়েছে, আমি যে মানটি প্রকাশ করছিলাম তা দেখানো একটিতে ছিল;)
জাফ - বেন ডুগুইড

3

টোস্ট্রিং () কে ওভাররাইড করার একটি সুবিধা হ'ল রিশার্পার টুলিং সমর্থন: আল্ট + ইনস -> "ফর্ম্যাটিং সদস্যগণ" এবং এটি আপনার জন্য টস্ট্রিং () লিখেছেন।


2

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


1

যখন structs মধ্যে (কার্যকরভাবে ব্যবহারকারী-প্রিমিটিভের) সংজ্ঞা আমি এটা ভাল অভ্যাস ম্যাচিং আছে খুঁজে ToStringএবং Parseএবং TryParseপদ্ধতি, বিশেষ করে এক্সএমএল ধারাবাহিকতাতে জন্য। এই ক্ষেত্রে আপনি পুরো রাজ্যটিকে একটি স্ট্রিংয়ে রূপান্তর করবেন, যাতে এটি পরে থেকে পড়তে পারে।

ক্লাস তবে আরো যৌগ কাঠামো যা সাধারণত ব্যবহার করার জন্য অত্যন্ত জটিল হতে হবে ToStringএবং Parse। তাদের ToStringপদ্ধতিগুলি পুরো রাজ্যটিকে সংরক্ষণ করার পরিবর্তে একটি সাধারণ বিবরণ হতে পারে যা আপনাকে তাদের নাম বা আইডির মতো অনন্য শনাক্তকরণের মতো বা কোনও তালিকার জন্য পরিমাণের মতো তাদের রাজ্য সনাক্ত করতে সহায়তা করে।

এছাড়াও, রবি যেমন বলেছিলেন, ওভাররাইডিং ToStringআপনাকে ToStringপ্রকারের মতো মৌলিক হিসাবে কোনও রেফারেন্সে কল করতে দেয় object


1

আপনি যখন এটির মতো ব্যক্তির মতো স্ট্রিং উপস্থাপনের স্বজ্ঞাত অর্থ না দিয়ে কোনও বস্তুটি ব্যবহার করতে পারেন। সুতরাং আপনার যদি এই ব্যক্তিকে মুদ্রণের জন্য উদাহরণের প্রয়োজন হয় তবে আপনি এটির বিন্যাস প্রস্তুত করার জন্য এই ওভাররাইডটি ব্যবহার করতে পারেন।


1

Object.ToStringপদ্ধতিটি কেবল ডিবাগিংয়ের উদ্দেশ্যে ব্যবহার করা উচিত। ডিফল্ট বাস্তবায়ন বস্তুর ধরণের নাম দেখায় যা খুব কার্যকর নয়। ডায়গনিস্টিকস এবং ডিবাগিংয়ের জন্য আরও ভাল তথ্য সরবরাহ করতে এই পদ্ধতিটিকে ওভাররাইড করার কথা বিবেচনা করুন। দয়া করে বিবেচনা করুন যে লগিং ইনফ্রাস্ট্রাকচারগুলি প্রায়শই টোস্ট্রিং পদ্ধতিটিও ব্যবহার করে এবং তাই আপনি আপনার লগ ফাইলগুলিতে এই পাঠ্য টুকরোটি খুঁজে পাবেন।

Object.ToStringপদ্ধতির মধ্যে স্থানীয় পাঠ্য সংস্থানগুলি ফেরত দেবেন না । কারণটি হ'ল টুস্ট্রিং পদ্ধতিতে সর্বদা এমন কিছু ফিরিয়ে দেওয়া উচিত যা বিকাশকারী বুঝতে পারে। বিকাশকারী অ্যাপ্লিকেশন সমর্থন করে এমন সমস্ত ভাষায় কথা বলতে পারে না।

বাস্তবায়নIFormattable ইন্টারফেস যখন আপনি একটি ব্যবহারকারী বান্ধব স্থানীয় টেক্সট আসতে চাই। এই ইন্টারফেস পরামিতি সঙ্গে একটি ToString জমিদার সংজ্ঞায়িত formatএবং formatProvider। ফর্ম্যাটপ্রভাইডার আপনাকে সংস্কৃতি সচেতন উপায়ে পাঠ্য ফর্ম্যাট করতে সহায়তা করে।

আরও দেখুন: অবজেক্ট.টোস্ট্রিং এবং আইফোর্মেটেবল


0

আপনার সম্পত্তি কীভাবে ব্যবহৃত হবে তার উপর সহজ নির্ভর করে। আপনার যদি কেবল একবারে স্ট্রিংটি ফর্ম্যাট করতে হয় তবে এটি এটিকে ওভাররাইড করে এমন বেশি বোঝায় না।

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

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

প্যাডিংয়ের জন্য আপনি যে যুক্তিগুলি যুক্ত করেছেন সেগুলি স্ট্রিং.ফর্ম্যাটটি নিশ্চিত করে যে সম্পত্তিটি যে কোনও কোডেই কল করে তার জন্য প্রতিবার একই ভাবে বিন্যাস করা হবে। পাশাপাশি, আপনাকে এগিয়ে যেতে কেবল এটির পরিবর্তে অনেকের পরিবর্তে এক জায়গায় পরিবর্তন করতে হবে।

দুর্দান্ত প্রশ্ন এবং কিছু দুর্দান্ত উত্তর!


0

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

তবে প্রশ্নে বস্তুর মানব পাঠযোগ্য উপস্থাপনা দেওয়ার আগে যা বলা হয়েছিল তার সাথে একমত।


0

আমি অন্যান্য উত্তরে উল্লিখিত ফ্রেমওয়ার্ক গাইডলাইনগুলি নিয়ে খুশি। তবে, আমি প্রদর্শন এবং ডিবাগিংয়ের উদ্দেশ্যগুলিতে জোর দিতে চাই like

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

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

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