সি # ব্যবহার করে প্যারামিটার হিসাবে পাস পদ্ধতি


694

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

public int Method1(string)
{
    ... do something
    return myInt;
}

public int Method2(string)
{
    ... do something different
    return myInt;
}

public bool RunTheMethod([Method Name passed in here] myMethodName)
{
    ... do stuff
    int i = myMethodName("My String");
    ... do more stuff
    return true;
}

public bool Test()
{
    return RunTheMethod(Method1);
}

এই কোডটি কাজ করে না তবে এটি করার চেষ্টা করছি। প্যারামিটারটি সংজ্ঞায়িত করার পরে আমি কীভাবে रनটেমথোড কোডটি লিখব তা আমি বুঝতে পারি না।


12
কেন আপনি পদ্ধতির নামের পরিবর্তে কোনও প্রতিনিধি পাস করেন না?
মার্ক বাইয়ার্স

উত্তর:


852

আপনি আপনার রানওমেথোদ পদ্ধতিতে প্যারামিটার হিসাবে। নেট 3.5 এ ফানক প্রতিনিধি ব্যবহার করতে পারেন। ফানক প্রতিনিধি আপনাকে এমন একটি পদ্ধতি নির্দিষ্ট করতে অনুমতি দেয় যা নির্দিষ্ট ধরণের কয়েকটি পরামিতি নেয় এবং নির্দিষ্ট ধরণের একক যুক্তি প্রদান করে returns এখানে কাজ করা উচিত এমন একটি উদাহরণ:

public class Class1
{
    public int Method1(string input)
    {
        //... do something
        return 0;
    }

    public int Method2(string input)
    {
        //... do something different
        return 1;
    }

    public bool RunTheMethod(Func<string, int> myMethodName)
    {
        //... do stuff
        int i = myMethodName("My String");
        //... do more stuff
        return true;
    }

    public bool Test()
    {
        return RunTheMethod(Method1);
    }
}

51
পদ্ধতিটিতে যদি শূন্যতা ফিরে না আসার স্বাক্ষর এবং কোনও প্যারামিটার না থাকে তবে কীভাবে ফানক কল পরিবর্তন হবে? আমি সিনট্যাক্সটি কাজ করতে পারি বলে মনে হচ্ছে না।
ব্যবহারকারী31673

210
@ অজানা: সেক্ষেত্রে এটি Actionপরিবর্তে হবে Func<string, int>
জন স্কিটি

12
তবে এখন আপনি যদি পদ্ধতিটিতে তর্ক করতে চান তবে ??
জন কেটজিক

40
@ user396483 উদাহরণস্বরূপ, Action<int,string>এমন একটি পদ্ধতির সাথে সামঞ্জস্য হয় যা 2 টি প্যারামিটার গ্রহণ করছে (int এবং স্ট্রিং) এবং শূন্য ফিরে আসছে।
সার্দার

24
@ নয়েল উইডমার ব্যবহার Func<double,string,int>এমন একটি পদ্ধতির সাথে সামঞ্জস্য করে যা 2 টি পরামিতি ( doubleএবং string) নেয় এবং ফিরে আসে int। শেষ নির্দিষ্ট টাইপ হ'ল রিটার্ন টাইপ। আপনি এই প্রতিনিধিটি 16 পরামিতি পর্যন্ত ব্যবহার করতে পারেন। আপনার যদি কোনওরকম আরও প্রয়োজন হয় তবে নিজের প্রতিনিধি হিসাবে লিখুন public delegate TResult Func<in T1, in T2, (as many arguments as you want), in Tn, out TResult>(T1 arg1, T2 arg2, ..., Tn argn);। আমি ভুল বুঝে থাকলে আমাকে সংশোধন করুন।
সার্দার

356

আপনার একটি প্রতিনিধি ব্যবহার করা দরকার । এই ক্ষেত্রে আপনার সমস্ত পদ্ধতি একটি stringপ্যারামিটার নেয় এবং একটি ফিরিয়ে দেয় int- এটি Func<string, int>ডেলিগেট 1 দ্বারা সর্বাধিক সহজভাবে প্রতিনিধিত্ব করা হয় । সুতরাং আপনার কোডটি এর মতো সাধারণ পরিবর্তনের সাথে সঠিক হতে পারে:

public bool RunTheMethod(Func<string, int> myMethodName)
{
    // ... do stuff
    int i = myMethodName("My String");
    // ... do more stuff
    return true;
}

