সি # তে অ্যাকশন ডেলিগেটের ব্যবহার [বন্ধ]


132

আমি তাদের সম্পর্কে আরও জানার এবং তারা কোথায় দরকারী হতে পারে তা ভেবে সি # তে অ্যাকশন প্রতিনিধিদের সাথে কাজ করছিলাম।

কেউ কি অ্যাকশন ডেলিগেট ব্যবহার করেছেন এবং যদি তাই হয় কেন? অথবা আপনি কিছু উদাহরণ দিতে পারেন যেখানে এটি কার্যকর হতে পারে?

উত্তর:


25

এমএসডিএন বলে:

এই প্রতিনিধিটি অ্যারের দ্বারা ব্যবহৃত হয় For ফরএচ পদ্ধতি এবং তালিকার জন্য প্রত্যেকটি পদ্ধতি বা তালিকার প্রতিটি উপাদানটিতে ক্রিয়া সম্পাদন করার জন্য তালিকাগার জন্য প্রতিটি পদ্ধতি।

এটি বাদে আপনি এটিকে জেনেরিক প্রতিনিধি হিসাবে ব্যবহার করতে পারেন যা কোনও মান না দিয়েই 1-3 প্যারামিটার নেয়।


অ্যাকশনটির সেই বহু-পরামিতি সংস্করণগুলি আমি কখনই লক্ষ্য করিনি। ধন্যবাদ।
ম্যাকেনির

114

এখানে একটি ছোট উদাহরণ যা অ্যাকশন প্রতিনিধিটির কার্যকারিতা দেখায়

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);
    }
}

লক্ষ্য করুন যে পূর্বাচ পদ্ধতিটি সংগ্রহের পুনরাবৃত্তি করে এবং সংগ্রহের printপ্রতিটি সদস্যের বিরুদ্ধে পদ্ধতিটি কার্যকর করে। প্রোগ্রামিংয়ের আরও কার্যকরী শৈলীর দিকে এগিয়ে যাওয়ার সাথে সাথে আমাদের সি # বিকাশকারীদের জন্য এটি একটি দৃষ্টান্তের শিফট। (এর পিছনে কম্পিউটার বিজ্ঞানের আরও তথ্যের জন্য এটি পড়ুন: http://en.wikedia.org/wiki/Map_(higher-order_function)

এখন আপনি যদি সি # 3 ব্যবহার করেন তবে ল্যাম্বডা মত প্রকাশের সাথে এটি কিছুটা চটপট করে দেখতে পারেন:

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();
    }
}

68

আপনার যদি সুইচ থাকে তবে আপনি যা করতে পারেন তা হ'ল:

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);

উদাহরণ দুটি মাত্র। অবশ্যই আরও সুস্পষ্ট ব্যবহার হবে লিনক এক্সটেনশন পদ্ধতিগুলি।


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

3
দুর্দান্ত - এটি একটি সংশোধনকারী প্যাটার্ন "শর্তসাপেক্ষ প্রতিস্থাপনের সাথে প্রতিস্থাপন করুন" ym রিফ্যাক্টরিং
ডেভিড রবিন্স

16

আপনি সংক্ষিপ্ত ইভেন্ট হ্যান্ডলারের জন্য ক্রিয়াগুলি ব্যবহার করতে পারেন:

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

এগুলি আপনি দীর্ঘ সময়ের জন্যও ব্যবহার করতে পারেন; btnSubmit.Click + = (প্রেরক, ই) => {বার্তাবক্স। শো ("আপনি সংরক্ষণ ক্লিক করেছেন!"); মেসেজবক্স.শো ("আপনি আসলেই করেছেন!"); };
@gtyugdyugdrugdr

15

আমি এই প্রকল্পে একবারে অ্যাকশন প্রতিনিধি ব্যবহার করেছি:

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()}
    };

এটি যা কিছু করে তা হ'ল একধরণের নিয়ন্ত্রণের বিরুদ্ধে একটি ক্রিয়া (পদ্ধতি কল) সংরক্ষণ করা যাতে আপনি কোনও ফর্মের সমস্ত নিয়ন্ত্রণগুলি ডিফল্টে ফিরে যেতে পারেন।


