2021-03-08 C# 扩展方法,Lambda表达式

扩展方法(C# 编程指南)

扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种静态方法,但可以像扩展类型上的实例方法一样进行调用。 对于用 C#、F# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中定义的方法没有明显区别。

Lambda 表达式(C# 引用)

表达式 lambda,表达式为其主体:

(input-parameters) => expression

语句 lambda,语句块作为其主体:

(input-parameters) => { <sequence-of-statements> }

如果 lambda 表达式不返回值,则可以将其转换为 Action 委托类型之一;否则,可将其转换为 Func 委托类型之一。 例如,有 2 个参数且不返回值的 Lambda 表达式可转换为 Action<T1,T2> 委托。 有 1 个参数且不返回值的 Lambda 表达式可转换为 Func<T,TResult> 委托。

Thread声明、锁安全:

其中C#中的Thread t = new Thread(new ThreadStart(name))和Thread t = new Thread(name)有区别吗?
这两者是没有区别的,因为MSDN官方是说可以省略ThreadStart或ParameterizedThreadStart来委托构造函数。即在Thread里面函数是委托函数。

为什么当使用没有函数的代码时,Thread要使用如下格式:
 

                thread = new Thread(() =>
                    {
                        while (true)
                        {
                            moveCheck();
                        }
                    });

Lock机制

//需要加锁的静态全局变量
        private static bool _isOK = false;
        //lock只能锁定一个引用类型变量
        private static object _lock = new object();
        static void MLock()
        {
            //多线程
            new System.Threading.Thread(Done).Start();
            new System.Threading.Thread(Done).Start();
            Console.ReadLine();
        }
 
        static void Done()
        {
            //lock只能锁定一个引用类型变量
            lock (_lock)
            {
                if (!_isOK)
                {
                    Console.WriteLine("OK");
                    _isOK = true;
                }
            }
        }

注意:这里使用到了lock安全。需要注意的是,Lock只能锁住一个引用类型的对象。另外,除了锁机制外,高版本的C#中加入了async和await方法来保证线程安全,如下所示:

public static class AsynAndAwait
 {
        //step 1 
        private static int count = 0;
        //用async和await保证多线程下静态变量count安全
        public async static void M1()
        {
            //async and await将多个线程进行串行处理
            //等到await之后的语句执行完成后
            //才执行本线程的其他语句
            //step 2
            await Task.Run(new Action(M2));
            Console.WriteLine("Current Thread ID is {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
            //step 6
            count++;
            //step 7
            Console.WriteLine("M1 Step is {0}", count);
        }
 
        public static void M2()
        {
            Console.WriteLine("Current Thread ID is {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
            //step 3
            System.Threading.Thread.Sleep(3000);
            //step 4
            count++;
            //step 5
            Console.WriteLine("M2 Step is {0}", count);
        }
}

C# 委托和方法

委托是一种特殊的引用类型,它将方法也作为特殊的对象封装起来,从而将方法作为变量或参数进行传递

DaulFunction fun1=new DualFunction(Sub);

DualFunction fun1=Sub;//这两种方式也行

还可以将委托对象放在数组中  比如

static void Main()
{
DualFunction[] funs = new DualFunction[] { Add, Sub, Mul, Div };
double a=2.5, b=2.0;
Console.WriteLine("请选择函数(加0减1乘2除3):");
int i = int.Parse(Console.ReadLine());
funs[i](a, b);
Console.ReadLine();
}

一个委托对象还可以封装多个方法   委托对象的合并和删除  比如DualFunction fun1 = funs[1] + funs[2];

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值