.NET 事件

by admin on 2019年4月9日

一、url是怎么着,有怎么着作用:

简言之便是大家常说的网站;正规来说正是统一财富一定符是对能够从互连网上获得的财富的职分和做客方法的1种简单的意味,是网络上规范财富的地方。

网络上的每种文件都有2个唯1的UWranglerL,它富含的音讯提出文件的职分以及浏览器应该怎么处理它。

 

 事件概述                                                           

2、url的详实格式:

图片 1

 

 

   
 在发出其余类或对象关切的事务时,类或对象可因而事件通报它们。发送(或迷惑)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。

3、http协议(超文本传输协议)

http协议定义了浏览器如何向万维网服务器请求万维网文书档案,他是万维网上可见可信赖的交流文件(包括文件,声音,图像等各类多媒体文件)的重大基础。

http有两类报文:

伸手报文———从客户向服务器发送请求报文

1呼百应报文———从服务器到客户的回答;

 图片 2

http请求报文中的请求方式:

    OPTION:请求一些抉择的音信

    GET:请求读取由UENVISIONL所标明的新闻

    HEAD:请求读取游U汉兰达L所标明新闻的首部

    POST:给服务器添加新闻(例如,注释)

    PUT:在指明的UKoleosL下存三个文书档案

    DELETE:删除知名的UPAJEROL所标识的财富

    TRACE:用来举办环回测试的乞求报文

    CONNECT:用于代理服务器

图片 3

 

 

  • 特点
    • 发行者分明曾几何时引发轩然大波,订户显著实施何种操作来响应该事件。
    • 贰个轩然大波能够有五个订户。三个订户可处理来自七个发行者的八个事件。
    • 尚未订户的风浪永远不会被调用。
    • 事件家常便饭用于公告用户操作
    • 假若二个事变有两个订户,当引发该事件时,会共同调用四个事件处理程序,也能够设置异步调用事件。
    • 能够应用事件联合线程。
    • 事件是依据 伊芙ntHandler 委托和
      伊芙ntArgs 基类的。

4、http头中的Referer有何样意义

HTTP Referer 是 Header 的一局地。当浏览器向 Web服务器
发送请求的时候,壹般会带上Referer。你点击了2个新的链接referer能够阅览你从哪里的取得的链接;

诸如作者通过百度访问了今天头条,则做客微博的http头中的

Referer:https://www.baidu.com/link?url=Woj-zKYZd1Uu8daeSqhADd2bz9pnsF\_nBb59357MgB4yqf8oAwWzC9CZvoeUDOJ7&wd=&eqid=f2d9f3120007574f000000025a5b1973

 

 事件的订阅和撤回订阅                                       

5、Cookie和Set-Cookie代表怎么着意思

   Cookie指有些网站为了鉴定识别用户身份、举行 session 跟踪而储存在用户本地终端上的数额(通常通过加密),就一定于叁个小区发的通行证,只要有通行证(并于要求驾驭你是何人,仅凭通行证)下次还足以进出。

Set-Cookie由服务器发送,它涵盖在响应请求的尾部中。它用来在客户端创立二个Cookie

 

     假设你想编写引发轩然大波时调用的自定义代码,则足以订阅由别的类公布的事件。例如,可以订阅有些按钮的“单击”事件,以使应用程序在用户单击该按钮时进行一些灵光的操作。

6、状态码(Status Code)

普普通通都以4位数字,分为五大类

一xx表示布告音讯的,如请求收到了或正在处理

2xx代表成功,如接受可能精晓了

3xx表示重定向,如要达成请求还必须使用更为的行路

四xx代表客户的谬误,如请求中有错误的语法或无法一气浑成

5xx比sohi服务器的偏差,如服务器失效非常的小概到位请求

附上详细情形码链接:

https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660?fr=aladdin

 图片 4

 

  • 订阅事件
    • VS IDE 订阅事件
      • 万一“属性”窗口不可知,请在“设计”视图中,右击要开创事件处理程序的窗体或控件,然后选用“属性”。
      • 在“属性”窗口的顶部,单击“事件”图标。
      • 双击要开创的事件,Visual C#
        会创设一个空事件处理程序方法,并将其添加到您的代码中。可能,您也足以在“代码”视图中手动添加代码。
    • 编制程序方式订阅事件

      • 概念二个事件处理程序方法,其签名与该事件的委托签名相配。例如,借使事件基于
        伊夫ntHandler 委托类型,则上边包车型大巴代码表示方法存根
