- 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;}
- 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){}
- 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)){}
- 空值:
products.Where(p=>p.Price == null)
- 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);
}
- 编码规范:
- 使用代码段的形式的全能代码//Snippet帮生成类结构
- 委托
- 委托封装了包含特殊返回类型的一组参数的行为
- 事件不是委托实例,只是成对的add/remove方法
class
是引用类型,struct
是值类型;装箱机制转换为引用- 泛型有两种形式:泛型类型(包括类,接口,委托和结构)和泛型方法
- 类型约束和类型判断
- 反射的一切都是围绕“检查对象及其类型”展开的,
System.Type
的引用最为关键 - 当SomeType只描述返回类型参数的操作时候,协变是安全的;当只描述接受类型参数的时候,逆变是安全的
Nullable<T>
,A ?? B
空合并操作符- Net中迭代器是通过
IEnumerator
和IEnumerable
接口以及它们的泛型等价物封装的 - 分部类型:一个类可以再多个文件中间写,减少继承链复杂带来的封装问题,
partial
(用于单元测试) - 分部方法:生成代码和手写代码自动交互,如果没有生成编译器会移除声明
- 静态类型:(所有成员静态,直接重object派生,不应有状态除非涉及高速缓存或单例,不存在可见构造函数,seal)
- C#里面不能把属性本身设为私有而让取值方法设为公有。。。?
- #progma来临时删除警告/checksum
- 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 () {
}
}