深入理解C# 第一,二部分笔记

  1. C#的演变(属性)
    • C#1:只读属性,弱类型集合
    • C#2:私有属性赋值方法,强类型集合
    • C#3:自动实现的属性,增强的集合和对象初始化
    • C#4:命名实参更清晰的调用构造函数和方法
//2
string name
public string Name{
    get {return name;}
    private set {name = value;}
}

//3
public string Name{get; private set;}
  1. C#演变(排序函数)
    • C#1: 弱类型的比较功能,不支持委托排序
    • C#2:强类型的比较功能,委托比较,匿名方法
    • C#3:表达式,扩展方法,允许列表保持未排序状态
//2
products.Sort(delegate(Product x, Product y){return x.Name.CompareTo(y.Name);}
products.Sort((x,y) => x.Name.CompareTo(y.Name));
//3
foreach(Product product in products.OrderBy(p=>p.Name){}
  1. C#演变(查询)
    • C#1:条件操作紧密结合,两者都是硬编码
    • C#2:条件操作分开,匿名方法使得委托变得简单
    • C#3:Lambda表达式
// 2
products.FindAll(delegate(Product p){return p.Price > 10;})
    .ForEach(Consorl.WriteLine);
// 3
foreach(Product product in products.Where(p=>p.Price > 10)){}
  1. 空值:products.Where(p=>p.Price == null)
  2. LINQ:语言继承查询,隐式类型局部变量var
// 卧槽
List<Product> products = Product.GetSampleProducts();
List<Supplier> suppliers = Supplier.GetSampleSuppliers();
var filtered = from p in products
                join s in suppliers
                    on p.SupplierID equals s.SupplierID
                where p.Price > 10
                orderby s.Name, p.Name
                select new{SupplierName = s.Name, ProductName = p.Name};
foreach (var v in filtered){
    Console.WriteLine("Supplier={0}, Product={1}",v.SupplierName, v.ProductName);
}
  1. 编码规范:
    • 使用代码段的形式的全能代码//Snippet帮生成类结构
  2. 委托
    • 委托封装了包含特殊返回类型的一组参数的行为
    • 事件不是委托实例,只是成对的add/remove方法
  3. class是引用类型,struct是值类型;装箱机制转换为引用
  4. 泛型有两种形式:泛型类型(包括类,接口,委托和结构)和泛型方法
  5. 类型约束和类型判断
  6. 反射的一切都是围绕“检查对象及其类型”展开的,System.Type的引用最为关键
  7. 当SomeType只描述返回类型参数的操作时候,协变是安全的;当只描述接受类型参数的时候,逆变是安全的
  8. Nullable<T>,A ?? B空合并操作符
  9. Net中迭代器是通过IEnumeratorIEnumerable接口以及它们的泛型等价物封装的
  10. 分部类型:一个类可以再多个文件中间写,减少继承链复杂带来的封装问题,partial(用于单元测试)
  11. 分部方法:生成代码和手写代码自动交互,如果没有生成编译器会移除声明
  12. 静态类型:(所有成员静态,直接重object派生,不应有状态除非涉及高速缓存或单例,不存在可见构造函数,seal)
  13. C#里面不能把属性本身设为私有而让取值方法设为公有。。。?
  14. #progma来临时删除警告/checksum
  15. fixed:再结构外额外申请内存

由于unity5.4使用C#卡再2.0,那先码个书签在这~

附录:打印unity C#版本:

using UnityEngine;
using System.Collections;
using System.Reflection;

public class scri : MonoBehaviour {

    // Use this for initialization
    void Start () {
        Type type =Type.GetType("Mono.Runtime");
        if(type !=null)
        {
        MethodInfo displayName = type.GetMethod("GetDisplayName",BindingFlags.NonPublic|BindingFlags.Static);
        if(displayName !=null)
        Debug.Log(displayName.Invoke(null,null));
        }
    }

    // Update is called once per frame
    void Update () {

    }
}
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页