Exemplo n.º 1
0
        static void Main(string[] args)
        {
            Console.WriteLine("GetAStringDemo");
            int x = 40;

            //委托绑定方法
            GetAString firstStringMethod  = new GetAString(x.ToString); //不能写成x.ToString() 这个是方法的调用 需要的是传递方法本身
            GetAString secondStringMethod = x.ToString;                 //可以使用委托推断 给委托绑定方法 两种方式 C#编译器创建的代码是一样的

            //委托调用 这两种方式相同
            firstStringMethod();
            WriteLine($"firstStringMethod() 方式调用: { firstStringMethod()}");
            firstStringMethod.Invoke();
            WriteLine($"firstStringMethod.Invoke() 方式调用: {  firstStringMethod.Invoke()}");


            var balance = new Currency(34, 50);

            //委托指向实例方法
            firstStringMethod = balance.ToString;
            WriteLine($"balance.ToString is {firstStringMethod()}");

            //委托指向静态方法
            firstStringMethod = Currency.GetCurrencyUnit;
            WriteLine($"Currency.GetCurrencyUnit is {firstStringMethod()}");

            //本节只是给委托绑定方法,使用委托调用方法
            //没有设计把文档当作参数,传递给其他方法
            //也没有体现委托的方便之处
            ReadKey();
        }
Exemplo n.º 2
0
        static void Main(string[] args)
        {
            int x = 40;
            //委托在语法上总是接受一个参数的构造函数,这个参数就是委托引用的方法。这个方法必须匹配最初定义委托时的签名。
            GetAString firstStringMethod = new GetAString(x.ToString);
            Console.WriteLine("string is {0}", firstStringMethod());
            //下面跟上面效果一样
            Console.WriteLine("string is {0}", firstStringMethod.Invoke());

            //把方法传递给委托变量也可以
            GetAString secondString = GoodJob;
            Console.WriteLine("second string is {0}", secondString());

            //这样两个方法都会执行,这个叫多播委托
            secondString += BadJob;
            Console.WriteLine("third string is {0}", secondString());

            secondString -= BadJob;
            Console.WriteLine("fourth string is {0}", secondString());


            GetAString Money1 = Money.GetMoney;
            Console.WriteLine("get money is {0}", Money1());

            Money m = new Money();
            Money1 = m.SendMoney;
            Console.WriteLine("send money is {0}", Money1());

            Console.ReadKey();
        }
Exemplo n.º 3
0
        static void Main(string[] args)
        {
            int    x = 40;
            int    y = 20;
            string s = x.ToString();

            Console.WriteLine(s);

            // 实例委托
            GetAString getAString = new GetAString(x.ToString);
            // 通过委托调用一个方法,和直接调用这个方法是一样的
            string str = getAString();  // 通过委托实例调用x中的tostring方法

            Console.WriteLine(s);

            // 调用方法
            // 1. 赋值给委托
            GetAString a = x.ToString;

            Console.WriteLine(a());
            // 2. Invoke    通过Invoke方法调用a所引用的方法
            Console.WriteLine(a.Invoke());

            // 使用委托类型作为方法的参数
            PrintString method = Method1;

            PrintStr(method);
            method = Method2;
            PrintStr(method);


            Console.ReadKey();
        }
Exemplo n.º 4
0
 static void Main()
 {
     int s = 20;
     GetAString firstStringMethod = new GetAString(s.ToString);
     Console.WriteLine(firstStringMethod());
     Console.WriteLine(firstStringMethod.Invoke());
     sbyte o = 127;
     //checked { ++o; }
     ++o;
     Console.WriteLine(o);
     int r=9;
     Console.WriteLine(R(ref r));
     Console.WriteLine(DayOfWeek.Friday);
     Console.WriteLine(r);
     int z;
     Console.WriteLine("z+a=out "+ F(out z));
     const int n = 6;
     int c = 4;
     Program p = new Program();
     Console.WriteLine("gET tYPE: "+p.GetType(), p.MemberwiseClone());
     Console.WriteLine(p._a);
     Console.WriteLine(b);
     Console.WriteLine(c);
     Console.WriteLine(c.GetType());
     //Console.WriteLine(F());
     for(int i = 0; i < 3; i++)
     {
         int d = 5;
         Console.WriteLine(d);
     }
     //Console.ReadLine();
     return;
 }