ডেলিগেটস এর চেয়ে অনেক বেশি শক্তি আছে, স্বীকারোক্তি দিয়ে। উদাহরণস্বরূপ, সি # এর মাধ্যমে আপনি ল্যাম্বডা এক্সপ্রেশন থেকে একটি প্রতিনিধি তৈরি করতে পারেন , যাতে আপনি আপনার পদ্ধতিটি এভাবে চালিয়ে যেতে পারেন :

RunTheMethod(x => x.Length);

এটি এর মতো একটি বেনামি কার্য তৈরি করবে:

// The <> in the name make it "unspeakable" - you can't refer to this method directly
// in your own code.
private static int <>_HiddenMethod_<>(string x)
{
    return x.Length;
}

এবং তারপরে সেই প্রতিনিধিটিকে RunTheMethodপদ্ধতিতে পাস করুন ।

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


1 এটি কেবল Func<T, TResult>ফ্রেমওয়ার্কে জেনেরিক প্রতিনিধি প্রকারের ভিত্তিতে ; আপনি সহজেই নিজের ঘোষণা করতে পারেন:

public delegate int MyDelegateType(string value)

এবং তার MyDelegateTypeপরিবর্তে প্যারামিটারটি টাইপ করুন।


58
+1 এটি দু'মিনিটের মধ্যে ছড়িয়ে ছিটিয়ে যাওয়ার জন্য একটি আশ্চর্যজনক উত্তর।
ডেভিড হল

3
আপনি প্রতিনিধিদের ব্যবহার করে ফাংশনটি পাস করতে পারার সময় কৌশলটির নিদর্শনটি ব্যবহার করার জন্য আরও একটি traditionalতিহ্যবাহী ওও পদ্ধতির বিকল্প হবে।
পাওলো

20
@ পাওলো: প্রতিনিধিরা কৌশল প্যাটার্নটির কেবল খুব সুবিধাজনক বাস্তবায়ন যেখানে প্রশ্নে কৌশলটিতে কেবল একটি পদ্ধতি প্রয়োজন। এটি কৌশল প্যাটার্নের বিরুদ্ধে চলেছে এমন নয় - তবে এটি ইন্টারফেস ব্যবহার করে প্যাটার্নটি প্রয়োগের চেয়ে অনেক বেশি সুবিধাজনক a
জন স্কিটি

5
"ক্লাসিক" প্রতিনিধিরা (যেমন নেট থেকে 1/2 হিসাবে পরিচিত) এখনও দরকারী, বা তারা ফানক / অ্যাকশনের কারণে সম্পূর্ণ অপ্রচলিত? এছাড়াও, আপনার উদাহরণটিতে কোনও প্রতিনিধি কীওয়ার্ড নেই public **delegate** int MyDelegateType(string value)?
এম

1
@ মার্টিন: দোহ! ঠিক করার জন্য ধন্যবাদ। সম্পাদনা করা হয়েছে। আপনার নিজস্ব প্রতিনিধি হিসাবে ঘোষণা করার জন্য - প্রকারটির নামটির কিছু অর্থ দেওয়ার জন্য এটি দরকারী হতে পারে, তবে .NET 3.5 থেকে আমি খুব কমই আমার নিজস্ব প্রতিনিধি প্রকারটি তৈরি করেছি।
জন স্কিটি

112

ওপির উদাহরণ থেকে:

 public static int Method1(string mystring)
 {
      return 1;
 }

 public static int Method2(string mystring)
 {
     return 2;
 }

আপনি অ্যাকশন প্রতিনিধি চেষ্টা করতে পারেন! এবং তারপরে আপনার পদ্ধতিটি কল করুন

 public bool RunTheMethod(Action myMethodName)
 {
      myMethodName();   // note: the return value got discarded
      return true;
 }

RunTheMethod(() => Method1("MyString1"));

অথবা

public static object InvokeMethod(Delegate method, params object[] args)
{
     return method.DynamicInvoke(args);
}

তারপরে সহজ পদ্ধতিতে কল করুন

Console.WriteLine(InvokeMethod(new Func<string,int>(Method1), "MyString1"));

Console.WriteLine(InvokeMethod(new Func<string, int>(Method2), "MyString2"));

4
ধন্যবাদ, এটি আমাকে পেয়েছিল যেখানে আমি যেতে চেয়েছিলাম যেহেতু আমি আরও জেনেরিক "রানটেমথোড" পদ্ধতি চেয়েছিলাম যা একাধিক পরামিতিগুলির অনুমতি দেয়। এর পরিবর্তে আপনার প্রথম InvokeMethodল্যাম্বদা কলটি হওয়া উচিতRunTheMethod
জন

