সি # তে একটি মেথড গ্রুপ কী?


351

আমি প্রায়শই একটি ত্রুটির মুখোমুখি হয়েছি যেমন "" পদ্ধতি গ্রুপ থেকে "স্ট্রিং" তে রূপান্তর করতে পারে না "যেমন:

var list = new List<string>();
// ... snip
list.Add(someObject.ToString);

অবশ্যই শেষ লাইনে একটি টাইপো ছিল কারণ আমি পরে অনুরোধের প্রথম বন্ধনী ভুলে গিয়েছিলাম ToString। সঠিক ফর্মটি হ'ল:

var list = new List<string>();
// ... snip
list.Add(someObject.ToString()); // <- notice the parentheses

তবে আমি ভাবলাম যে একটি মেথড গ্রুপ কী। গুগল তেমন কোনও সাহায্য বা এমএসডিএন নয়


62
সি # 3.0 স্পেসিফিকেশনের 7.1 ধারাটি "পদ্ধতি গ্রুপ" সংজ্ঞায়িত করে।
এরিক লিপার্ট

2
কোনও পদ্ধতি কল করার সময় আপনি বন্ধনীগুলি বন্ধ করায় আমি এখন এই ত্রুটিটি পড়েছি ।
নিকো

2
আপনার যদি যথাযথ প্রতিনিধি প্রকারের তালিকা থাকে, যেমন var list = new List<Func<string>>();, তবে পদ্ধতি গোষ্ঠীটি ব্যবহারযোগ্য এবং list.Add(someObject.ToString);কাজ করতে পারত।
জেপ্পে স্টিগ নীলসেন

উত্তর:


332

একটি পদ্ধতি Group A- এর নাম পদ্ধতির সেট তত্ত্ব অর্থাত - (যে হতে পারে মাত্র এক) ToStringপদ্ধতি একাধিক overloads (প্লাস যেকোনো এক্সটেনশন পদ্ধতি) থাকতে পারে: ToString(), ToString(string format), ইত্যাদি - অত: পর ToStringনিজে একটি "পদ্ধতি গ্রুপ" হয়।

এটি সাধারণত ওভারলোড রেজোলিউশন ব্যবহার করে কোনও পদ্ধতি গ্রুপকে (টাইপ করা) প্রতিনিধিতে রূপান্তর করতে পারে - তবে কোনও স্ট্রিং ইত্যাদিতে নয়; এটা কোন মানে নেই।

একবার আপনি প্রথম বন্ধনী যুক্ত করুন, আবার; ওভারলোড রেজোলিউশন শুরু হয় এবং আপনি নির্বিঘ্নে একটি পদ্ধতি কল সনাক্ত করেছেন।


6
কোন পদ্ধতি গ্রুপের সাধারণ ব্যবহারগুলি কী হবে? যেহেতু (তাই আমি বুঝতে পেরেছি) এর একই নাম প্যারামিটার গণনা এবং / অথবা প্রকারগুলি পৃথক হবে। সুতরাং আপনি গ্রুপটি ব্যবহার করে মেথড গ্রুপ থেকে একাধিক পদ্ধতির আবেদন করতে পারবেন না।
আন্দ্রে রেনিয়া

32
এটি বিশুদ্ধরূপে "পদ্ধতির নাম কী তা আমি জানি তবে আমি স্বাক্ষর জানি না" এর একটি সংকলক শব্দ; রানটাইমের সময়ে এর কোনও অস্তিত্ব নেই। এএফআইএইকি, প্রতিনিধি নির্মানের সময় নিজেই কোনও পদ্ধতি-গোষ্ঠীর ব্যবহার (কোনও বন্ধনী ইত্যাদি নয়) is
মার্ক গ্র্যাভেল

20
ইসিএমএ 334v4 §14.1: একটি পদ্ধতি গোষ্ঠী একটি ডেলিগেট-ক্রিয়েশন-এক্সপ্রেশন (§14.5.10.3), বা স্পষ্টতভাবে একটি সামঞ্জস্যপূর্ণ প্রতিনিধি প্রকারে রূপান্তরিত একটি অনুরোধ-এক্সপ্রেশন (§14.5.5) এ ব্যবহার করা যেতে পারে। অন্য যে কোনও প্রসঙ্গে, একটি পদ্ধতি গ্রুপ হিসাবে শ্রেণীবদ্ধ একটি প্রকাশের ফলে একটি সংকলন-সময় ত্রুটি হয়।
মার্ক গ্র্যাভেল

