কেন প্যারাম কীওয়ার্ড ব্যবহার করবেন?


336

আমি জানি এটি একটি প্রাথমিক প্রশ্ন, তবে আমি কোনও উত্তর খুঁজে পাইনি।

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

প্যারাম সহ:

static public int addTwoEach(params int[] args)
{
    int sum = 0;
    foreach (var item in args)
        sum += item + 2;
    return sum;
}

প্যারাম ছাড়াই:

static public int addTwoEach(int[] args)
{
    int sum = 0;
    foreach (var item in args)
       sum += item + 2;
    return sum;
}

62
পদ্ধতির কোড নিজেই এখনও নিখুঁতভাবে কাজ করবে ... কলিং কোডটি ভাল নাও হতে পারে ...
জন স্কিটি

7
প্যারাম কী কী শব্দের অর্থ বিকল্প পরামিতি যা পদ্ধতিতে পাস করা যায় বা না। আউট প্যারাম কী শব্দের সাথে থাকা একটি অ্যারের অর্থ হল আপনি পদ্ধতিতে অ্যারে যুক্তিটি পাস করতে হবে।
আইলায়না এন্টাররিয়া

পাইথন ল্যাঙ্গুয়েজ এখানে* একইভাবে বর্ণিত একটি পূর্বনির্ধারিত প্যারামিটারের সাথে একই ধারণাটিকে কার্যকরভাবে প্রয়োগ করে ।
আরবিটি

উত্তর:


485

সঙ্গেparams আপনি ভালো আপনার পদ্ধতি কল করতে পারেন:

addTwoEach(1, 2, 3, 4, 5);

ছাড়া params, আপনি পারবেন না।

অতিরিক্তভাবে, আপনি উভয় ক্ষেত্রে প্যারামিটার হিসাবে অ্যারে দিয়ে পদ্ধতিটি কল করতে পারেন :

addTwoEach(new int[] { 1, 2, 3, 4, 5 });

অর্থাৎ, paramsপদ্ধতিটি কল করার সময় আপনাকে একটি শর্টকাট ব্যবহার করতে দেয়।

সম্পর্কিত নয়, আপনি আপনার পদ্ধতিটি মারাত্মকভাবে সংক্ষিপ্ত করতে পারেন:

public static int addTwoEach(params int[] args)
{
    return args.Sum() + 2 * args.Length;
}

17
@ কেন: আপনার নাম স্থানটি আমদানি করার প্রয়োজন হতে পারে System.Linq:)
রানহিরু জুড কুরাই

49
অথবা প্রত্যাবর্তন করুন.সুম (i => i + 2);
bornfromanegg

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

2
আপনি ব্যবহার করতে পারেন return args.Select(x => x + 2).Sum();
বিবিভিজি

1
যখন আপনি যোগ paramsআপনি লক নিজের কলারের বা পদ্ধতি রেজল্যুশন ভঙ্গ ছাড়া অতিরিক্ত পদ্ধতি আর্গুমেন্ট যোগ বাইরে।
মিঃ ইয়ং

93

ব্যবহারের paramsফলে আপনি কোনও যুক্তি ছাড়াই ফাংশনটিতে কল করতে পারবেন। ছাড়া params:

static public int addTwoEach(int[] args)
{
    int sum = 0;

    foreach (var item in args)
    {
        sum += item + 2;
    }

    return sum;
}

addtwoEach(); // throws an error

সাথে তুলনা করুন params:

static public int addTwoEach(params int[] args)
{
    int sum = 0;

    foreach (var item in args)
    {
        sum += item + 2;
    }

    return sum;
}

addtwoEach(); // returns 0

সাধারণত, আপনি যখন প্যারাম ব্যবহার করতে পারেন তখন আর্গুমেন্টের সংখ্যা 0 থেকে অনন্ত হয়ে যেতে পারে এবং একটি অ্যারে ব্যবহার করুন যখন আর্গুমেন্টের সংখ্যা 1 থেকে অনন্ত হয়ে যায়।


