C# 基础学习3(#if,dynamic,浅拷贝,映射,递归)

1,#if #endif

    private void Awake()
    {
#if UNITY_EDITOR
#warning is unity editor
#else
#error is not unity editor
#endif
    }
#error使您可以从代码中的特定位置生成错误。
#warning 使您得以从代码的特定位置生成一级警告。

2,dynamic

任何实例都能隐式转换为dynamic类型实例,类型为dynamic的任何表达式也能够隐式转换为其他类型。
dynamic d1 = 7; int i = d1;
如果调用一个方法是传递了dynamic类型的对象,或者被调用的对象是dynamic类型的,那么重载的判断是发生在运行时而不是编译时。
dynamic可以简化反射。编译器对dynamic进行了优化,比没有经过缓存的反射效率快了很多。

3,浅拷贝与深拷贝
浅复制:在C#中调用 MemberwiseClone() 方法即为浅复制。如果字段是值类型的,则对字段执行逐位复制,值类型字段的值被复制到副本中后,在副本中的修改不会影响源对象对应的值;如果字段是引用类型的,则复制对象的引用,而不复制对象,因此:原始对象和其副本引用同一个对象!在副本中对引用类型的字段值被修改后,源对象的值也将被修改。

深复制:如果字段是值类型的,则对字段执行逐位复制,如果字段是引用类型的,则把引用类型的对象指向一个全新的对象!实现上一般是在调用MemberwiseClone() 方法之后,在这个基础上创建新的引用类型对象,再将老的引用类型数据复制到新的对象里就行。

4,映射,不是很清楚
参考自该提问:https://q.cnblogs.com/q/76068/  C#中 映射和反射 是不是一回事?
映射只是一种概念,通常是用代码方式来表示一个比较复杂的意义。例如访问网站时404错误的含义是“找不到当前页”,500错误是“服务器内部错误”。那么我们会把这些错误的原因和一些固定的数字对应起来,这就是一种映射。那么体现在程序里,映射用的比较多的地方就是和数据库打交道。我们通常会期望不直接操作数据库而对数据库做出一些改变。那么我们会声明一个类去对应数据库的一张数据表。例如有一张学生表,有学号和姓名两个字段。我们可以在代码里建一个学生类,下面有学号和姓名两个属性,通过一定的技术可以把这个类和那张学生表对应起来,可以实现在操作这个类的时候,却去改变那张表的数据的效果,我们可以称这是一种映射。

反射是一种技术,很多高级语言都有这种技术。具体作用就是通过一个独立存在的对象,可以找到该对象的其他信息,例如该对象是由哪个类实例化而成的。打个比方,有一条狗和一个人,我们通过反射技术,可以得知:这条狗是“狼”科的,这个人是“灵长”类的。(生物知识丢了,可能不太恰当)。那么"狼"和"灵长"这两个词就是我们通过反射所得到的信息,往往很有用。

5,递归
递归分为两种:递归与尾递归。
递归:开辟了多个栈,消耗大。因为里面执行了多个函数。比如:return Fun(i)+Fun(i-1),最后会把所有返回的值都加在一起,然后返回。
尾递归:只开辟一个栈,消耗小。只是一个函数。比如:return Fun(i,tmp); 其中tmp就包含了每一次Fun调用的值。

之前看到一道面试题:计算1-2+3-4+5-6+7-8+9的值,使用多种方法。
//这道题其实是在考递归操作
    int FunWeiDiGui(int i)
    {
        if (i <= 1)
            return 1;
        return (i*(i%2==0?-1:1)+ FunWeiDiGui(i-1));//尾递归
    }
//这种方法更简单,效率也更高
    double FunCall(int i)
    {
        if (i <= 1)
            return 1;
        if (i % 2 == 0)
            return -1 * i * 0.5;
        else
            return -1 * (i-1) * 0.5 + i;
    }

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值