1
পদ্ধতির গোষ্ঠীগুলির জন্য কোভারিয়েন্স এবং বৈপরীত্য সমর্থন প্রতিনিধি প্রকারের সাথে পদ্ধতির স্বাক্ষরের সাথে মিলে যায়। এটি আপনাকে প্রতিনিধিদের সাথে কেবলমাত্র মেইল ​​স্বাক্ষরকারী পদ্ধতিগুলিতেই নয় বরং আরও উদ্ভূত প্রকারের (covariance) ফেরত পাঠানোর পদ্ধতি বা প্রতিনিধি প্রকারের দ্বারা বর্ণিত ব্যবস্থাগুলির চেয়ে কম প্রাপ্ত উপকরণ (বিপরীতমুখী) পরামিতিগুলি গ্রহণ করার পদ্ধতিগুলি সরবরাহ করতে সক্ষম করে। আরও তথ্যের জন্য, প্রতিনিধিগুলিতে রূপান্তর (সি #) এবং প্রতিনিধিগুলিতে ভেরিয়েন্স ব্যবহার করে (সি #) দেখুন।
ব্যবহারকারী2211290

162

এছাড়াও, আপনি যদি লিনকিউ ব্যবহার করছেন তবে আপনি দৃশ্যত এমন কিছু করতে পারেন myList.Select(methodGroup)

সুতরাং, উদাহরণস্বরূপ, আমার আছে:

private string DoSomethingToMyString(string input)
{
    // blah
}

পরিবর্তনশীলকে এভাবে ব্যবহার করার জন্য স্পষ্টভাবে উল্লেখ করার পরিবর্তে:

public List<string> GetStringStuff()
{
    return something.getStringsFromSomewhere.Select(str => DoSomethingToMyString(str));
}

আমি কেবল ভেরির নাম বাদ দিতে পারি:

public List<string> GetStringStuff()
{
    return something.getStringsFromSomewhere.Select(DoSomethingToMyString);
}

112
রিশার্পারের একটি সুপারিশই আমাকে পদ্ধতি গোষ্ঠীর সন্ধান করতে পরিচালিত করেছিল। রিশার্পার আমার লিনাকের একটি অভিব্যক্তিটি এটাই শেষ করেছেন।
a_hardin

50
@ এ_হারদিন: রিসার্চ এফটিডাব্লু! আমি লিনকিউ সম্পর্কে অনেক কিছু শিখলাম রিশার্পারকে ধন্যবাদ।
জেসন ডাউন

3
"আরও সুস্পষ্ট" সংস্করণটি কেবলমাত্র অযথা নিরর্থক মোড়ক পদ্ধতি তৈরি করে। বেনামে মোড়ানো পদ্ধতি এবং ডোসোমিংথিংমাইস্ট্রিং উভয়ই একটি স্ট্রিং নেয় এবং একটি স্ট্রিং ফেরত দেয়। "টিআর => [...] (টিআরটি)" অক্ষরগুলি কেবল ক্রুফ্ট যা সংকলক আশা করি দূরে সরে যায়।
গ্রেট

6
সংকলক কিছুই অপ্টিমাইজ। ILDASM ব্যবহার করে, আপনি দেখতে পাচ্ছেন যে স্পষ্ট সংস্করণ একটি বেনাম পদ্ধতি তৈরি করে (ল্যাম্বডা বাস্তবায়ন) এবং এটি নির্বাচন করুন () এ পাস করে। অন্তর্নিহিত সংস্করণটি সরাসরি ডসোমিংথিংটমাইস্ট্রিংকে পাস করে।
রল্ফ

14
আমাকে return flag == true ? true : false(ফেসপাল) স্মরণ করিয়ে দেয় ।
এরিক

24

আপনি কোনও প্রতিনিধি হিসাবে কোনও পদ্ধতি গ্রুপ নিক্ষেপ করতে পারেন ।

প্রতিনিধি স্বাক্ষরটি গ্রুপের বাইরে 1 পদ্ধতি নির্বাচন করে।

এই উদাহরণটি ওভারলোডটিকে বেছে ToString()নেয় যা স্ট্রিং প্যারামিটার নেয়:

Func<string,string> fn = 123.ToString;
Console.WriteLine(fn("00000000"));

এই উদাহরণটি ওভারলোডটিকে বেছে ToString()নেয় যা কোনও পরামিতি নেয় না:

Func<string> fn = 123.ToString;
Console.WriteLine(fn());

21

আপনার এমএসডিএন অনুসন্ধানের প্রথম ফলাফলটি বলেছে:

পদ্ধতি গোষ্ঠীটি অনুরোধ করার জন্য একটি পদ্ধতি বা অতিরিক্ত লোড পদ্ধতিগুলির সেটকে চিহ্নিত করে যা থেকে অনুরোধ করার জন্য একটি নির্দিষ্ট পদ্ধতি চয়ন করতে হবে

আমার বোধগম্যতা মূলত এটি কারণ যখন আপনি কেবল লেখেন someInteger.ToString, এটি উল্লেখ করতে পারে:

Int32.ToString(IFormatProvider) 

বা এটি উল্লেখ করতে পারেন:

Int32.ToString()

সুতরাং এটি একটি পদ্ধতি গ্রুপ বলা হয়।


18

ToStringফাংশন অনেক overloads আছে - পদ্ধতি গ্রুপ ফাংশন জন্য সব বিভিন্ন overloads গঠিত গ্রুপ হবে।


2
হ্যাঁ, এবং মুল বক্তব্যটি হ'ল একটি মেথড গ্রুপ হ'ল একটি সংকলন-সময় গঠন। সংকলক বার্তা গোষ্ঠীটি ব্যবহৃত হয় সেই প্রসঙ্গে অনুসারে একটি পদ্ধতি ওভারলোড চয়ন করে। উদাহরণস্বরূপ: আপনি "var x = Foo" লিখতে পারবেন না; (যেখানে ফু একটি পদ্ধতি গোষ্ঠী), কেবলমাত্র একটি ওভারলোড থাকলেও সংকলক এটিকে প্রত্যাখ্যান করে।
রল্ফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.