13
আসলে একটি অ্যারে খালি থাকতে পারে। new int[0]। আশাকরি এটা সাহায্য করবে! :)
বিধি

22

এটি আপনাকে আপনার কলটিতে যতগুলি বেস টাইপ পরামিতি যুক্ত করতে দেয়।

addTwoEach(10, 2, 4, 6)

যদিও দ্বিতীয় ফর্মের সাথে আপনাকে প্যারামিটার হিসাবে একটি অ্যারে ব্যবহার করতে হবে

addTwoEach(new int[] {10,2,4,6})

17

paramsকীওয়ার্ড সহ একটি বিপদ হ'ল, যদি পদ্ধতিতে কলগুলি কোড করার পরে থাকে ,

  1. কেউ দুর্ঘটনাক্রমে / ইচ্ছাকৃতভাবে পদ্ধতি স্বাক্ষর থেকে এক / আরও প্রয়োজনীয় প্যারামিটারগুলি সরিয়ে দেয় এবং
  2. স্বাক্ষর পরিবর্তনের আগে প্যারামিটারের সাথে সাথে এক / আরও প্রয়োজনীয় প্যারামিটারগুলি প্যারামিটারের সাথে paramsটাইপ-সামঞ্জস্যপূর্ণ ছিল params,

এই কলগুলি প্রয়োজনীয় পরামিতিগুলি alচ্ছিক প্যারামিটার হিসাবে বিবেচিত হওয়ার পূর্বে উদ্দেশ্যে করা এক / একাধিক এক্সপ্রেশন দিয়ে সংকলন চালিয়ে যাবে params। আমি কেবল paramsএটির মধ্যে সবচেয়ে খারাপ অবস্থাতেই ছুটেছি : প্যারামিটারটি টাইপের ছিল object[]

