কোনও রিটার্নের ধরণ ছাড়াই ফানক প্রতিনিধি


561

সমস্ত ফানক প্রতিনিধি একটি মান ফেরত দেয়। .NET প্রতিনিধিগুলি কী কী এমন পদ্ধতিতে ব্যবহার করা যায় যা বাতিল হয়ে যায়?

উত্তর:


759

সমস্ত ফানক প্রতিনিধি কিছু ফেরত দেয়; সমস্ত অ্যাকশন প্রতিনিধি বাতিল বাতিল।

Func<TResult> কোনও যুক্তি নেয় না এবং ট্রসাল্ট প্রদান করে:

public delegate TResult Func<TResult>()

Action<T> একটি যুক্তি নেয় এবং একটি মান ফেরত দেয় না:

public delegate void Action<T>(T obj)

Action সবচেয়ে সহজ, 'খালি' প্রতিনিধি:

public delegate void Action()

এছাড়াও রয়েছে Func<TArg1, TResult>এবং Action<TArg1, TArg2>(এবং অন্য 16 টি তর্ক অবধি)। এই সমস্ত (বাদে Action<T>) .NET 3.5 এ নতুন (সিস্টেম.করে সংজ্ঞায়িত)।


11
এফওয়াইআই, বেস ক্লাসের লাইব্রেরির পরবর্তী সংস্করণে ফানক এবং অ্যাকশন ধরণের অন্তর্ভুক্ত থাকবে যা চারটির বেশি ফর্মাল প্যারামিটার সমর্থন করে। তারা ঠিক কত বড় তা আমি মনে করি না।
এরিক লিপার্ট

88
.NET 4.0 এ তারা এখন 8 পরামিতি পর্যন্ত যায়। যদি তারা এটি ধরে রাখে, তবে পরবর্তী সংস্করণে এটি এগারো পর্যন্ত চলে যাবে !! 11 !!!
মিচিয়েল ভ্যান অস্টারহাট

9
প্রকৃতপক্ষে, দেখে মনে হচ্ছে তারা 4.0 এ 16 এর উপরে চলে গেছে।
টাস্টিন 2121

7
1, 4, 16, 64, 256, 1024, 4096, 16384, 65536, ... এটি স্পষ্টভাবে ইঙ্গিত করে যে সংকলকটি বর্তমানে কোনও ফাংশনটিতে ভবিষ্যতের কোনও মুহুর্তের তুলনায় আরও যুক্তি সহ্য করতে সক্ষম হবে will !
ক্রিস মরগান

6
প্রকৃতপক্ষে, টুস্টিন ২১২১ সঠিক, তারা। নেট in.০ এ ১ para টি পরামিতি (প্লাসের ক্ষেত্রে একটি রিটার্নের ধরণ Func<,,, ... ,>) পর্যন্ত গিয়েছিল তবে প্রতিটি "সিরিজের" শেষ আট প্রকারের সংজ্ঞা দেওয়া হয়েছে System.Core.dll, এতে নয় mscorlib.dll, তাই কারণ হ'ল মিচিয়েলভু কেন তাদের দেখেনি। যাইহোক, .NET সংস্করণ 4.5 এবং 4.5.1 এ আর কোনও ফানসস বা ক্রিয়া যুক্ত করা হয়নি। এই ক্রমটি A170836 বা A170875 হয়ে যাবে ? সাথে থাকুন.
জেপ্পে স্টিগ নীলসন

83

... কোন যুক্তি লাগে না এবং একটি শূন্য রিটার্ন টাইপ আছে?

আমি বিশ্বাস করি Actionএটির একটি সমাধান।


47

ফানকের সমস্ত প্রতিনিধি কমপক্ষে একটি প্যারামিটার নেন

এটা সত্যি না. এগুলি সকলেই কমপক্ষে একটি প্রকারের আর্গুমেন্ট গ্রহণ করে তবে সেই যুক্তিটি ফেরতের ধরণ নির্ধারণ করে।

সুতরাং Func<T>কোনও পরামিতি গ্রহণ করে না এবং একটি মান দেয়। ব্যবহার করুন Actionবা Action<T>যখন আপনি কোনও মান ফিরিয়ে দিতে চান না।


27

চেষ্টা করুন System.Func<T>এবংSystem.Action


