সি # পদ্ধতিটি সীমাহীন প্যারামের সাথে বা অ্যারে বা তালিকার সাথে পদ্ধতি?


21

আমি সম্প্রতি শিখেছি যে আপনি সীমাহীন পরামিতিগুলি সহ কিছু পদ্ধতি তৈরি করতে পারেন, উদাহরণস্বরূপ:

SomeMethod(params int[] numbers);

তবে আমার প্রশ্নটি হল, এর মধ্যে পার্থক্য কী এবং কেবল একটি পদ্ধতি তৈরি করে যা একটি তালিকা বা অ্যারে গ্রহণ করে?

SomeMethod(int[] numbers);
SomeMethod(List<int> numbers);

পারফরম্যান্সে সম্ভবত কিছুটা প্রভাব ফেলেছে? আপনি সীমাহীন পরামিতিগুলির সাথে কোনটি পছন্দ করবেন তা আমি পুরোপুরি বুঝতে বা দেখতে পাই না।

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


: এই চেহারা stackoverflow.com/questions/434761/...
Mr.AF

নীচের আমার উত্তর ছাড়াও, paramsএছাড়াও প্রয়োজন যুক্তি ধরণ একটি অ্যারের যাবে। আপনার যদি অ্যারে ব্যতীত অন্য কোনও সংগ্রহ গ্রাস করতে হয় তবে তার paramsপরিবর্তে অ- যুক্তি সরবরাহ করা আরও অর্থপূর্ণ হতে পারে ।
ডিজিটালওয়ার্ড

1
@ ডিজিটালওয়ার্ল্ড: এই বিষয়টি যদি আপনার আগ্রহী হয় তবে আলোচনার জন্য github.com/dotnet/csharplang/issues/179 দেখুন ।
এরিক লিপার্ট

এর স্বাক্ষর এবং / বা বাস্তবায়ন দেখুন Console.Write
ডিভে

উত্তর:


27

এর মধ্যে পার্থক্য কী এবং কেবল একটি পদ্ধতি তৈরি করে যা একটি তালিকা বা অ্যারে পায়?

দুইটার মধ্যে পার্থক্য

void M(params int[] x)

এবং

void N(int[] x)

এমকে কি এভাবে ডাকা যেতে পারে:

M(1, 2, 3)

বা এই মত:

M(new int[] { 1, 2, 3 });

তবে এনকে প্রথম উপায়ে নয়, কেবল দ্বিতীয় উপায়ে কল করা যেতে পারে ।

পারফরম্যান্সে সম্ভবত কিছুটা প্রভাব ফেলেছে?

পারফরম্যান্সের প্রভাবটি হ'ল আপনি Mপ্রথম উপায়ে বা দ্বিতীয় উপায়ে কল করুন, যেভাবেই আপনি অ্যারে তৈরি করেছেন। একটি অ্যারে তৈরির একটি কার্যকারিতা প্রভাব রয়েছে কারণ এতে সময় এবং মেমরি উভয়ই লাগে। মনে রাখবেন যে পারফরম্যান্সের প্রভাবগুলি পারফরম্যান্স লক্ষ্যগুলির বিরুদ্ধে পরিমাপ করা উচিত; এটি অতিরিক্ত সম্ভাব্য অ্যারে তৈরির ব্যয়টি গেটিং ফ্যাক্টর যা বাজারের সাফল্য এবং ব্যর্থতার মধ্যে পার্থক্য unlikely

আপনি সীমাহীন পরামিতিগুলির সাথে কোনটি পছন্দ করবেন তা আমি পুরোপুরি বুঝতে বা দেখতে পাই না।

কোডটির লেখক যে পদ্ধতিটি কল করছেন এটি বিশুদ্ধ এবং সম্পূর্ণরূপে একটি সুবিধা; এটি সহজভাবে খাটো এবং লিখতে সহজ

M(1, 2, 3);

