c# - सी#में कार्य प्रतिनिधि का उपयोग




lambda delegates (6)

अच्छी तरह से एक चीज जो आप कर सकते हैं वह है यदि आपके पास स्विच है:

switch(SomeEnum)
{
  case SomeEnum.One:
      DoThings(someUser);
      break;
  case SomeEnum.Two:
      DoSomethingElse(someUser);
      break;
}

और कार्यों की शक्ति शक्ति के साथ आप उस स्विच को एक शब्दकोश में बदल सकते हैं:

Dictionary<SomeEnum, Action<User>> methodList = 
    new Dictionary<SomeEnum, Action<User>>()

methodList.Add(SomeEnum.One, DoSomething);
methodList.Add(SomeEnum.Two, DoSomethingElse); 

...

methodList[SomeEnum](someUser);

या आप इसे आगे ले जा सकते हैं:

SomeOtherMethod(Action<User> someMethodToUse, User someUser)
{
    someMethodToUse(someUser);
}  

....

var neededMethod = methodList[SomeEnum];
SomeOtherMethod(neededMethod, someUser);

बस कुछ उदाहरण। निश्चित रूप से अधिक स्पष्ट उपयोग लिंक एक्सटेंशन विधियां होगी।

मैं सी # में एक्शन डिलीगेट्स के साथ उनके बारे में अधिक जानने की सोच में काम कर रहा था और सोच रहा था कि वे कहां उपयोगी हो सकते हैं।

क्या किसी ने एक्शन प्रतिनिधि का उपयोग किया है, और यदि ऐसा है तो क्यों? या आप कुछ उदाहरण दे सकते हैं जहां यह उपयोगी हो सकता है?


आप लघु ईवेंट हैंडलर के लिए कार्रवाइयों का उपयोग कर सकते हैं:

btnSubmit.Click += (sender, e) => MessageBox.Show("You clicked save!");

कार्रवाई <> का उपयोग कैसे किया जाता है इसके उदाहरण के लिए।

कंसोल। राइटलाइन के पास एक हस्ताक्षर है जो Action<string>

    static void Main(string[] args)
    {
        string[] words = "This is as easy as it looks".Split(' ');

        // Passing WriteLine as the action
        Array.ForEach(words, Console.WriteLine);         
    }

उम्मीद है की यह मदद करेगा


जब मैं अवैध क्रॉस थ्रेड कॉल से निपट रहा हूं तो मैं इसका उपयोग करता हूं उदाहरण के लिए:

DataRow dr = GetRow();
this.Invoke(new Action(() => {
   txtFname.Text = dr["Fname"].ToString();
   txtLname.Text = dr["Lname"].ToString(); 
   txtMI.Text = dr["MI"].ToString();
   txtSSN.Text = dr["SSN"].ToString();
   txtSSN.ButtonsRight["OpenDialog"].Visible = true;
   txtSSN.ButtonsRight["ListSSN"].Visible = true;
   txtSSN.Focus();
}));

मुझे समाधान के लिए रीड कॉपसे एसओ उपयोगकर्ता 65358 को क्रेडिट देना होगा। उत्तर के साथ मेरा पूरा सवाल SO79 2587930 है


मैंने एक परियोजना में इस तरह के एक्शन प्रतिनिधि का इस्तेमाल एक बार किया था:

private static Dictionary<Type, Action<Control>> controldefaults = new Dictionary<Type, Action<Control>>() { 
            {typeof(TextBox), c => ((TextBox)c).Clear()},
            {typeof(CheckBox), c => ((CheckBox)c).Checked = false},
            {typeof(ListBox), c => ((ListBox)c).Items.Clear()},
            {typeof(RadioButton), c => ((RadioButton)c).Checked = false},
            {typeof(GroupBox), c => ((GroupBox)c).Controls.ClearControls()},
            {typeof(Panel), c => ((Panel)c).Controls.ClearControls()}
    };

जो कुछ भी करता है वह एक प्रकार के नियंत्रण के खिलाफ एक क्रिया (विधि कॉल) स्टोर करता है ताकि आप किसी भी रूप में सभी नियंत्रणों को डिफ़ॉल्ट पर वापस कर सकें।


यहां एक छोटा सा उदाहरण दिया गया है जो कार्य प्रतिनिधि की उपयोगिता दिखाता है

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Action<String> print = new Action<String>(Program.Print);

        List<String> names = new List<String> { "andrew", "nicole" };

        names.ForEach(print);

        Console.Read();
    }

    static void Print(String s)
    {
        Console.WriteLine(s);
    }
}

ध्यान दें कि foreach विधि नामों के संग्रह को पुन: सक्रिय करती है और संग्रह के प्रत्येक सदस्य के खिलाफ print विधि निष्पादित करती है। यह हमारे लिए सी # डेवलपर्स के लिए एक आदर्श बदलाव है क्योंकि हम प्रोग्रामिंग की एक और कार्यात्मक शैली की ओर बढ़ते हैं। (इसके पीछे कंप्यूटर विज्ञान पर अधिक जानकारी के लिए इसे पढ़ें: http://en.wikipedia.org/wiki/Map_(higher-order_function)

अब यदि आप सी # 3 का उपयोग कर रहे हैं तो आप इसे लैम्ब्डा अभिव्यक्ति के साथ थोड़ा सा slick कर सकते हैं:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<String> names = new List<String> { "andrew", "nicole" };

        names.ForEach(s => Console.WriteLine(s));

        Console.Read();
    }
}




action