void HandleCustomEvent(object sender, CustomEventArgs a){  }
      • 应用加法赋值运算符 (+=)
        来为事件附加事件处理程序。在底下的演示中,借使名叫 publisher
        的目的拥有2个名称叫 RaiseCustom伊芙nt
        的轩然大波。请留心,订户类必要引用发行者类才能订阅其事件。
publisher.RaiseCustomEvent += HandleCustomEvent;
publisher.RaiseCustomEvent += new CustomEventHandler(HandleCustomEvent);
    • 匿名方式订阅事件
      • 运用加法赋值运算符 (+=)
        来为事件附加匿名格局。在上面包车型地铁言传身教中,假使名字为 publisher
        的目的具备叁个名字为 RaiseCustom伊夫nt 的风浪,并且还定义了2个Custom伊夫ntArgs
        类以承载某个种类的专用事件信息。请留意,订户类须要引用
        publisher 才能订阅其事件。
publisher.RaiseCustomEvent += delegate(object o, CustomEventArgs e)
{
    string s = o.ToString() + " " + e.ToString();
    Console.WriteLine(s);
};
  • 撤废订阅

   
 要防患在掀起事件时调用事件处理程序,您只需撤销订阅该事件。要预防财富走漏,请在自由订户对象从前撤废订阅事件,那一点很重大。在撤除订阅事件以前,在发表对象中作为该事件的根底的多路广播委托会引用封装了订户的事件处理程序的委托。只要发表对象涵盖该引用,就不会对订户对象执行垃圾回收。

     使用减法赋值运算符 (-=)
裁撤订阅事件。全数订户都收回订阅某事件后,发行者类中的事件实例会安装为
null。

publisher.RaiseCustomEvent -= HandleCustomEvent;

 透露标准事件                                           

     上边包车型地铁进度演示了哪些将符合标准 .NET
Framework 情势的风浪添加到您自身的类和布局中。.NET Framework
类库中的全体事件均依照 伊夫ntHandler 委托,定义如下。

public delegate void EventHandler(object sender, EventArgs e);
  • 行使 伊芙ntHandler
    形式公布事件
    • (借使不需求发送含事件的自定义数据,请跳过此步骤,直接进去步骤
      三。)在发行者类和订户类均可望见的范围中评释类,并加上保留自定义事件数量所需的积极分子。在此示例中,会回来3个不难字符串。
public class CustomEventArgs : EventArgs
{
    public CustomEventArgs(string s)
    {
        msg = s;
    }
    private string msg;
    public string Message
    {
        get { return msg; }
    } 
}
    • (假使你使用的是 伊芙ntHandler
      的泛型版本,请跳过此步骤。)在昭示类中宣称2个委托。为它钦点以
      伊芙ntHandler 结尾的名目。第二个参数钦定自定义 伊芙ntArgs
      类型。
public delegate void CustomEventHandler(object sender, CustomEventArgs a);
    • 使用以下任一步骤,在公布类中宣称事件。
      • 假如未有自定义 伊夫ntArgs
        类,事件类型正是非泛型 伊芙ntHandler
        委托。它无需评释,因为它已在 C# 项目暗许包罗的 System
        命名空间中开始展览了注明
public event EventHandler RaiseCustomEvent;
      • 如若运用的是 伊夫ntHandler
        的非泛型版本,并且您有八个由 伊芙ntArgs
        派生的自定义类,请在昭示类中评释您的事件,并且将您的寄托用作类型
class Publisher
{
    public event CustomEventHandler RaiseCustomEvent;
}
      • 假定采用的是泛型版本,则不必要自定义委托。相反,应将事件类型钦命为
        伊芙ntHandler<Custom伊夫ntArgs>,在尖括号内停放您本身的类的称号。
public event EventHandler<CustomEventArgs> RaiseCustomEvent;

 引发派生类中的基类事件                                      

   
 以下容易示例演示了在基类中扬言可从派生类引发的风浪的科班方法。此情势广泛应用于
.NET Framework 基类库中的 Windows 窗体类。

     在成立可用作别的类的基类的类时,必须思考如下事实:事件是与众差异类其余委托,只好够从评释它们的类中调用。派生类无法直接调用基类中宣称的轩然大波。就算有时你只怕希望有个别事件只可以通过基类引发,但在多数情景下,您应该允许派生类调用基类事件。为此,您能够在包括该事件的基类中成立叁个受保证的调用方法。通过调用或重写此调用方法,派生类便足以直接调用该事件。

namespace BaseClassEvents
{
    using System;
    using System.Collections.Generic;
    public class ShapeEventArgs : EventArgs
    {
        private double newArea;

        public ShapeEventArgs(double d)
        {
            newArea = d;
        }
        public double NewArea
        {
            get { return newArea; }
        }
    }
    public abstract class Shape
    {
        protected double area;

