কনসোল.ওরাইটলাইন () এবং এত যুক্তি ওভারলোডের প্রয়োজন?


87

আমি ডকুমেন্টেশনের মাধ্যমে ব্রাউজ করছি এবং লক্ষ্য করেছি যে Console.WriteLine()পদ্ধতিতে বেশ কয়েকটি ওভারলোড ছিল। বিশেষত, আমার কৌতূহল এবং আংশিক বিভ্রান্তি এগুলির সাথে সম্পর্কিত:

public static void WriteLine(string format, params object[] arg);
public static void WriteLine(string format, object arg0);
public static void WriteLine(string format, object arg0, object arg1);
public static void WriteLine(string format, object arg0, object arg1, object arg2);
public static void WriteLine(string format, object arg0, object arg1, object arg2, object arg3);

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

উত্তর:


102

সাধারণভাবে আপনি সঠিক যে প্রথম ওভারলোড অন্যান্য ওভারলোডের জন্য যথেষ্ট। যদিও এটি paramsকীওয়ার্ডটি অপ্রত্যক্ষ ক্ষেত্রে যেমন গ্রুপ গ্রুপ বাঁধাইয়ের জন্য ব্যবহার করা যায় না তবুও এটি কঠোরভাবে সত্য নয়। উদাহরণ স্বরূপ

delegate void E(string format, object o1);
E e = Console.WriteLine;

paramsওভারলোড এই কেসটি সন্তুষ্ট করবে না, কেবলমাত্র যখন এই নির্দিষ্ট ওভারলোডটি উপস্থিত হয় তখন এটি কাজ করবে

public static void WriteLine(string format, object arg0);