পরিবর্তে লেখার

M(new int[] { 1, 2, 3 });

এটি কেবল কলারের পক্ষের কয়েকটি কীস্ট্রোক সংরক্ষণ করে। এটাই সব।

কয়েকটি প্রশ্ন আপনি জিজ্ঞাসা করেননি তবে সম্ভবত এর উত্তরটি জানতে চান:

এই বৈশিষ্ট্যটি কী বলা হয়?

যে পদ্ধতিগুলি কলার দিকে ভেরিয়েবল সংখ্যার তর্কগুলি পাস করার অনুমতি দেয় তাদের ভেরিয়াদিক বলে । প্যারাম পদ্ধতিগুলি কীভাবে সি # বিচিত্র পদ্ধতিগুলি প্রয়োগ করে।

ওভারলোড রেজোলিউশন কীভাবে একটি বৈকল্পিক পদ্ধতিতে কাজ করে?

যখন ওভারলোড রেজোলিউশন সমস্যার মুখোমুখি হয়, সি # দুটি "স্বাভাবিক" এবং "বর্ধিত" ফর্ম বিবেচনা করে এবং উভয় প্রযোজ্য হলে "স্বাভাবিক" ফর্মটি সর্বদা জয়ী হয়। উদাহরণস্বরূপ, এটি বিবেচনা করুন:

void P(params object[] x){}

এবং আমাদের একটি কল আছে

P(null);

দুটি কার্যকর সম্ভাবনা আছে। "সাধারণ" ফর্মে আমরা Pঅ্যারেটির জন্য একটি নাল রেফারেন্স কল করি এবং পাস করি । "প্রসারিত" আকারে, আমরা কল করি P(new object[] { null })। এই ক্ষেত্রে, স্বাভাবিক ফর্ম জয়ী। আমাদের যদি কোনও কল ছিল P(null, null)তবে স্বাভাবিক ফর্মটি প্রয়োগযোগ্য নয় এবং ফর্মটি ডিফল্টরূপে জিতে যায়।

চ্যালেঞ্জ : ধরুন আমাদের কাছে var s = new[] { "hello" };একটি কল আছে P(s);। কল সাইটে কী ঘটে এবং কেন তা বর্ণনা করুন। আপনি অবাক হতে পারেন!

চ্যালেঞ্জ : ধরুন আমরা উভয় আছে void P(object x){}এবং void P(params object[] x){}। কি করে P(null)এবং কেন?

চ্যালেঞ্জ : ধরুন আমরা উভয় আছে void M(string x){}এবং void M(params string[] x){}। কি করে M(null)এবং কেন? এটি আগের মামলার থেকে কীভাবে আলাদা?


সি 2: P(null)বনাম P((object)null)বনাম P((object[])null)- এই পার্থক্যের জন্য আমি কোথায় ব্যাখ্যা পেতে পারি? এটা তোলে মতানুযায়ী মত nullকিছু ছিল বিশেষ ধরনের , যা অ্যারের বদলে বস্তু (পরিবর্তিত P(null)), কিন্তু স্ট্রিং বা দ্ব্যর্থক স্ট্রিং (অ্যারে রূপান্তর এটি M(null)) ... যা খুবই অদ্ভুত মতানুযায়ী, তবে হয় এটি উভয় ক্ষেত্রেই দ্ব্যর্থক হতে পারে অথবা বাছাই আশা একক-আরগ সংস্করণ (যা এটি না)। তবে আমি অনুমান করি যে এটি সি ++ টেমপ্লেটগুলিতে সর্বজনীন রেফারেন্স ( ) এর মতো paramsকোনওরকম জেনেরিক হওয়া &&এবং আরও ভাল ম্যাচ (Ch2 এ, Ch3 তে নয়) সম্পর্কে আরও বেশি।
ফিরদা