        public double Area
        {
            get { return area; }
            set { area = value; }
        }
        public event EventHandler<ShapeEventArgs> ShapeChanged;
        public abstract void Draw();
        protected virtual void OnShapeChanged(ShapeEventArgs e)
        {
            EventHandler<ShapeEventArgs> handler = ShapeChanged;
            if (handler != null)
            {
                handler(this, e);
            }
        }
    }
    public class Circle : Shape
    {
        private double radius;
        public Circle(double d)
        {
            radius = d;
            area = 3.14 * radius;
        }
        public void Update(double d)
        {
            radius = d;
            area = 3.14 * radius;
            OnShapeChanged(new ShapeEventArgs(area));
        }
        protected override void OnShapeChanged(ShapeEventArgs e)
        {
            base.OnShapeChanged(e);
        }
        public override void Draw()
        {
            Console.WriteLine("Drawing a circle");
        }
    }
    public class Rectangle : Shape
    {
        private double length;
        private double width;
        public Rectangle(double length, double width)
        {
            this.length = length;
            this.width = width;
            area = length * width;
        }
        public void Update(double length, double width)
        {
            this.length = length;
            this.width = width;
            area = length * width;
            OnShapeChanged(new ShapeEventArgs(area));
        }
        protected override void OnShapeChanged(ShapeEventArgs e)
        {
            base.OnShapeChanged(e);
        }
        public override void Draw()
        {
            Console.WriteLine("Drawing a rectangle");
        }

    }
    public class ShapeContainer
    {
        List<Shape> _list;

        public ShapeContainer()
        {
            _list = new List<Shape>();
        }

        public void AddShape(Shape s)
        {
            _list.Add(s);
            s.ShapeChanged += HandleShapeChanged;
        }
        private void HandleShapeChanged(object sender, ShapeEventArgs e)
        {
            Shape s = (Shape)sender;
            Console.WriteLine("Received event. Shape area is now {0}", e.NewArea);
            s.Draw();
        }
    }
    class Test
    {

        static void Main(string[] args)
        {
            Circle c1 = new Circle(54);
            Rectangle r1 = new Rectangle(12, 9);
            ShapeContainer sc = new ShapeContainer();
            sc.AddShape(c1);
            sc.AddShape(r1);
            c1.Update(57);
            r1.Update(7, 7);
            Console.WriteLine();
            Console.WriteLine("Press Enter to exit");
            Console.ReadLine();
        }
    }
}

 贯彻接口事件                                            

   
 接口可表明事件。下边包车型大巴言传身教演示怎么着在类中贯彻接口事件。接口事件的完毕规则与任何接口方法或性质的兑现规则基本相同。

  • 在类中落实接口事件

   
 在类中声称事件,然后在得当的任务调用该事件。

public interface IDrawingObject
{
    event EventHandler ShapeChanged;
}
public class MyEventArgs : EventArgs {…}
public class Shape : IDrawingObject
{
    event EventHandler ShapeChanged;
    void ChangeShape()
    {
        // Do something before the event…
        OnShapeChanged(new MyEventsArgs(…));
        // or do something after the event. 
    }
    protected virtual void OnShapeChanged(MyEventArgs e)
    {
        if(ShapeChanged != null)
        {
           ShapeChanged(this, e);
        }
    }
}

     上边的示范演示如何处理以下的不常见处境:您的类是从两个以上的接口继承的,每一种接口都包括同名事件)。在那种景观下,您至少要为在那之中1个事件提供显式接口实现。为事件编写显式接口实现时,必须编制add 和 remove
事件访问器。那七个事件访问器平时由编写翻译器提供,但在那种状态下编写翻译器不可能提供。

     您能够提供温馨的访问器,以便钦点那多个事件是由你的类中的同一事件表示,依旧由差别事件代表。例如,依照接口规范,要是事件应在差异时间引发,则足以将每一个事件与类中的3个单独完结关系。在底下的以身作则中,订户将造型引用强制转换为
IShape 或 IDrawingObject,从而明确本人将会接受哪个 OnDraw 事件。