যদিও এটি একটি দুর্দান্ত রহস্যজনক ঘটনা। আরও গুরুত্বপূর্ণ কারণগুলি নিম্নরূপ

  1. প্রতিটি সিএলআই ভাষার paramsকীওয়ার্ডটি সমর্থন করার প্রয়োজন হয় না । অতিরিক্ত লোড থাকার পরে একটি সরল WritLine` কলের জন্য ম্যানুয়ালি একটি অ্যারে তৈরি করার প্রয়োজনীয়তা সরিয়ে সেই ভাষাগুলির বোঝা হ্রাস করা হয়
  2. কর্মক্ষমতা. ওভারলোডকে কল করা paramsকলারকে একটি অ্যারে বরাদ্দ করতে বাধ্য করে, যদিও এটি সংকলক দ্বারা সুস্পষ্টভাবে সম্পন্ন করা হয়েছে। বরাদ্দগুলি। নেট এ সস্তা তবে নিখরচায়। এর মতো ছোট ছোট জিনিসগুলি বিশেষত সাধারণত ব্যবহৃত পদ্ধতিতে দ্রুত যুক্ত হয় Console.WriteLine। অন্যান্য ওভারলোড হ'ল সাধারণ কেসগুলি এই বরাদ্দ এড়াতে সহায়তা করে

4
আমি আমার উত্তরে পদ্ধতি গ্রুপ কেস সম্পর্কে ভেবেছিলাম তবে আমি নিশ্চিত যে সি # ২.০ অবধি মেথড গ্রুপ রূপান্তর চালু হয়নি তবে রাইটলাইন ওভারলোডগুলি কমপক্ষে ১.১ এর মধ্যে রয়েছে।
— জেকেট

@ জেকেট সুবিধাজনক বাক্য গঠন সি # 2.0 তে যুক্ত করা হয়েছে। আপনি যদি new E(Console.WriteLine)সি # 1 তে স্পষ্টভাবে ব্যবহার করেন তবে একই পয়েন্টটি প্রযোজ্য
— কোডসইনচাজস

4
কনসোলটি কত ধীরে ধীরে ধীরে ধীরে অ্যারে বরাদ্দ পাওয়া যায়?
— ব্রায়ান বোয়েচার

4
@ ইনস্টা এটি গতি নয়, বরাদ্দ সংগ্রহ যা সমস্যা। জিসি সস্তা সস্তা নয় এবং জটিল অ্যাপ্লিকেশনগুলিতে জিসি প্রায়শই প্রভাবশালী পারফরম্যান্স ফ্যাক্টর হয়। অপ্রয়োজনীয় বরাদ্দের সাধারণ উত্সগুলি বন্ধ করা কার্য সম্পাদনের জন্য গুরুত্বপূর্ণ
— জারেডপাড়

38

ওভারলোডগুলি সি ++ / সিএলআই প্রোগ্রামগুলির সুবিধার জন্য যেখানে প্যারাম কীওয়ার্ড বিদ্যমান নেই।


4
আইএমএইচওও, একটি দুর্দান্ত প্রশ্নের উত্তর এটি।
— উয়ে কেইম

4
আহ্ ... যা আসলে অনেক অর্থবোধ করে। আমার লজ্জা, সি ++ আমার প্রথম ভাষা ছিল। :)
— বি কে

4
বুনিয়াদি প্রথম ভাষা থেকে শুরু হয়, চতুর উত্তর বন্ধু
— ডিবিডাব্লু 7'14

4

আমি মনে করি আপনারা সকলেই ভুলে যাচ্ছেন যে সি # ২.০ এ প্যারামগুলি চালু হয়েছিল। সুতরাং, ওভারলোডগুলি NET 1.1 থেকেও বিদ্যমান, যখন প্যারাম কীওয়ার্ডটি নেই।


জেকেট যে উল্লেখ করেছেন।
— বি কে

জারেডপারের উত্তর সম্পর্কে তাঁর মন্তব্য পড়ুন। তিনি তার উত্তরে পরম ব্যাখ্যাটি অন্তর্ভুক্ত না করার একটি কারণ।
— বি কে

@ নুবকোড, এটি সত্য যে তিনি করেছিলেন তবে এটি অনুমান করা হয়েছে (আমি এটি কীভাবে পড়ি)। আমি এখানে অ্যালানকে একটি উত্সাহ দিলাম (যতটুকু কম দামের জন্য) তবে তিনি এটি আরও সরাসরি ম্যানরারে বর্ণনা করেছেন।
— ফ্র্যাঙ্ক ভি

4
এই লিঙ্কটি থেকে প্যারাম কীওয়ার্ডগুলি। নেট 1.1 তেও রয়েছে
— শ্রীরাম সাক্তিভেল

1

আমি মনে করি যে জিজ্ঞাসা করা প্রশ্নটির ইতিমধ্যে জারেডপার এবং জেকেটের ভাল এবং ব্যাখ্যামূলক উত্তর রয়েছে তবে একটি বিষয় যা আমি মনে করি তা প্রাসঙ্গিকও হতে পারে,

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

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


4
তবে ধারণাটি paramsতাই আপনি হয় কোনও অ্যারে পাস করতে পারেন, বা স্পষ্টভাবে সমস্ত যুক্তি লিখতে পারেন। মত একটি পদ্ধতি void do(params object[])হয় হয় সঙ্গে do(new object[] {"some", "stuff"}বা বলা যেতে পারে do("some", "stuff")। আমি মনে করি না যে এখানে আপনার বক্তব্য হুবহু প্রযোজ্য।
— ক্রোল্টন

4
@ ক্রল্টন তবে আপনি কি বলতে পারবেন যে কতজন প্রাথমিকের অর্থ সত্যই জানেন paramsএবং তারা জানেন যদি paramsসেখানে থাকে তবে আপনি কমা বিচ্ছিন্ন হিসাবে ভেরিয়েবলগুলি পাস করতে পারবেন।
— ডিবিডব্লিউ

4
@ ক্রোল্টান আমিও খুব বেশিদিন ধরে এটির ব্যবহারের বিষয়টি জানতাম না paramsএবং ভিজ্যুয়াল স্টুডিয়নে প্রদর্শিত সহায়তা বিভাগে প্রদর্শিত array []যুক্তি হিসাবে যদি আমি যুক্তি হিসাবে পাই তবে আমি যুক্তি হিসাবে অ্যারে সরবরাহ করার ক্ষেত্রেও একই চিন্তা করব ....
— ডিবিডাব্লু

-3

এটি আসলে পারফরম্যান্স ইস্যুর জন্য নয়। যাইহোক, ব্যবহারযোগ্যতা বৃদ্ধি এটির পিছনে একটি বৈধ কারণ।

নীচের কোডটি আপনাকে একটি ছোট্ট অন্তর্দৃষ্টি দেবে।

public class TipCalculator {
    private const double tipRate = 0.18;
    public static int Main(string[] args) {
        double billTotal;
        if (args.Length == 0) {
            Console.WriteLine("usage: TIPCALC total");
            return 1;
        }
        else {
            try {
                billTotal = Double.Parse(args[0]);
            }
            catch(FormatException) {
                Console.WriteLine("usage: TIPCALC total");
                return 1;
            }
            double tip = billTotal * tipRate;
            Console.WriteLine();
            Console.WriteLine("Bill total:\t{0,8:c}", billTotal);
            Console.WriteLine("Tip total/rate:\t{0,8:c} ({1:p1})", tip, tipRate);
            Console.WriteLine(("").PadRight(24, '-'));
            Console.WriteLine("Grand total:\t{0,8:c}", billTotal + tip);
            return 0;
        }
    }
}

দয়া করে আরও তথ্যের জন্য লিঙ্কটি দেখুন: http://msdn.microsoft.com/en-us/library/aa324774(v=vs.71).aspx


9
কিভাবে এটি ব্যবহারযোগ্যতা বৃদ্ধি করে? প্রথম পদ্ধতিটি অন্য চারটির মতো ঠিক একই কাজ করতে পারে। আপনি আমাকে ডকুমেন্টেশনের দিকে উল্লেখ করছেন, যখন আমি কেবল বলেছিলাম যে আমি নথিপত্রের মধ্য দিয়ে যাচ্ছি। আমি জানি যে সেই পদ্ধতিটি কী জন্য ব্যবহৃত হয় এবং কীভাবে ব্যবহার করা যায় (আমি কোনও উপায়ে সি # তে নতুন নই)। তবে কেন প্রথমটির উপরে অতিরিক্ত ওভারলোডের প্রয়োজন।
— বি কে

আমি মনে করি তার অর্থ কী, কেবলমাত্র একটি প্যারামিটার পাস করার জন্য, এটি ধরে রাখার জন্য অ্যারে তৈরি করার কোনও উপায় নেই, এবং এটি পদ্ধতিতে পাস করার কারণ - কেন কেবল একটি প্যারামিটারটি পাস করবেন না? এটি এমন কিছু করার জন্য আমার কারণ হবে
— কিংট্রাভিসজি

@ এসসিসিডি ১৯৮86: আপনি যদি না চান তবে প্যারাম পদ্ধতিতে আপনি অ্যারে তৈরি করবেন না। সংকলক স্বয়ংক্রিয়ভাবে একটি তৈরি করবে। এটি উভয় প্যারাম এবং এই প্রশ্নের মূল বিষয়।
— ম্যাগাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.