对 C# 未来的期望



接触 C# 一年,总体上是一个非常完善的语言,但是某些细节特征还是不够完美。这里记下我现在对它将来的一些期望。
更强大的泛型约束
与 C++ 的模板相似,C# 的泛型使得编写适用于多种类型的代码更加简洁。如果没有泛型,我们可能需要使用 object 并执行类型转换,或者针对每一种类型写大量雷同的代码。在泛型类型约束上,C# 一如既往的严格,但是由于泛型约束还不完善,有时不得不写一些重复的代码。比如下面这个例子:
public static T MaxT(T a, T b) where T is int or long or float or double
{
return a = b ? a : b;
}

可惜现在的 C# 还没有这个功能......System.Math 的做法就是为各种类型分别写一个 Max 方法。
关于C#的泛型约束参考这里:类型参数的约束,模板与泛型的区别:C++ 模板和 C# 泛型之间的区别。
命名空间范围的访问修饰
C# 提供了 internal 访问修饰符来保护程序集内部类型或成员,但是实际开发中我们经常也需要在一个程序集中划分子模块。为了更清楚的把 同一个子模块内部的类之间公开的内容 不同的子模块之间公开的内容 区别开,希望未来 C# 可以提供命名空间范围的访问修饰。比如下面这个例子:
namespace Moudle
{
public class Common { ... }
private class Secret { ... }
}

添加 private 类型的访问修饰,这样 Common可以访问 Secret,Secret 类型在 Moudle命名空间可见,对 Moudle 之外是不可见的。注意,现在的 C# 不允许命名空间内的元素声明为 private 或 protected。C++ 中的友元也可以解决这个问题,但是我猜你们都不喜欢 friend。。。
使用内部类可以一定程度上解决这个问题,但是太不自由了。在 Unity 开发中这个问题更严重,因为脚本组件必须写在单独的文件、且不可以为内部类。
可定义变量的引用
C# 支持在方法参数上使用 ref 和 out 关键字来引用实参,这对结构类型非常重要,否则你很难通过方法来修改结构本身的值。但是可能是为了避免 C# 太过复杂,所以这个特性仅限于方法参数。这样我们经常遇到看起来很不正常的问题。比如 foreach 遍历结构类型集合无法修改值,用下标遍历结构数组只能使用数组名+ 。为了避免太复杂,可以限制仅可以定义一级引用。
foreach(ref Vector3 position in positions)
{
position.x = 0;
}

更自由的扩展方法
现在的扩展方法必须写在单独的静态类里,而且必须使用了命名空间才可以使用。这就是一个没有意义的限制。我们按功能模块来划分代码,发现某一个方法使用扩展的形式来编写更优雅,于是不得不把这个方法拿出去,放到某个名字没有意义的静态类里。这太无聊了!另外,扩展方法不支持以属性的形式扩展、不支持以引用的形式扩展,都是需要改进的。
class MyClass
{
public static DoSomething(this OtherClass obj, ...) { ... }
public static getSetSomething(this OtherClass obj){ get {...} set{...} }
public static void ModifyValue(this ref ValueType value) { ... }
}

更简洁的命名空间使用规则
看这个例子:
using A.B;
class MyClass { A.B.C.OtherClass x; }

在不使用任何命名空间时,需要如上面那样写一长串代码;using A 的情况下,你还是得写这么一串。如果命名空间层次太多时,你要么using到类所在的命名空间,要么从头写起前缀。这太不智能了。希望可以正确的识别子命名空间。
using A.B;
class MyClass { C.OtherClass x; }
声明:此篇文档时来自于【狗刨学习网】社区-unity极致学院,是网友自行发布的Unity3D学习文章,如果有什么内容侵犯了你的相关权益,请与官方沟通,我们会即时处理。




猜你喜欢

转载自blog.csdn.net/book_longssl/article/details/44489847
C#
今日推荐