C# 학습 일기 25---익명 메서드, Func 대리자 및 람다 식

黄舟
풀어 주다: 2017-01-21 15:31:49
원래의
1783명이 탐색했습니다.

C# 2.0 이전 버전에서는 대리자를 선언하는 유일한 방법은 명명된 메서드를 사용하는 것이었습니다. C# 2.0에는 무명 메서드(대리자)가 도입되었으며 C# 3.0 이상에서는 인라인 코드를 작성하는 기본 방법으로 람다 식이 익명 메서드를 대체했습니다.

익명 대리자(메서드) :

익명 대리자라는 이름은 좀 더 정확하게는 익명 메소드라고 불러야 할 것 같습니다. (간단히 말하면 둘 다 같은 뜻입니다. 물건). 이전에 Delegate Type에서 Delegate가 동일한 레이블을 가진 메서드를 참조하는 데 사용된다고 언급했습니다. 즉, 대리자 개체를 사용하여 대리자가 참조할 수 있는 메서드를 호출할 수 있습니다(매개 변수는 메서드 이름임). 반면에 익명 메서드는 코드 블록을 대리자 매개 변수로 사용합니다(매개 변수는 함수를 구현하는 코드임). 익명 메서드를 사용하면 대리자를 인스턴스화하는 데 필요한 코딩 오버헤드가 줄어듭니다. 별도의 메소드를 생성합니다.

무명 메소드 편집:

무명 메소드가 대리자 내의 코드 블록에 직접 마운트됩니까, 아니면 대리자를 생성하려면 대리자 키워드를 사용하여 선언해야 합니다. 사례.

    delegate void MyDelegate(int i); //델리게이트 선언

      MyDelegate my = Delegate(int i){/* 코드 블록**/}; 익명 메소드

익명 메소드 인스턴스:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test1  
{  
    class Program  
    { //声明一个委托  
        delegate void MyDelegate(string str);   
        //定义一个实名方法  
        public static void fun(string str)    
        {  
            Console.WriteLine("这是一个 {0} 方法", str);  
        }  
        static void Main(string[] args)  
        {  
            //创建一个委托实例,里面包含一个匿名方法  
            MyDelegate examp1 = delegate(string name)   
            {  
              Console.WriteLine("这是一个 {0} 方法",name); //代码块  
            };  
            examp1("匿名");  //调用匿名方法  
  
            MyDelegate examp2 = new MyDelegate(fun); //在委托中实名注册一个fun命名方法  
            examp2("实名");  //调用命名方法  
        }  
    }  
}
로그인 후 복사

결과:

C# 학습 일기 25---익명 메서드, Func 대리자 및 람다 식

익명의 매개변수 범위 method는 "익명 메서드 블록"입니다.

대상이 블록 외부에 있는 경우 익명 메소드 블록 내부에서 점프 문(예: goto, break 또는 continue)을 사용하는 것은 오류입니다. 대상이 블록 내부에 있는 경우 무명 메서드 블록 외부에서 점프 문(예: goto, break 또는 continue)을 사용하는 것도 오류입니다.

Func Delegate:

예전에는 Delegate Delegate를 사용할 때에는 Delegate 클래스를 미리 선언한 후 등록해야 했습니다.

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test1  
{  
    class Program  
    {  
        delegate string MyDelegate(string s);//声明委托  
        public static string Toup(string str) //定义方法  
        {  
            return str.ToUpper();  
        }  
        static void Main(string[] args)  
        {  
            string str = "abc";  
              
            MyDelegate my = Toup; //注册方法  
            Console.WriteLine(my(str));//调用方法 结果 ABC  
              
        }  
    }  
}
로그인 후 복사

조건에 따라 프로그램에서 대리자 클래스를 선언할 수 없지만 대리자를 사용해야 하는 경우 어떻게 해야 합니까? 이 시점에서 Func 대리자 사용을 고려할 수 있습니다. Func<>의 마지막 매개변수는 반환 값 유형입니다. 이전 매개변수의 기능은 대리자와 유사하지만 위의 예에서는 다음과 같이 변경될 필요가 없습니다. Func 대리자:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test1  
{  
    class Program  
    {  
        public static string Toup(string str) //定义方法  
        {  
            return str.ToUpper();  
        }  
        static void Main(string[] args)  
        {  
            string str = "abc";  
  
            Func<string, string> change = Toup; //泛型委托  
            Console.WriteLine(change(str));//调用方法 结果 ABC  
              
        }  
    }  
}
로그인 후 복사

비교해 보면 둘의 결과는 동일하지만 Func는 Delegate보다 훨씬 간단하지만 Delegate는 익명 메서드를 로드할 수 있습니다. 예를 들어 위의 예에서는 익명 메서드를 사용합니다. 🎜>

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test1  
{  
    class Program  
    {  
        delegate string MyDelegate(string s);//声明委托  
  
        static void Main(string[] args)  
        {  
            string str = "abc";  
            //创建匿名方法  
            MyDelegate my = delegate(string s) { return s.ToUpper(); };   
            Console.WriteLine(my(str)); //结果 ABC  
              
        }  
    }  
}
로그인 후 복사

Func도 작동하나요? Func는 익명 메서드도 만들 수 있으며 다음과 같이 선언할 필요가 없습니다.

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test1  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            string str = "abc";  
            //创建匿名方法  
            Func<string, string> change = delegate(string s) { return s.ToUpper(); };  
            Console.WriteLine(change(str)); //结果 ABC  
              
        }  
    }  
}
로그인 후 복사

위의 익명 메서드와 비교하면 익명 메서드를 만들 때 둘 다 대리자를 통해 구현됩니다(또는 Delegate는 사용), 대리자를 사용하지 않아도 되나요? 이때 람다식을 배워야 합니다.

람다식은

대리자 또는 식 트리 형식을 만드는 데 사용할 수 있는 무명 메서드입니다. 람다 식을 사용하면 인수로 전달되거나 함수 호출 값으로 반환될 수 있는 로컬 함수를 작성할 수 있습니다. Lambda 표현식을 생성하려면 Lambda 연산자 =>의 왼쪽에 입력 매개변수(있는 경우)를 지정한 다음 반대쪽에 표현식이나 문 블록을 입력합니다. 예를 들어 람다 식 x => x * x는 x라는 인수를 지정하고 x의 제곱을 반환합니다.


따라서 위의 예에서는 람다 식을 사용하여 무명 메서드를 만들고 다음과 같이 변경합니다.

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test1  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            string str = "abc";  
            //lambda 表达式  
            Func<string, string> change = s => s.ToUpper(); //传入string 类型s 返回s.ToUpper();  
            Console.WriteLine(change(str)); //结果 ABC  
              
        }  
    }  
}
로그인 후 복사

대리자 대리자 유형에서 다음을 수행할 수 있습니다. 또한 람다 식을 사용합니다. 익명 메서드 만들기:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test1  
{  
    class Program  
    {  
        delegate string MyDelegate(string s);//声明委托  
  
        static void Main(string[] args)  
        {  
            string str = "abc";  
            //lambda 表达式  
            MyDelegate my = s => s.ToUpper(); //传入string 类型s 返回s.ToUpper();  
            Console.WriteLine(my(str)); //结果 ABC  
              
        }  
    }  
}
로그인 후 복사
위는 C# 학습일기 25의 내용입니다.---익명 메서드, Func 대리자 및 람다 식 관련 내용은 PHP 중국어 웹사이트를 참고하세요. (www.php.cn)!


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!