1
জন এর মতো, এটি আমাকে সত্যিই জেনেরিক পদক্ষেপে যেতে সহায়তা করেছিল। ধন্যবাদ!
ean5533

2
আপনি আমার দিন তৈরি করেছেন;) ব্যবহার করা সত্যই সহজ এবং নির্বাচিত উত্তর আইএমওর চেয়ে অনেক বেশি নমনীয়।
Sidewinder94

রানটেমথোড (() => পদ্ধতি 1 ("মাইস্ট্রিং 1")) এ প্রসারিত করার কোনও উপায় আছে; একটি ফেরতের মান পুনরুদ্ধার করতে? আদর্শভাবে জেনেরিক?
জে

যদি আপনি পাস করতে চান পরামিতি এই সচেতন হতে: stackoverflow.com/a/5414539/2736039
Ultimo_m

31
public static T Runner<T>(Func<T> funcToRun)
{
    //Do stuff before running function as normal
    return funcToRun();
}

ব্যবহার:

var ReturnValue = Runner(() => GetUser(99));

6
এটি খুব ব্যবহারকারীভাবে। এইভাবে, এক বা একাধিক পরামিতি ব্যবহার করতে পারেন। আমার ধারণা, সর্বাধিক আপডেট হওয়া উত্তরটি এটি।
বাফসার

আমি এই বাস্তবায়ন সম্পর্কে একটি জিনিস যোগ করতে চাই। আপনি যে পদ্ধতিটি পাস করতে চলেছেন তাতে যদি রিটার্নের প্রকারের শূন্যতা থাকে তবে আপনি এই সমাধানটি ব্যবহার করতে পারবেন না।
ইমান্টস ভোলকভস

@ ইমান্টস ভলকোভস আমি বিশ্বাস করি আপনি ফানকের পরিবর্তে অ্যাকশন ব্যবহার করতে এটি পরিবর্তন করতে পারবেন এবং স্বাক্ষরটি শূন্য করে দিতে পারেন। যদিও 100% নিশ্চিত নয়।
শকওয়েভ

2
যে প্যারামিটারগুলি বলা হয় তাতে পাস করার কোনও উপায় আছে কি?
জিমি

16

সম্ভাব্য সমাধান হিসাবে সম্পূর্ণরূপে ভাগ করে নেওয়ার জন্য, আমি তিনটি ভিন্ন উপায়ে উপস্থাপন করে শেষ করতে চলেছি, তবে এখন আমি সবচেয়ে প্রাথমিক নীতিটি থেকে শুরু করব।


একটি সংক্ষিপ্ত ভূমিকা

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


প্রতিনিধি কী?

একটি প্রতিনিধি একটি পদ্ধতির পয়েন্টার উপস্থাপন করে। যেমন আমি উপরে বলেছি, একটি পদ্ধতির কোনও মূল্য নেই, তাই সিএলআর ভাষাগুলিতে একটি বিশেষ শ্রেণি রয়েছে Delegate, যা কোনও পদ্ধতিকে গুটিয়ে রাখে।

নিম্নলিখিত উদাহরণটি দেখুন:

static void MyMethod()
{
    Console.WriteLine("I was called by the Delegate special class!");
}

static void CallAnyMethod(Delegate yourMethod)
{
    yourMethod.DynamicInvoke(new object[] { /*Array of arguments to pass*/ });
}

static void Main()
{
    CallAnyMethod(MyMethod);
}

