当前位置: 代码迷 >> C# >> C#畅想/瞎想
  详细解决方案

C#畅想/瞎想

热度:302   发布时间:2016-04-28 08:24:11.0
C#遐想/瞎想
  1. 泛型约束更强大。比如支持有参构造函数、枚举、委托:
    void Foo<T>() where T : new(string, int), enum, delegate
  2. 空值判断符允许对属性/字段赋值:
    obj?.Name = "sdf"; //obj为null则什么也不做
  3. 索引器支持泛型:
    public T this<T>[int i]{    get { return (T)arr[i]; }     set { arr[i] = value; }}
  4. 支持将var作为参数类型,代表匿名类型,这样方法就可以返回匿名类型,完了同样用var接住返回值,并可以智能提示返回对象的属性,这就要求方法中每个return的匿名类型要一致。目前可以用dynamic代替,但就没了智能提示:
    public static var Create<T1, T2>(T1 arg1, T2 arg2){    return new { Item1 = arg1, Item2 = arg2 };}
  5. 支持内联out。这点其实在c#6.0差一点实现,但最终没如愿,我猜原因是在变量作用域上不好处理:
    if (int.TryParse("3", out int i)) //结合类型推断,甚至连int都允许省略{    Use(i);}
  6. 支持静态索引器:
    public static class Package{    static readonly Dictionary<string, int> _dic;    static Package()    {        _dic = new Dictionary<string, int>(3);        _dic.Add("a", 0);        _dic.Add("b", 1);        _dic.Add("c", 2);    }    public static int this[string name]    {        get { return _dic[name]; }        set { _dic[name] = value; }    }}// use exampleUse(Package["b"]);
  7. 支持编译为本机exe/dll,准确说这个是对编译器的遐想。我倒不是为了性能,而是一为不要运行库,二为别让我们的源码赤裸裸的暴露在.net reflactor之流中。是有个.net native,但仅限商店应用,而且似乎太监了。

暂时就扯这些,有新想法再补上。

7楼王健旭
我记得在《c# in via》中说过即使编译成本地代码dll,exe,最终里面还是必须包含IL代码的,等有空的时候我把详细的原因贴出来
Re: ahdung
@王健旭,很期待,这文引来大牛,诚惶诚恐。
6楼Leandro
哈哈,好文章。可以讨论下假设c#要支持这些特性,在目前的clr里是否可以实现。
5楼h82258652
想法不错啊,可以到github上面roslyn那个项目跟老外提议一下的。
Re: ahdung
@Leandro,CLR这层不太懂,只知道有一些是IL支持但C#不支持的,如泛型约束枚举。
Re: ahdung
@h82258652,好的我试试。但我相信我想到的,C#那帮人也想到过,而他们想到的我未必想过。我这些想法其实很不成熟,只是在coding过程中遇到不顺手时,感叹要是能这样能那样就好了,所以只是从使用的角度去设想,而且还只是局限在我的应用场景,如果从实现角度,放到一个普适的范围去考虑,有些想法可能根本逻辑不通,或有歧义。所以他们不实现肯定有他们的道理,而且据我了解还有时间成本上的原因,比如泛型约束支持有参构造,据某知名大牛了解,就是因为要赶别的更重要的功能而将它搁置。终究C#/.net作为一个产品,一定会有取舍和投入产出比方面的考虑,不是很有用的东西如果要花大力气去做,导致延迟发布,延误战略就不值当了~好吧,我还挺能替他们瞎操心的呵呵。
4楼Leandro
使用IL写了如下代码:,,,编译成DLL。在VS中引用该DLL。,,证明C# 还是支持Enum(我想Delegate也是可以的)作为泛型约束的。,不知道为什么直接在VS中写会不允许。
Re: ahdung
@Leandro,非常感谢指教,学习了。我猜是C# team为了赶发布,不够时间测试,怕不妥就没放开吧,毕竟不是非常必要的特性。
3楼rex xiang
https://github.com/dotnet/cli,dotnet core里正在做编译到native的事情。,,例如:dotnet build --native --cpp
2楼SunnyCase
.net native没太监 现在uwp确实可以通过本机工具链生成本机代码,但要让整个.net用上估计比较难 因为用了.net native,就不能反射非public成员 动态il生成也不能用了 很多功能就会受到限制
Re: ahdung
@SunnyCase,有道理,会牵连不少问题。但我觉得还是存在理论可行,一种方案是完全让开发者妥协,你要这样就会失去那样,比如可以在项目属性设置中提供选项【编译为本机PE】,如果勾选,透过编辑器能力,限制代码中出现不支持的用法。类似【允许不安全代码】【检查溢出】那样的选项;,另一种是.net团队尽量做到不减功能,当然这要比上一种费力得多。比如反射的问题,应该可以在PE结构中找到合适的地方放置原.net程序集的元数据,这样对仅仅是获取类型信息这种需求应该是能解决的,但要支持方法调用的话可能就比较难。总之就是能做到的尽量做,做不到的地方就不许你用,一个不完美的方案在实际应用中仍然是有价值的。还是事在人为,就看MS觉得值不值得做这些事。
1楼Leandro
对于静态索引器我做的尝试。,首先对于实例索引器IL修改,修改instance修饰符为static:,,.class public auto ansi SampleClass extends [mscorlib]System.Object{ .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6d 00 00 ) //默认构造方法.method public specialname rtspecialname instance void .ctor() cil managed{ldarg.0call instance void [mscorlib]System.Object::.ctor()ret
  相关解决方案