namespace WrapTwoInterfaceEvents
{
    using System;
    public interface IDrawingObject
    {
        event EventHandler OnDraw;
    }
    public interface IShape
    {
        event EventHandler OnDraw;
    }
    public class Shape : IDrawingObject, IShape
    {
        event EventHandler PreDrawEvent;
        event EventHandler PostDrawEvent;
        event EventHandler IDrawingObject.OnDraw
        {
            add { PreDrawEvent += value; }
            remove { PreDrawEvent -= value; }
        }
        event EventHandler IShape.OnDraw
        {
            add { PostDrawEvent += value; }
            remove { PostDrawEvent -= value; }
        }
        public void Draw()
        {
            EventHandler handler = PreDrawEvent;
            if (handler != null)
            {
                handler(this, new EventArgs());
            }
            Console.WriteLine("Drawing a shape.");
            handler = PostDrawEvent;
            if (handler != null)
            {
                handler(this, new EventArgs());
            }
        }
    }
    public class Subscriber1
    {
        public Subscriber1(Shape shape)
        {
            IDrawingObject d = (IDrawingObject)shape;
            d.OnDraw += new EventHandler(d_OnDraw);
        }
        void d_OnDraw(object sender, EventArgs e)
        {
            Console.WriteLine("Sub1 receives the IDrawingObject event.");
        }
    }
    public class Subscriber2
    {
        public Subscriber2(Shape shape)
        {
            IShape d = (IShape)shape;
            d.OnDraw += new EventHandler(d_OnDraw);
        }

        void d_OnDraw(object sender, EventArgs e)
        {
            Console.WriteLine("Sub2 receives the IShape event.");
        }
    }
    public class Program
    {
        static void Main(string[] args)
        {
            Shape shape = new Shape();
            Subscriber1 sub = new Subscriber1(shape);
            Subscriber2 sub2 = new Subscriber2(shape);
            shape.Draw();

            Console.WriteLine("Press Enter to close this window.");
            Console.ReadLine();
        }
    }
}

 动用字典存储事件实例                                       

     accessor-declarations
的壹种用法是公然大气的风云但不为每种事件分配字段,而是利用字典来储存那几个事件实例。这唯有在富有更多的风云、但你估量超过50%事件都不会完成时才有用。

public delegate void EventHandler1(int i);
public delegate void EventHandler2(string s);
public class PropertyEventsSample
{
    private System.Collections.Generic.Dictionary<string, System.Delegate> eventTable;
    public PropertyEventsSample()
    {
        eventTable = new System.Collections.Generic.Dictionary<string, System.Delegate>();
        eventTable.Add("Event1", null);
        eventTable.Add("Event2", null);
    }
    public event EventHandler1 Event1
    {
        add
        {
            eventTable["Event1"] = (EventHandler1)eventTable["Event1"] + value;
        }
        remove
        {
            eventTable["Event1"] = (EventHandler1)eventTable["Event1"] - value;
        }
    }
    public event EventHandler2 Event2
    {
        add
        {
            eventTable["Event2"] = (EventHandler2)eventTable["Event2"] + value;
        }
        remove
        {
            eventTable["Event2"] = (EventHandler2)eventTable["Event2"] - value;
        }
    }
    internal void RaiseEvent1(int i)
    {
        EventHandler1 handler1;
        if (null != (handler1 = (EventHandler1)eventTable["Event1"]))
        {
            handler1(i);
        }
    }
    internal void RaiseEvent2(string s)
    {
        EventHandler2 handler2;
        if (null != (handler2 = (EventHandler2)eventTable["Event2"]))
        {
            handler2(s);
        }
    }
}
public class TestClass
{
    public static void Delegate1Method(int i)
    {
        System.Console.WriteLine(i);
    }
    public static void Delegate2Method(string s)
    {
        System.Console.WriteLine(s);
    }
    static void Main()
    {
        PropertyEventsSample p = new PropertyEventsSample();

        p.Event1 += new EventHandler1(TestClass.Delegate1Method);
        p.Event1 += new EventHandler1(TestClass.Delegate1Method);
        p.Event1 -= new EventHandler1(TestClass.Delegate1Method);
        p.RaiseEvent1(2);

        p.Event2 += new EventHandler2(TestClass.Delegate2Method);
        p.Event2 += new EventHandler2(TestClass.Delegate2Method);
        p.Event2 -= new EventHandler2(TestClass.Delegate2Method);
        p.RaiseEvent2("TestString");
    }
}

 事件的异步形式                            

     有二种方式可向客户端代码公开异步效用。基于事件的异步情势为类规定了用来显示异步行为的建议措施。对于相对简单的三十二线程应用程序,BackgroundWorker
组件提供了3个粗略的消除方案。对于更复杂的异步应用程序,请思虑达成多少个顺应基于事件的异步情势的类。

    • “在后台”执行耗费时间职分(例如下载和数据库操作),但不会暂停您的应用程序。
    • 并且执行多少个操作,种种操作完毕时都会接受通告。
    • 等候财富变得可用,但不会终止(“挂起”)您的应用程序。
    • 使用深谙的风浪和委托模型与挂起的异步操作通讯。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图