1
আমি মনে করি না 0 আর্গ এবং কী নেই। নেট 2.0 এর মধ্যে কী নেই।
ব্রায়ান

1
এটি অদ্ভুত: প্রানিকেট এবং অ্যাকশন করলেও নেট নেট 2.0.০ তে ফানকের কোনও অস্তিত্ব নেই।
জোয়েল কোহর্ন

2
.NET 2.0 এর জন্য মেথডইনভোকার প্রতিনিধি ব্যবহার করুন।
ট্রেভর এলিয়ট

.NET 2 এও একটি প্রতিনিধি প্রকার ছিল (বা আছে) Converter<TInput, TOutput>যা পরবর্তী সময়ের মতো ছিল Func<T, TResult>। এটি এমন List<>.ConvertAllপদ্ধতিতে ব্যবহৃত হয়েছিল যা প্রতিটি উপাদানকে List<>অন্য কোনও বস্তুর উপরে প্রজেক্ট করে এবং সমস্ত "ফাংশন মান" কে একটি নতুন স্থানে স্থাপন করে List<>। (পরে, এর Selectজন্য প্রায়শই লিনক ব্যবহার করা হত ))
জেপ্প স্টিগ নীলসেন

0

মাঝেমধ্যে আপনি ইভেন্ট হ্যান্ডলিংয়ের জন্য একটি প্রতিনিধি লিখতে চাইবেন, এই ক্ষেত্রে আপনি যে দুটি প্যারামিটার থেকে উদ্ভূত হওয়া উচিত তা ছাড়াও System.EvenHandler<T>স্পষ্টভাবে টাইপের একটি যুক্তি গ্রহণ করে যার সুবিধা নিতে পারেন । ইভেন্টহ্যান্ডাররা ফিরে আসবেobjectEventArgsvoid

ফাংশন বডিটিতে এক-অফ কলব্যাক তৈরির জন্য টেস্টিংয়ের সময় আমি ব্যক্তিগতভাবে এই দরকারীটি পেয়েছি।


0

... কোন যুক্তি লাগে না এবং একটি শূন্য রিটার্ন টাইপ আছে?

আপনি যদি লিখতে থাকেন তবে System.Windows.Formsআপনি এটি ব্যবহার করতে পারেন:

public delegate void MethodInvoker()

0

রিটার্ন এবং নন রিটার্ন ভ্যালু সাবরটাইনগুলি চাওয়ার একটি খুব সহজ উপায়। যথাক্রমে ফানক এবং অ্যাকশন ব্যবহার করছে । ( https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx এও দেখুন )

এই উদাহরণ চেষ্টা করুন

using System;

public class Program
{
    private Func<string,string> FunctionPTR = null;  
    private Func<string,string, string> FunctionPTR1 = null;  
    private Action<object> ProcedurePTR = null; 



    private string Display(string message)  
    {  
        Console.WriteLine(message);  
        return null;  
    }  

    private string Display(string message1,string message2)  
    {  
        Console.WriteLine(message1);  
        Console.WriteLine(message2);  
        return null;  
    }  

    public void ObjectProcess(object param)
    {
        if (param == null)
        {
            throw new ArgumentNullException("Parameter is null or missing");
        }
        else 
        {
            Console.WriteLine("Object is valid");
        }
    }


    public void Main(string[] args)  
    {  
        FunctionPTR = Display;  
        FunctionPTR1= Display;  
        ProcedurePTR = ObjectProcess;
        FunctionPTR("Welcome to function pointer sample.");  
        FunctionPTR1("Welcome","This is function pointer sample");   
        ProcedurePTR(new object());
    }  
}

1
এই কোড স্নিপেটের জন্য আপনাকে ধন্যবাদ, যা কিছু সীমিত, তাত্ক্ষণিক সহায়তা সরবরাহ করতে পারে। একটি সঠিক ব্যাখ্যা কেন এটি সমস্যার একটি ভাল সমাধান, তা দেখিয়ে তার দীর্ঘমেয়াদী মানকে ব্যাপকভাবে উন্নত করবে এবং ভবিষ্যতে পাঠকদের আরও অন্যান্য অনুরূপ প্রশ্নের সাথে আরও দরকারী করে তুলবে। আপনার অনুমানগুলি সহ কিছু ব্যাখ্যা যুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন।
iBug
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.