তিনটি ভিন্ন উপায়, একই ধারণা পিছনে:

  • উপায় 1 উপরের উদাহরণ হিসাবে সরাসরি বিশেষ শ্রেণিটি
    ব্যবহার করুন Delegate। এই সমাধানটির সমস্যাটি হ'ল পদ্ধতির সংজ্ঞায়নের ধরণগুলিতে সীমাবদ্ধ না রেখে আপনার আর্গুমেন্টগুলি গতিশীলভাবে পাস করার সাথে সাথে আপনার কোডটি চেক করা হবে না।

  • উপায় 2 বিশেষ শ্রেণীর
    পাশাপাশি Delegate, প্রতিনিধি ধারণাটি কাস্টম প্রতিনিধিগুলিতে ছড়িয়ে পড়ে, যা মূলশব্দের পূর্ববর্তী পদ্ধতির সংজ্ঞা delegateএবং তারা সাধারণ পদ্ধতির মতোই আচরণ করে। সেগুলি এর মাধ্যমে চেক করা হয়েছে, সুতরাং আপনি নির্দ্বিধায় নিরাপদ কোড নিয়ে আসবেন।

    এখানে একটি উদাহরণ:

    delegate void PrintDelegate(string prompt);
    
    static void PrintSomewhere(PrintDelegate print, string prompt)
    {
        print(prompt);
    }
    
    static void PrintOnConsole(string prompt)
    {
        Console.WriteLine(prompt);
    }
    
    static void PrintOnScreen(string prompt)
    {
        MessageBox.Show(prompt);
    }
    
    static void Main()
    {
        PrintSomewhere(PrintOnConsole, "Press a key to get a message");
        Console.Read();
        PrintSomewhere(PrintOnScreen, "Hello world");
    }
  • ওয়ে 3
    বিকল্পভাবে, আপনি এমন একটি প্রতিনিধি ব্যবহার করতে পারেন যা ইতিমধ্যে। নেট স্ট্যান্ডার্ডের মধ্যে সংজ্ঞায়িত করা হয়েছে:

    • Actionvoidকোনও যুক্তি ছাড়াই একটি মোড়ানো
    • Action<T1>voidএকটি যুক্তি দিয়ে মোড়কে দেয় ।
    • Action<T1, T2>voidদুটি আর্গুমেন্ট সহ একটি জড়িয়ে দেয়।
    • এবং আরও ...
    • Func<TR>TRরিটার্ন টাইপ এবং কোনও যুক্তি ছাড়াই একটি ফাংশন জড়িয়ে দেয় ।
    • Func<T1, TR>TRরিটার্ন টাইপ এবং একটি যুক্তি দিয়ে একটি ফাংশন জড়িয়ে দেয় ।
    • Func<T1, T2, TR>TRরিটার্ন টাইপ এবং দুটি যুক্তি সহ একটি ফাংশন জড়িয়ে দেয় ।
    • এবং আরও ...

(পরবর্তী সমাধানটি সর্বাধিক লোকেরা পোস্ট করেছেন))


1
ফানক <T> এর রিটার্ন টাইপটি শেষ হওয়া উচিত নয়? Func<T1,T2,TR>
sanmcp

13

আপনার একটি Func<string, int>প্রতিনিধি ব্যবহার করা উচিত , এটি একটি ফাংশনকে stringযুক্তি হিসাবে গ্রহণ করে এবং ফেরত দেয় int:

public bool RunTheMethod(Func<string, int> myMethod) {
    // do stuff
    myMethod.Invoke("My String");
    // do stuff
    return true;
}

তারপরে এটি ব্যবহার করুন:

public bool Test() {
    return RunTheMethod(Method1);
}

3
এটি সংকলন করবে না। Testপদ্ধতি হওয়া উচিতreturn RunTheMethod(Method1);
pswg

7

আপনি যদি রান পদ্ধতিতে কোন পদ্ধতিটি পরিবর্তন করার ক্ষমতা চান তবে আমি একটি প্রতিনিধি ব্যবহারের পরামর্শ দেব: http://www.codeproject.com/KB/cs/delegates_step1.aspx

এটি আপনাকে কল করার জন্য পদ্ধতিটি সংরক্ষণ করার জন্য একটি অবজেক্ট তৈরি করার অনুমতি দেবে এবং এটি যখন প্রয়োজন হয় তখন আপনার অন্যান্য পদ্ধতিতে এটি সরবরাহ করতে পারে।


2

গৃহীত উত্তরটি একদম সঠিক হলেও আমি একটি অতিরিক্ত পদ্ধতি সরবরাহ করতে চাই।

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

সমাধানটি, যত সহজ শোনার পরে আপনি এটি বুঝতে পেরেছিলেন, ততক্ষণ আমাকে এড়িয়ে চলেছে।

আপনার প্রতিটি পদ্ধতির জন্য পৃথক ক্লাস তৈরি করুন, যদি আপনার প্রয়োজন হয় তবে বেস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত এবং প্রতিটিটিতে ইভেন্ট হ্যান্ডলার যুক্ত করুন।


1

এখানে একটি উদাহরণ রয়েছে যা প্যারামিটার হিসাবে কোনও ফাংশন কীভাবে পাস করতে পারে তা বুঝতে আপনাকে আরও সহায়তা করতে পারে।