এই উল্লেখযোগ্য কারণ ডেভেলপারদের কম্পাইলার অনেক, আরো অনেক সাধারণ দৃশ্যকল্প যেখানে পরামিতি সব একটি পদ্ধতি থেকে সরিয়ে ফেলা হয় তাদের কবজি slapping করতে ব্যবহৃত হয় প্রয়োজনীয় পরামিতি (প্যারামিটার # প্রত্যাশিত কারণ পরিবর্তন হবে)।

আমার জন্য, এটি শর্টকাটের মূল্য নয়। (Type)[]ছাড়া paramsপ্যারামিটার অনন্ত # 0 সঙ্গে ইচ্ছার কাজ অগ্রাহ্য করা ছাড়াই। সবচেয়ে খারাপ ক্ষেত্রে হ'ল আপনাকে যেসব , new (Type) [] {}কল প্রয়োগ হয় না সেখানে একটি যুক্ত করতে হবে।

বিটিডব্লিউ, ইমো, সবচেয়ে নিরাপদ (এবং সর্বাধিক পঠনযোগ্য অনুশীলন) হ'ল:

  1. নামযুক্ত পরামিতি মাধ্যমে পাস (যা আমরা এখন কি করতে পারি এমনকি 2 C # ~ দশক আমরা ভিবি মধ্যে পারা পর; p) (কারণ:

    1.1। প্যারামিটার অর্ডার, সামঞ্জস্যপূর্ণ-টাইপ এবং / অথবা কল কোড করার পরে গণনা পরিবর্তনের পরে প্যারামিটারগুলিতে অনিচ্ছাকৃত মানগুলি প্রতিরোধের গ্যারান্টি দেয় এটিই একমাত্র উপায় ,

    1.2। এটি প্যারামিটার অর্থ পরিবর্তনের পরে সেই সম্ভাবনাগুলি হ্রাস করে, কারণ নতুন অর্থের প্রতিফলিত সম্ভবত নতুন সনাক্তকারী নামটি যে মানটি দেওয়া হচ্ছে তার ঠিক পাশেই,

    1.3। এটি প্যারামিটারের জন্য কী প্রকাশ করা হচ্ছে তা দেখার জন্য কমাগুলি গণনা করা এবং কল থেকে স্বাক্ষরে ফিরে এবং পিছনে ঝাঁপ দাও এবং

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

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

(দ্রষ্টব্য: 1.2 কারণসমূহ এবং 1.3। প্রারম্ভিক কলগুলি কোডিং করার সময়ও কলগুলি কখন পড়তে হবে এবং / বা পরিবর্তন করতে হবে তা উল্লেখ না করার পরেও ত্রুটির সম্ভাবনা কমিয়ে আনা এবং হ্রাস করতে পারে))

এবং

  1. আরও ভাল পাঠযোগ্যতার জন্য এক - খেলোয়াড় - পার - লাইন

    2.1। এটি কম বিশৃঙ্খল, এবং

    2.2। এটি ডান এবং পিছনে বামে স্ক্রোল করা এড়ানো যায় না (এবং এটি করার জন্য পের - লাইন, যেহেতু বেশিরভাগ প্রাণীরা একাধিক লাইনের বাম অংশটি পড়তে পারে না, ডানদিকে স্ক্রোল করে এবং ডান অংশটি পড়তে পারে)।

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

দ্রষ্টব্য :

  1. ভেরিয়েবলগুলিতে পাস করা যাদের নামগুলি প্যারামিটারগুলি আয়না করে 'কখন সাহায্য করে না:

    1.1। আপনি লিটারাল কনস্ট্যান্টগুলিতে (যেমন একটি সাধারণ 0/1, মিথ্যা / সত্য বা নাল যা "" সেরা অনুশীলনগুলি "" এমনকি আপনার জন্য নামযুক্ত কনস্ট্যান্ট ব্যবহারের প্রয়োজন হতে পারে না এবং তাদের উদ্দেশ্যটি মেথডের নাম থেকে সহজেই অনুমান করা যায় না can't ),

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

    1.3। আপনি স্বাক্ষরে প্যারামিটারগুলি পুনরায় অর্ডার / প্রতিস্থাপন করছেন যা পূর্ববর্তী কলগুলি এখনও সংকলন করতে পারে কারণ প্রকারগুলি এখনও সামঞ্জস্যপূর্ণ হতে পারে।

  2. ভিএস এর মতো অটো-র‌্যাপ বৈশিষ্ট্য থাকা আমার উপরের যে 8 টি কারণ দিয়েছে তার মধ্যে কেবল একটি (# 2.2) মুছে ফেলা হয়। ভিএস 2015 এর শেষের দিকে, এটি অটো-ইনডেন্ট হয়নি (!? সত্যই, এমএস?!) যা তীব্রতা বাড়িয়ে তোলে # 2.1।

ভিএস-এর একটি বিকল্প থাকা উচিত যা নামকৃত প্যারামিটারগুলির সাথে মেথড কল স্নিপেট তৈরি করে (অবশ্যই প্রতিটি লাইনে একটি; পি) এবং একটি সংকলক বিকল্প যার জন্য নামকরণকৃত প্যারামিটারগুলি প্রয়োজন (ভিবিতে অপশন স্পষ্টরূপে অনুরূপ যা, বিটিডব্লিউ, একবারের প্রয়োজনটি ভেবেছিল সমানভাবে আপত্তিজনক তবে এখন "'সেরা অনুশীলনগুলি" "দ্বারা প্রিল প্রয়োজন required আসলে, " আমার ফিরেদিন ";), 1991 সালে আমার কেরিয়ারের ঠিক কয়েক মাস আগে, আমি নামকরণকৃত প্যারামিটারগুলির সাথে একটি ভাষা ব্যবহার করার আগে (বা এমনকি দেখেওছি), আমার কাছে অ্যান্টি-ভেস্টেল /" কেবল আপনি কিউজ করতে পারেন, মানে এই নয় যে আপনার উচিত " / অন্ধভাবে "রোস্টের প্রান্তগুলি কাটা" অর্থে এটির অনুকরণ করার পক্ষে যথেষ্ট নয় (ইন-লাইন মন্তব্য ব্যবহার করে) কাউকে এমনটি না দেখায় Para "নাম্বার প্যারামিটারগুলি ব্যবহার করতে হবে না (পাশাপাশি অন্যান্য সিনট্যাক্স যা" "মূল্যবান" সংরক্ষণ করে " সোর্স কোড কীস্ট্রোক) পাঞ্চ কার্ডের যুগের একটি প্রতীক, যখন এর বেশিরভাগ বাক্য গঠন শুরু হয়েছিল modern আধুনিক হার্ডওয়্যার এবং আইডিই এবং আরও জটিল সফ্টওয়্যার সহ এর জন্য কোনও অজুহাত নেই যেখানে পাঠযোগ্যতা অনেক বেশি, অনেক, অনেকবেশি গুরুত্বপূর্ণ. "কোড লেখার চেয়ে অনেক বেশি সময় পঠিত হয়"। যতক্ষণ না আপনি অ-অটো-আপডেট হওয়া কোডটির নকল করছেন না, ততক্ষণ কেউ (এমনকি নিজেও) পরে এটি পড়ার চেষ্টা করলে সংরক্ষণ করা প্রতিটি কীস্ট্রোকের তাত্পর্যপূর্ণভাবে আরও বেশি ব্যয় হতে পারে।


2
আমি বুঝতে পারছি না। কেন আপনি কেবল প্রয়োগ করতে পারবেন না যে সেখানে অন্তত একটি রয়েছে? এমনকি প্যারাম ছাড়াই আপনাকে যুক্তি nullবা new object[0]যুক্তি হতে বাধা দেওয়ার মতো কিছুই নেই ।
কেসি

Probablyচ্ছিক একের আগে প্রয়োজনীয় প্যারামিটারগুলি থাকা খুব সম্ভবত খুব বিপজ্জনক (যদি কলগুলি কোডিংয়ের পরে প্রয়োজনীয় এক বা একাধিক অপসারণ করা হয়)। এ কারণেই আমি neverচ্ছিক পরামিতিগুলির কোনও দস্তাবেজের নমুনা কোডের alচ্ছিক প্যারামিটারের আগে কখনও প্রয়োজনীয় পরামিতিগুলি দেখিনি seen BTW, এই প্রোগ্রামটিতে, সবচেয়ে নিরাপদ (এবং সবচেয়ে পাঠযোগ্য অনুশীলন) নামে পরামিতি মাধ্যমে পাস হয় (যা আমরা এখন কি করতে পারি এমনকি সি # ~ আমরা ভিবি মধ্যে পারা 2 দশক পর)। ভিএস-এর একটি বিকল্প থাকা উচিত যা নামযুক্ত পরামিতিগুলির সাথে পদ্ধতি কল স্নিপেট তৈরি করে (এবং প্রতি লাইনে 1 প্যারামিটার করে)।
টম

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

1
যাত্রা। আমি myMethodহিসাবে ঘোষণা void myMethod(int requiredInt, params int[] optionalInts)। আমি / অন্য কারো কোডের এক / আরো কল, অর্থাত myMethod(1), myMethod(1, 21), myMethod(1, 21, 22)। আমি myMethodহতে পরিবর্তন void myMethod(params int[] optionalInts)। এই সমস্ত কলগুলি এখনও কোনও ত্রুটি সহ সঙ্কলন করবে যদিও তাদের 1 ম প্যারামিটারগুলি ("1" এর) স্পষ্টভাবে optionalIntsপ্যারামিটারের 1 ম উপাদান হিসাবে পাস করার উদ্দেশ্যে নয় ।
টম

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

10

ওভারলোড পদ্ধতি তৈরি করার দরকার নেই, কেবল নীচের চিত্র অনুসারে প্যারামগুলির সাথে একটি পদ্ধতি ব্যবহার করুন

// Call params method with one to four integer constant parameters.
//
int sum0 = addTwoEach();
int sum1 = addTwoEach(1);
int sum2 = addTwoEach(1, 2);
int sum3 = addTwoEach(3, 3, 3);
int sum4 = addTwoEach(2, 2, 2, 2);

আপনার ইনপুটটির জন্য ধন্যবাদ তবে আমি মনে করি না যে এই ধরণের ওভারলোডগুলি যেহেতু paramsবা ছাড়া আমাদের সংগ্রহের কোনও গণনা কভার করার জন্য কোনও সংগ্রহের ধরণটি পাস করবে না কেননা এগুলি সমাধান হবে all
মাস্টারমাস্টিক

আপনি কিছুটা হলেও সঠিক তবে এটি কী শীতল করে তোলে তা হ'ল একটি ওভারলোড যা কোনও ইনপুট প্যারামিটার না থাকে যেমন int sum1 = addTwoEach ();
বৈদ্যুতিনবাহ

5

params এছাড়াও আপনাকে একক যুক্তি দিয়ে পদ্ধতিটি কল করতে দেয়।

private static int Foo(params int[] args) {
    int retVal = 0;
    Array.ForEach(args, (i) => retVal += i);
    return retVal;
}

অর্থাত্ Foo(1);পরিবর্তে Foo(new int[] { 1 });। সংক্ষিপ্ত ক্ষেত্রে শর্টহ্যান্ডের জন্য দরকারী হতে পারে যেখানে আপনাকে পুরো অ্যারের পরিবর্তে একক মান দিয়ে যেতে হবে। এটি এখনও পদ্ধতিতে একই পদ্ধতিতে পরিচালিত হয়, তবে এইভাবে কল করার জন্য কিছু ক্যান্ডি দেয়।


5

প্যারাম কীওয়ার্ড যুক্ত করে নিজেই দেখায় যে আপনি সেই পদ্ধতিটি কল করার সময় একাধিক সংখ্যক পরামিতি পাস করতে পারেন যা ব্যবহার না করেই সম্ভব নয়। আরো নির্দিষ্ট করা:

static public int addTwoEach(params int[] args)
{
    int sum = 0;

    foreach (var item in args)
    {
        sum += item + 2;
    }

    return sum;
}

আপনি যখন উপরের পদ্ধতিতে কল করবেন আপনি নীচের যে কোনও মাধ্যমে কল করতে পারেন:

  1. addTwoEach()
  2. addTwoEach(1)
  3. addTwoEach(new int[]{ 1, 2, 3, 4 })

তবে আপনি যখন উপরের কীওয়ার্ডগুলি মুছে ফেলবেন তখন উপরের তিনটি উপায়ে তৃতীয় উপায় ভাল কাজ করবে। 1 ম এবং 2 য় ক্ষেত্রে আপনি একটি ত্রুটি পাবেন।


0

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

public void ExampleMethod(params string[] args)
{
// do some stuff
}

কল:

ExampleMethod();

তারপরে। নেট ফ্রেমওয়ার্কের একটি নতুন সংস্করণ এটি করুন (নেট ফ্রেমওয়ার্ক 4.6 থেকে):

ExampleMethod(Array.Empty<string>());

এই Array.Emptyঅবজেক্টটি পরবর্তীতে ফ্রেমওয়ার্কের মাধ্যমে পুনরায় ব্যবহার করা যেতে পারে, তাই অতিরিক্ত কাজগুলি করার প্রয়োজন নেই। আপনি যখন এই পদ্ধতিটিকে এভাবে কল করবেন তখন এই বরাদ্দগুলি ঘটবে:

 ExampleMethod(new string[] {});

0

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


0

আরেকটি উদাহরণ

public IEnumerable<string> Tokenize(params string[] words)
{
  ...
}

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