在询问时,我大部分时间都在使用 Python,虽然我对它们的工作方式有一个(基本的)想法,但我并没有经常使用 Java 或 C#。我正在考虑可能开始更多地使用 Java 或 C#,但从我对它们的了解来看,它们似乎不像 Python 那样“可定制”,但我可能错了。
通过“可定制”(可能有更好的短语来描述我的意思,但我想不出更好的 :-) ),我的意思是 Python 中的事情,例如:
__getattr__等)__getitem__、__setitem__、 和__delitem__等“魔术”方法进行映射和序列模拟所以,我想知道 Java 和 C# 中是否有(至少一些)这些“定制”类型的东西,如果没有,是否有功能相似或等效的方法来做这些事情?
作为一种完全动态的语言,Python 在这里总是比 C# 和 Java 等静态语言更具优势。Java 和 C# 传统上也针对更保守的市场,使它们在设计上更加保守。尽管 C# 在每个新版本中都获得了越来越多的面向动态的特性。
Dynamic object attributes definition (using __getattr__, etc.)
Run Code Online (Sandbox Code Playgroud)
这可以在 C# 4.0 中使用新的动态支持来完成。随着IDynamicObject在C#中有可能实现“的method_missing”(ALA红宝石)。然而,这样做确实违背了语言的整体意图和“感觉”,而且我在实践中从未见过它(ASP.NET MVC 的 ViewBag 可能是个例外)
Operator overloading
Run Code Online (Sandbox Code Playgroud)
C# 有运算符重载。然而,根据我的经验,它几乎从未使用过。
Subclassing of built in types
Run Code Online (Sandbox Code Playgroud)
仅当类型未密封时。如果它是密封的,扩展方法通常可以解决问题。C# 中的许多/大多数内置类型都是密封的。
Mappings and sequence simulation using __getitem__, __setitem__, and __delitem__, etc., "magic" methods
Run Code Online (Sandbox Code Playgroud)
实现IEnumerable<T>可能是您在 C# 中的最佳选择。这将使您的类型挂钩到 LINQ 并“免费”获得各种好东西
我对 Python 的经验很少,我的“选择的动态语言”是 Ruby。自从 C# 首次亮相以来,我也一直从事专业工作。C# 真的走了很长一段路,并且已经成长为一种相当不错的语言。它确实有一种“厨房水槽”的感觉,起初可能会令人生畏。但在大多数情况下,它确实很好地结合在一起。但是,C# 中不存在 Ruby 的流动性、灵活性、功能和滥用潜力。一个铁杆的 ruby-ist(大概是 python-ist)几乎肯定会发现 C# 令人沮丧和限制。C# 在很大程度上仍然是一种“企业”语言,而且永远都是。