দুর্দান্ত, পরিবর্তনের কোনও বড় বিষয় নয় তবে এখানে কীডবিটাইপ কলক্লেশন বলে কিছু রয়েছে, যদিও আমি মনে করি এটি ডিকটিয়েনারি (টাইপ, অবজেক্ট) এর চারপাশে মোড়ানো রয়েছে, হতে পারে।
বিশ্বনাথ

13

অ্যাকশন <> কীভাবে ব্যবহৃত হয় তার উদাহরণের জন্য।

কনসোল.ওরাইটলাইন এর একটি স্বাক্ষর রয়েছে যা সন্তুষ্ট হয় 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);         
    }

আশাকরি এটা সাহায্য করবে


11

আমি যখন অবৈধ ক্রস থ্রেড কলগুলি নিয়ে কাজ করি তখন আমি এটি ব্যবহার করি উদাহরণস্বরূপ:

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();
}));

সমাধানের জন্য আমাকে অবশ্যই রিড কপসি এসও ব্যবহারকারীকে ক্রেডিট দিতে হবে। উত্তরের সাথে আমার সম্পূর্ণ প্রশ্নটি এসও প্রশ্ন 2587930


3

আমি একটি ইভেন্ট হ্যান্ডলারটিতে এটি কলব্যাক হিসাবে ব্যবহার করেছি। আমি যখন ইভেন্টটি বাড়িয়ে তুলি, তখন আমি স্ট্রিমটিকে একটি পরামিতি নিয়ে একটি পদ্ধতিতে পাস করি। ঘটনাটি উত্থাপন দেখে মনে হচ্ছে:

SpecialRequest(this,
    new BalieEventArgs 
    { 
            Message = "A Message", 
            Action = UpdateMethod, 
            Data = someDataObject 
    });

পদ্ধতি:

   public void UpdateMethod(string SpecialCode){ }

এটি হল ইভেন্টের শ্রেণিবিন্যাস:

public class MyEventArgs : EventArgs
    {
        public string Message;
        public object Data;
        public Action<String> Action;
    }

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


হাই সর্সকুট, কীভাবে আপনি আপডেটমেথড, মাইভেন্টআর্গস এবং নতুন বালিএভেন্টআর্গগুলি একসাথে খেলছেন তা প্রসারিত করতে পারেন। স্ট্রিং মেসেজটি আপডেটমথোডে আপডেট হয়েছে: আপডেটমথোড ("একটি বার্তা")? কোন পদ্ধতিটি "কিছু ডেটাঅবজেক্ট" অবজেক্টটি ব্যবহার করে? অগ্রিম ধন্যবাদ
surfmuggle

2

আমরা পরীক্ষাগুলিতে প্রচুর অ্যাকশন প্রতিনিধি কার্যকারিতা ব্যবহার করি। যখন আমাদের কিছু ডিফল্ট অবজেক্ট তৈরি করতে হবে এবং পরে এটি সংশোধন করা দরকার। আমি সামান্য উদাহরণ দিয়েছি। ডিফল্ট ব্যক্তি (জন ডো) অবজেক্টটি তৈরি করতে আমরা BuildPerson()ফাংশনটি ব্যবহার করি । পরে আমরা জেন ডোকেও যুক্ত করি তবে আমরা তার জন্ম তারিখ এবং নাম এবং উচ্চতা সংশোধন করি।

public class Program
{
        public static void Main(string[] args)
        {
            var person1 = BuildPerson();

            Console.WriteLine(person1.Firstname);
            Console.WriteLine(person1.Lastname);
            Console.WriteLine(person1.BirthDate);
            Console.WriteLine(person1.Height);

            var person2 = BuildPerson(p =>
            {
                p.Firstname = "Jane";
                p.BirthDate = DateTime.Today;
                p.Height = 1.76;
            });

            Console.WriteLine(person2.Firstname);
            Console.WriteLine(person2.Lastname);
            Console.WriteLine(person2.BirthDate);
            Console.WriteLine(person2.Height);

            Console.Read();
        }

        public static Person BuildPerson(Action<Person> overrideAction = null)
        {
            var person = new Person()
            {
                Firstname = "John",
                Lastname = "Doe",
                BirthDate = new DateTime(2012, 2, 2)
            };

            if (overrideAction != null)
                overrideAction(person);

            return person;
        }
    }

    public class Person
    {
        public string Firstname { get; set; }
        public string Lastname { get; set; }
        public DateTime BirthDate { get; set; }
        public double Height { get; set; }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.