Exemplo n.º 5
0
        static void Main(string[] args)
        {
            int        x = 10;
            GetAString GetIntAsString = new GetAString(x.ToString);

            Console.WriteLine("The number is {0}", GetIntAsString.Invoke());
            Console.ReadLine();
        }
Exemplo n.º 6
0
        /// <summary>
        /// 测试委托
        /// </summary>
        private static void test01()
        {
            int x = 40;
            //a指向了x的tostring方法
            GetAString a = new GetAString(x.ToString);//注意,这里是将x.ToString方法的引用传递给委托

            Console.WriteLine(a.Invoke());
            Console.WriteLine(a());
            Console.ReadKey();
        }
Exemplo n.º 7
0
        /// <summary>
        /// 测试委托
        /// </summary>
        private static void test02()
        {
            int x = 40;
            //a指向了x的tostring方法
            GetAString a = x.ToString;     //注意,这里是将x.ToString方法的引用传递给委托

            Console.WriteLine(a.Invoke()); //通过invoke方法来调用a所引用的方法
            Console.WriteLine(a());
            Console.ReadKey();
        }
Exemplo n.º 8
0
        public static void Main(string[] args)
        {
            int num = 400;
            //使用委托类型创建实例
            GetAString sasa = new GetAString(num.ToString); //sasa指向了num中的tostring方法
            GetAString dada = num.ToString;                 //第二种赋值方法;
            string     kk   = dada.Invoke();                //通过委托实例去调用num中的tostring方法;

            Console.WriteLine(sasa());                      //通过委托类型是调用一个方法,跟直接调用这个方法作用是一样的
            GetAString dde = new GetAString(num.ToString);


            Action          a  = PrintString; //action是系统内置(预定义)的一个委托类型,它可以指向一个没有返回值,没有参数的方法;
            Action <int>    a1 = PrintString; //定义了一个委托类型,这个类型可以指向一个没有返回值,有一个int参数的方法
            Action <string> a2 = PrintString; //定义了一个委托类型,这个类型可以指向一个没有返回值,有一个string参数的方法,在这里系统hi自动寻找匹配的方法;
                                              //Action可以后面通过泛型去指定action指向的方法的多个参数的类型,参数的类型跟action后面声明的委托是对应着的



            Func <int>                 fu  = State; //func中的泛型类型<>指定的是方法的返回值类型
            Func <string, string>      fu2 = State;
            Func <string, int, string> fu3 = State; //func后面必须指定一个返回值类型,参数类型可以有0~16个

            //先写参数类型,最后一个是返回值类型;
            Console.WriteLine(fu());
            Console.WriteLine(fu2("aiyanhe"));
            Console.WriteLine(fu3("aitianyi", 100));

            //多播委托
            duobo ll = PrintString;

            ll += PrintString1;
            ll += PrintString2; //一个委托有多个方法,叫做多播委托;
            ll();
            ll -= PrintString;  //减去一个指定委托
            ll -= PrintString1;
            ll -= PrintString2;
            if (ll != null)
            {
                ll();//如果委托为空,执行时会报错;
            }
            ll  = PrintString;
            ll += PrintString1;
            ll += PrintString2;
            Delegate[] sss = ll.GetInvocationList();//新建一个委托数组来接受
            foreach (var item in sss)
            {
                item.DynamicInvoke();
            }



            Console.ReadKey();
        }
Exemplo n.º 9
0
        static void Main(string[] args)
        {
            int i = 40;
            // 创建并初始化委托实例,将ToString()方法的地址赋予委托变量
            // 委托总是接受一个参数的构造函数
            GetAString firstStringMethod = new GetAString(i.ToString);

            Console.WriteLine("firstStringMethod() is {0} ", firstStringMethod());
            // 委托实例提供圆括号与调用委托类的Invoke()方法完全相同
            Console.WriteLine("firstStringMethod() is {0} ", firstStringMethod.Invoke());
            // 委托推断:编译器解析委托实例为需要的特定类型
            GetAString secondStringMethod = i.ToString;

            Currency balance = new Currency(34, 50);

            // firstStringMethod委托调用一个实例方法
            firstStringMethod = new GetAString(balance.ToString);
            Console.WriteLine("String is {0} ", firstStringMethod());
            // firstStringMethod委托调用一个静态方法
            firstStringMethod = new GetAString(Currency.GetCurrencyUint);
            Console.WriteLine("String is {0} ", firstStringMethod());

            Console.Read();
        }