委托初步学习

//从第一个方法看到第9个方法, 看完就差不多了.

using System;
using System.Collections.Generic;
using System.Text;

namespace Delegate
{
    //定义委托, 它定义了可以代表的方法的类型
    public delegate void GreetingDelegate(string name);

    class P2
    {
        public GreetingDelegate gd3;
        public event GreetingDelegate gd4;

        //注意此方法, 它接受一个GreetingDelegate类型的方法作为参数
        public void GreetPeople(string name, GreetingDelegate MakeGreeting)
        {
            MakeGreeting(name);
        }
    }

    class Program
    {
        private static void EnglishGreeting(string name)
        {
            Console.WriteLine("Morning, "+name);
        }

        private static void ChineseGreeting(string name)
        {
            Console.WriteLine("早上好, " + name);
        }

        //注意此方法, 它接受一个GreetingDelegate类型的方法作为参数
        private static void GreetPeople(string name,GreetingDelegate MakeGreeting)
        {
            MakeGreeting(name);
        }

        static void Main(string[] args)
        {
            //Method1();
            //Method2();
            //Method3();
            //Method4();
            //Method5();
            //Method6();
            //Method7();
            //Method8();

            Method9();
            Console.ReadKey();
        }
        ///
        /// 9.事件也没有什么了不起的, 它是封装之后的委托类型的变量
        ///   不过, 它只能在+=或-=的左边, 也不能直接调用
        ///
        private static void Method9()
        {
            P2 p = new P2();
            //这是是错误的,p.gd4只能出现在+=或-=的左边p.gd4 = new GreetingDelegate(EnglishGreeting);
            p.gd4 += ChineseGreeting;
            //同时的错误: p.GreetPeople("Jack", p.gd4);
        }
        ///
        /// 8.将委托封装在P2这个类里
        /// 注意:此时的委托, 如是private,则外部无法访问, 如是public,则外部的赋值又可以随意赋值了.
        ///
        private static void Method8()
        {
            P2 p = new P2();
            p.gd3 = new GreetingDelegate(EnglishGreeting);
            p.gd3 += ChineseGreeting;
            p.GreetPeople("Jack", p.gd3);
        }
        ///
        /// 7.一般来说, GreetPeople和EnglishGreeting,ChineseGreeting不在一个类中.
        ///
        private static void Method7()
        {
            GreetingDelegate gd1 = new GreetingDelegate(EnglishGreeting);
            gd1 += ChineseGreeting;
            P2 p = new P2();
            p.GreetPeople("Jack", gd1);
        }
        ///
        /// 6.可以取消其中的一个方法
        ///
        private static void Method6()
        {
            GreetingDelegate gd1 = new GreetingDelegate(EnglishGreeting);
            gd1 += ChineseGreeting;
            Console.WriteLine("绑定了两个方法!");
            GreetPeople("Jack", gd1);
            Console.WriteLine("取消了其中的一个方法");
            gd1 -= ChineseGreeting;
            GreetPeople("Jack", gd1);
        }
        ///
        /// 5.可以像类一样直接得到对象, 但是GreetingDelegate gd1=new GreetingDelegate();却是错误的;
        ///
        private static void Method5()
        {
            GreetingDelegate gd1 = new GreetingDelegate(EnglishGreeting);
            //错误的: GreetingDelegate gd2= new GreetingDelegate();
            gd1 += ChineseGreeting;
            gd1("Jack");
        }
        ///
        /// 4.可以不用那个中转的方法, 直接调用委托
        ///
        private static void Method4()
        {
            GreetingDelegate gd1 = EnglishGreeting;
            gd1 += ChineseGreeting;
            gd1("Jack");
        }
        ///
        /// 3.委托最奇妙的地方: 一个委托类型的变量可以绑定多个方法, 调用委托时, 会依次调用这些方法
        /// 注意:第一次是赋值的语法, 第二次是绑定的语法, 如果第一次就用+=, 则会出现"无效的表达式项"的编译错误
        ///
        private static void Method3()
        {
            GreetingDelegate gd1 = EnglishGreeting;
            gd1 += ChineseGreeting;
            GreetPeople("Jack", gd1);
        }
        ///
        /// 2.既然委托定义了方法, 所以委托也可以接受方法的赋值
        ///
        private static void Method2()
        {
            GreetingDelegate gd1 = EnglishGreeting;
            GreetingDelegate gd2 = ChineseGreeting;

            GreetPeople("Jack", gd1);
            GreetPeople("老王", gd2);
        }
        ///
        /// 1.最简单的调用方式
        ///
        private static void Method1()
        {
            GreetPeople("Jimmy Zhang", EnglishGreeting);
            GreetPeople("张子阳", ChineseGreeting);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值