C# 特性

作者: 清水包哟 | 来源:发表于2018-10-24 18:42 被阅读1次

    泛型

    lambda表达式

    匿名函数

    委托

    winfrom界面委托

    在对控件进行操作的时候,可以通过判断当前线程是否为控件所在线程外的线程。如果是,则调用Invoke。

    private void AlertMessage(string message)
    {
        if(InvokeRequired)
        {
            BeginInvoke(new Action<string>(AlertMessage), message);
        }
        else
        {
            MessageBox.Show(message);
        }
    }
    

    也可以直接通过控件类直接调用Invoke方法,底层代码会自己判断线程并将请求委托。

    ConsoleTbx.Invoke(new Action<string>(AlertMessage),message);
    
    private void AlertMessage(string message)
    {
        MessageBox.Show(message);
    }
    

    wpf界面委托

    可以通过控件进行委托

    TextBox1.Dispatcher.BeginInvoke(new Action<bool>(DisableCameraButton), enable)
    

    线程间委托

    不同类不同线程

    不同类之间不同线程使用事件,事件是一种特殊的委托。通过在一个类中将一个方法订阅给另一个类,在另声明了事件的类中调用。

    需要注意的是,既然已经将方法委托出去,方法内代码所属线程必然是调用方所属线程,而不是方法实现所在类的线程中。

    public class A
    {
        public A()
        {
            B b = new B(); 
     
            b.OnEventTrigger += EventMethod;     
        }   
         
        // 自己实现的方法  
        // 其中参数e为方法调用时传递的DataArgs类型的对象 ,通过这个对象访问他的成员变量 
        private void EventMethod(object sender, DataArgs e)
        {
             ...// 方法实现 
        } 
    } 
     
    public class B
    {
        public event EventHandler<DataArgs>  OnEventTrigger; 
    
        public void test()     
        { 
            if(OnEventTrigger != null) 
            {  
                DataArgs d = new DataArgs("Hello World!"); 
                OnEventTrigger(d);
            }  
        }  
    } 
    
    // 自己编写的事件所传递的参数类,继承与EventArgs类  
    public class DataArgs : EventArgs
    {
        public string Message {get; private set;}
         
        public DataArgs(string message) 
        {
             this.Message = message; 
        }  
    }
    

    同一个类不同线程

    当在同一个类中,可以使用更为简单的委托来实现

    public clas A
    { 
        private delegate void TestInvoke(string message);
    
           
     
    }
    

    匿名委托

    匿名委托俗称闭包,就是将一段代码和其中涉及到的数据一起打包委托调用。

    总所周知,在js中,闭包是最常见的一种匿名回调。

    在C#中,我们称之为匿名委托。直接将方法体与数据委托调用,就是将这二者打包发送过去,让其调用。打包的过程就称之为闭包。

    闭包时特别涉及到数据访问问题,方法体对父方法体内的数据拥有访问权限,能够在方法体中直接使用,回调时的数据是闭包时的数据复制。

    相关文章

      网友评论

        本文标题:C# 特性

        本文链接:https://www.haomeiwen.com/subject/azuxtqtx.html