উত্তর:
এমএসডিএন বলে:
এই প্রতিনিধিটি অ্যারের দ্বারা ব্যবহৃত হয় For ফরএচ পদ্ধতি এবং তালিকার জন্য প্রত্যেকটি পদ্ধতি বা তালিকার প্রতিটি উপাদানটিতে ক্রিয়া সম্পাদন করার জন্য তালিকাগার জন্য প্রতিটি পদ্ধতি।
এটি বাদে আপনি এটিকে জেনেরিক প্রতিনিধি হিসাবে ব্যবহার করতে পারেন যা কোনও মান না দিয়েই 1-3 প্যারামিটার নেয়।
এখানে একটি ছোট উদাহরণ যা অ্যাকশন প্রতিনিধিটির কার্যকারিতা দেখায়
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();
}
}
আপনার যদি সুইচ থাকে তবে আপনি যা করতে পারেন তা হ'ল:
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!");
আমি এই প্রকল্পে একবারে অ্যাকশন প্রতিনিধি ব্যবহার করেছি:
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()}
};
এটি যা কিছু করে তা হ'ল একধরণের নিয়ন্ত্রণের বিরুদ্ধে একটি ক্রিয়া (পদ্ধতি কল) সংরক্ষণ করা যাতে আপনি কোনও ফর্মের সমস্ত নিয়ন্ত্রণগুলি ডিফল্টে ফিরে যেতে পারেন।
অ্যাকশন <> কীভাবে ব্যবহৃত হয় তার উদাহরণের জন্য।
কনসোল.ওরাইটলাইন এর একটি স্বাক্ষর রয়েছে যা সন্তুষ্ট হয় 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();
}));
সমাধানের জন্য আমাকে অবশ্যই রিড কপসি এসও ব্যবহারকারীকে ক্রেডিট দিতে হবে। উত্তরের সাথে আমার সম্পূর্ণ প্রশ্নটি এসও প্রশ্ন 2587930
আমি একটি ইভেন্ট হ্যান্ডলারটিতে এটি কলব্যাক হিসাবে ব্যবহার করেছি। আমি যখন ইভেন্টটি বাড়িয়ে তুলি, তখন আমি স্ট্রিমটিকে একটি পরামিতি নিয়ে একটি পদ্ধতিতে পাস করি। ঘটনাটি উত্থাপন দেখে মনে হচ্ছে:
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;
}
এইভাবে আমি ডেটা আপডেট করার জন্য কিছু পরামিতি সহ ইভেন্ট হ্যান্ডলার থেকে পাস হওয়া পদ্ধতিটিকে কল করতে পারি। আমি এটি ব্যবহারকারীর কাছ থেকে কিছু তথ্যের জন্য অনুরোধ করছি।
আমরা পরীক্ষাগুলিতে প্রচুর অ্যাকশন প্রতিনিধি কার্যকারিতা ব্যবহার করি। যখন আমাদের কিছু ডিফল্ট অবজেক্ট তৈরি করতে হবে এবং পরে এটি সংশোধন করা দরকার। আমি সামান্য উদাহরণ দিয়েছি। ডিফল্ট ব্যক্তি (জন ডো) অবজেক্টটি তৈরি করতে আমরা 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; }
}