• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
博雅居
要想跟上时代,就得不断学习!
博客园    首页    新随笔    联系   管理    订阅  订阅
4.1 delegate

delegate  ---packed up function 

public delegate double myDelegate (double x);

my delegate d2 = new myDelegate (obj.method);

using System;
 
delegate double Fun( double x );
 
 
 
public class DelegateIntegral
{
    public static void Main()
    {
        Fun fun = new Fun(Math.Sin);
        double d = Integral( fun, 0, Math.PI/2, 1e-4 ); 
        Console.WriteLine( d );
 
        Fun fun2 = new Fun( Linear );
        double d2 = Integral( fun2, 0, 2, 1e-3 );
        Console.WriteLine( d2 );
 
        Rnd rnd = new Rnd();
        double d3 = Integral( new Fun(rnd.Num), 0, 1, 0.01 ); 
        Console.WriteLine( d3 );
    }
     
    static double Linear( double a )
    {
        return a*2+1;
    }
     
    class Rnd 
    {
        Random r = new Random();
        public double Num( double  x )
        {
            return r.NextDouble();
        }
    }
 
    static double Integral(Fun f, double a, double b, double eps)// 积分计算
    {
        int n,k;
        double fa,fb,h,t1,p,s,x,t=0;
 
        fa=f(a); 
        fb=f(b);
 
        // 迭代初值
        n=1; 
        h=b-a;
        t1=h*(fa+fb)/2.0;
        p=double.MaxValue;
 
        // 迭代计算
        while (p>=eps)
        { 
            s=0.0;
            for (k=0;k<=n-1;k++)
            { 
                x=a+(k+0.5)*h;
                s=s+f(x);
            }
 
            t=(t1+h*s)/2.0;
            p=Math.Abs(t1-t);
            t1=t; 
            n=n+n; 
            h=h/2.0;
        }
        return t;
    }
 
}

 

 

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
 
namespace TestWin
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Button button1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;
 
        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();
 
            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }
 
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }
 
        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(216, 24);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(64, 24);
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            // 
            // Form1
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                          this.button1});
            this.Name = "Form1";
            this.Text = "Form1";
            this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
            this.ResumeLayout(false);
 
        }
        #endregion
 
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() 
        {
            Application.Run(new Form1());
        }
 
        private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Pen pen = Pens.Blue;
 
            Fun [] funs = {
                              new Fun( this.Square ),
                              new Fun( Form1.XPlus ),
                              new Fun( Math.Cos ),
                              new Fun( Math.Sqrt )
                          };
            foreach( Fun fun in funs )
            {
                PlotFun( fun, g, pen );
            }
        }
 
        delegate double Fun( double x );
 
        void PlotFun( Fun fun, Graphics g, Pen pen )
        {
                for( double x=0; x<10; x+=0.1)
                {
                    double y = fun(x);
                    Point point = new Point( (int)(x*20), (int)(200-y*30) );
                    g.DrawLine( pen, point, new Point( point.X+2, point.Y+2) );
                    Console.WriteLine( " " + x + " " + y );
                }
        }
 
        double Square( double x )
        {
            return Math.Sqrt( Math.Sqrt( x) );
        }
        static double XPlus( double x )
        {
            return Math.Sin(x)+ Math.Cos(x*5)/5;
        }
 
    }
}

 

using System;
delegate void D(int x);
class C
{
    public static void M1(int i) 
    {
        Console.WriteLine("C.M1: " + i);
    }
    public static void M2(int i) 
    {
        Console.WriteLine("C.M2: " + i);
    }
    public void M3(int i) 
    {
        Console.WriteLine("C.M3: " + i);
    }
}
class Test
{
    static void Main() 
    { 
        D cd1 = new D( C.M1);
        cd1(-1);        // call M1
        D cd2 = null;
        cd2 += new D( C.M2);
        cd2(-2);        // call M2
        D cd3 = cd1 + cd2;
        cd3(10);        // call M1 then M2
        cd3 += cd1;
        cd3(20);        // call M1, M2, then M1
        C c = new C();
        D cd4 = new D(c.M3);
        cd3 += cd4;
        cd3(30);        // call M1, M2, M1, then M3
        cd3 -= cd1;       // remove last M1
        cd3(40);        // call M1, M2, then M3
        cd3 -= cd4;
        cd3(50);        // call M1 then M2
        cd3 -= cd2;
        cd3(60);        // call M1
        cd3 -= cd2;       // impossible removal is benign
        cd3(60);        // call M1
        cd3 -= cd1;       // invocation list is empty
        Console.WriteLine( cd3 == null );
        //      cd3(70);    // System.NullReferenceException thrown
        cd3 -= cd1;       // impossible removal
        Console.WriteLine( cd3 == null );
 
    }
}

 

If opportunity doesn’t knock, build a door
posted on 2015-01-19 16:19  博雅居  阅读(303)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3