ধরুন আপনার প্যারেন্ট পেজ আছে এবং আপনি চাইল্ড পপআপ উইন্ডো খুলতে চান। মূল পৃষ্ঠায় একটি পাঠ্যবাক্স রয়েছে যা চাইল্ড পপআপ পাঠ্যবাক্সের ভিত্তিতে পূরণ করা উচিত।

এখানে আপনার একটি প্রতিনিধি তৈরি করা প্রয়োজন।

প্যারেন্ট সি। সি / // প্রতিনিধিদের পাবলিক ডেলিগেটের বাতিল ফিলন নেম (স্ট্রিং ফার্স্ট নেম) এর ঘোষণা;

এখন এমন একটি ফাংশন তৈরি করুন যা আপনার পাঠ্যবক্সটি পূরণ করবে এবং ফাংশনটি প্রতিনিধিদের মানচিত্র করা উচিত

//parameters
public void Getname(String ThisName)
{
     txtname.Text=ThisName;
}

এখন বাটনে ক্লিক করে আপনার একটি শিশু পপআপ উইন্ডো খুলতে হবে।

  private void button1_Click(object sender, RoutedEventArgs e)
  {
        ChildPopUp p = new ChildPopUp (Getname) //pass function name in its constructor

         p.Show();

    }

চাইল্ডপপআপ কনস্ট্রাক্টরে আপনাকে প্যারেন্ট // পৃষ্ঠার 'প্রতিনিধি প্রকারের' প্যারামিটার তৈরি করতে হবে

ChildPopUp.cs

    public  Parent.FillName obj;
    public PopUp(Parent.FillName objTMP)//parameter as deligate type
    {
        obj = objTMP;
        InitializeComponent();
    }



   private void OKButton_Click(object sender, RoutedEventArgs e)
    {


        obj(txtFirstName.Text); 
        // Getname() function will call automatically here
        this.DialogResult = true;
    }

সম্পাদিত তবে এই উত্তরের গুণমানটি এখনও উন্নত হতে পারে।
স্টেকওভারফ্লো

1

আপনি যদি প্যারামিটার হিসাবে পদ্ধতিটি পাস করতে চান তবে ব্যবহার করুন:

using System;

public void Method1()
{
    CallingMethod(CalledMethod);
}

public void CallingMethod(Action method)
{
    method();   // This will call the method that has been passed as parameter
}

public void CalledMethod()
{
    Console.WriteLine("This method is called by passing parameter");
}

0

এখানে একটি প্যারামিটার ছাড়া একটি উদাহরণ রয়েছে: http://en.csharp-online.net/CSharp_FAQ:_How_call_a_method_using_a_name_string

প্যারাম সহ: http://www.daniweb.com/forums/thread98148.html#

আপনি মূলত পদ্ধতির নাম সহ বস্তুর একটি অ্যারে পাস করেন pass তারপরে আপনি উভয়ই ইনভোক পদ্ধতিতে ব্যবহার করুন।

প্যারামেস অবজেক্ট [] পরামিতি


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

@ লেট: পদ্ধতিটি আহ্বানে, আর্গুমেন্ট হিসাবে ব্যবহৃত অভিব্যক্তিটি একটি পদ্ধতি গ্রুপ ; এটি এমন একটি পদ্ধতির নাম যা সংকলন সময়ে পরিচিত এবং সংকলক এটি এটিকে প্রতিনিধি হিসাবে রূপান্তর করতে পারে। এটি পরিস্থিতি থেকে খুব আলাদা যেখানে কেবলমাত্র মৃত্যুদন্ড কার্যকর হওয়ার সময় নামটি জানা যায়।
জন স্কিটি

0
class PersonDB
{
  string[] list = { "John", "Sam", "Dave" };
  public void Process(ProcessPersonDelegate f)
  {
    foreach(string s in list) f(s);
  }
}

দ্বিতীয় শ্রেণি ক্লায়েন্ট, যা স্টোরেজ ক্লাস ব্যবহার করবে। এটিতে একটি মেইন পদ্ধতি রয়েছে যা পার্সোনডিবি-র একটি উদাহরণ তৈরি করে এবং এটি ক্লায়েন্ট শ্রেণিতে সংজ্ঞায়িত এমন একটি পদ্ধতির সাথে সেই অবজেক্টের প্রক্রিয়া পদ্ধতিটিকে কল করে।

class Client
{
  static void Main()
  {
    PersonDB p = new PersonDB();
    p.Process(PrintName);
  }
  static void PrintName(string name)
  {
    System.Console.WriteLine(name);
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.