@ ফিরদা: আপনি সি # স্পেসিফিকেশনে ব্যাখ্যাটি খুঁজে পেতে পারেন। অদ্ভুততার কারণ হ'ল: নালটি অবজেক্ট, স্ট্রিং, অবজেক্ট [] এবং স্ট্রিং [] এ রূপান্তরিত। সুতরাং প্রশ্নটি ওভারলোড রেজোলিউশনে উত্থাপিত হয়: কোন রূপান্তরটি সেরা ? এই ক্ষেত্রে নিয়ন্ত্রণের নিয়মটি সুনির্দিষ্ট থেকে সাধারণের চেয়ে ভাল । কোন ধরণের আরও সুনির্দিষ্ট আমরা কীভাবে বলতে পারি? নিয়মটি হ'ল: সমস্ত জিরাফ প্রাণী হয় তবে সমস্ত প্রাণী জিরাফ হয় না, তাই, প্রাণীর চেয়ে জিরাফ আরও নির্দিষ্ট। সকল object[]হয় object, কিন্তু সব না objectহয় object[], সেইজন্য object[]আরো নির্দিষ্ট।
এরিক লিপার্ট

@ ফিরদা: এখন আপনি জানেন যে স্ট্রিংগুলি অস্পষ্ট। এটি সত্য নয় যে "সবই string[]আছে string"। বস্তুত কোন string[]হয় stringএবং কোন stringহয় string[], তাই stringআরো নির্দিষ্ট বা চেয়ে আরও সাধারণ নয় string[], এবং যখন চয়ন করতে বলা আমরা একটি দ্ব্যর্থতা ভুল পান।
এরিক লিপার্ট

সকল object[]হয় object... object[]আরো নির্দিষ্ট তাই P(null)যে আমি কি অনুপস্থিত ছিল, আরো নির্দিষ্ট এরে, ধন্যবা জন্য যায়। এখানে কিছু নিয়ম পাওয়া গেছে: ডকস.মাইক্রোসফট
us

5

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

তদ্ব্যতীত, কল সাইটে উত্পন্ন আইএলটি নিজেই ঘোষিত new int[]পদ্ধতিটিকে কল করে এবং কেবল paramsযুক্তি ব্যবহার করে পদ্ধতিটি কল করার মধ্যে আমার মধ্যে একই ছিল ।

সুতরাং, উত্তরটি "সুবিধা" বলে মনে হচ্ছে। পারফরম্যান্সে কোনও পার্থক্য বলে মনে হচ্ছে না। পরিবর্তে আপনি paramsএকটি অ্যারের সাথে একটি ফাংশনও কল করতে পারেন , সুতরাং এটি মারাত্মক অবাক হওয়ার মতোও নয়। আপনার পদ্ধতির গ্রাহকের someMethod(1, 2, 3)পক্ষে সর্বদা কোনও সংগ্রহ তৈরি করার আগে (যেমন ) তুলনায় এটি কোনও সংখ্যক প্যারামিটার (উদাহরণস্বরূপ ) দিয়ে কল করা সহজ হয়ে যায় someMethod(new List<int>() { 1, 2, 3 } )


4

সীমাহীন পরামিতিগুলির বৈশিষ্ট্যটি অনেক পরিস্থিতিতে নিম্নলিখিত বেনিফিটগুলি সরবরাহ করে:

  1. আলগা সংযোজন
  2. বর্ধিত পুনঃব্যবহারযোগ্যতা
  3. আবেদনের আরও ভাল সামগ্রিক কর্মক্ষমতা

এখানে একটি উদাহরণ যেখানে সীমাহীন পরামিতি বিকল্পটি দুর্দান্ত পছন্দ

ইমেল প্রেরণের জন্য একটি অ্যাপ্লিকেশন তৈরি করা দরকার তা বিবেচনা করুন।

ইমেল প্রেরণকারী ফাংশনটি অবশ্যই 'টু', 'সিসি' এবং 'বিসিসি' ক্ষেত্রের জন্য একক বা একাধিক মানকে পরিচালনা করতে সক্ষম হবে।

সমস্ত ক্ষেত্রের জন্য (যদি, সিসি, বিসিসি) বিভিন্ন ধরণের প্যারামিটারগুলি অ্যারে বা তালিকা হিসাবে নির্ধারণ করা হয়, তবে কলিং ফাংশনটি ইমেল প্রেরকের ক্রিয়াকলাপটি কল করার জন্য 3 অ্যারে বা তালিকাগুলি নির্ধারণের সমস্ত জটিলতা মোকাবেলা করতে বাধ্য হবে ।

এমনকি যদি কলার কেবল একটি ঠিকানায় ইমেল প্রেরণ করতে চান, ইমেল প্রেরক ফাংশন কলারকে পরামিতি হিসাবে 3 টি বিভিন্ন অ্যারে সংজ্ঞা দিতে এবং প্রেরণে বাধ্য করবে।

যদি ইমেল প্রেরক ফাংশনটি সীমাহীন প্যারামগুলিকে গ্রহণ করে, তবে কলার ফাংশনটি সমস্ত জটিলতার সাথে মোকাবিলা করার দরকার নেই।

সীমাহীন পরামিতিগুলির পদ্ধতির প্রয়োজন অনুসারে যেখানে অ্যারে বা তালিকাগুলি তৈরি করা এড়িয়ে অ্যাপ্লিকেশনটির ভাল রানটাইম পারফরম্যান্সে অবদান রাখে।


2

একটি অ-পারফরম্যান্স , শৈলীর দৃষ্টিকোণ থেকে, paramsআপনি যখন প্যারামিটারগুলির alচ্ছিক তালিকাটি প্রেরণ করতে চান তখন কীওয়ার্ডটি আসলেই খুব সুন্দর।

ব্যক্তিগতভাবে, আমি paramsযখন আমার কোডটির মতো ছিলাম তখন আমি ব্যবহার করব

SomeMethod('Option1', 'Option17');

void SomeMethod(params string[] options)
{
    foreach(var option in options)
    {
        switch(option): ...
    }
}

এ সম্পর্কে দুর্দান্ত অংশটি হ'ল আমি প্রতি বারে অ্যারে তৈরি বা তালিকা তৈরি না করেই এই পদ্ধতিটি পুরো জায়গা জুড়ে ব্যবহার করতে পারি।

আমি ব্যবহার করব arrayবা listযখন আমি জানি আমি সবসময় এই ফাংশনটি পাস করব যা ইতিমধ্যে একসাথে রাখা ডেটার একটি সেট

List<User> users = GetUsersFromDB();
SomeMethod(users);

আমি paramsএটি যোগ করার নমনীয়তার মধ্যে সুবিধা দেখতে পাচ্ছি । এটি আপনার কোডের তুলনামূলকভাবে সামান্য প্রভাব হতে পারে তবে এটি এখনও একটি দুর্দান্ত সরঞ্জাম।


1

কলিং কনভেনশন আলাদা। উদাহরণ স্বরূপ ...

public class Test
{
    public void Method1( params int[] nums )
    {
        nums.ToList().ForEach( n => Console.WriteLine(n) );
    }

    public void Method2( List<int> nums )
    {
        nums.ForEach( n  => Console.WriteLine(n) );
    }   
}

void Main()
{   
    var t = new Test();
    t.Method1( 1, 2, 3, 4 );
    t.Method2( new List<int>() { 1, 2, 3, 4 } );
}

প্রথম ক্ষেত্রে, আপনি পদ্ধতিতে পৃথক প্যারামিটার হিসাবে অনেকগুলি কালি পাস করতে পারেন। দ্বিতীয়টিতে, আপনাকে একটি তালিকা তাত্ক্ষণিকভাবে পাস করতে হবে এবং এটি পাস করতে হবে।

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