我喜欢C#3.0特性,特别是lambda表达式,自动实现的属性,或者在适当的情况下也隐式输入局部变量(var关键字),但当我的老板透露我正在使用它们时,他让我不要在工作中使用任何C#3.0功能.有人告诉我,对于大多数开发人员而言,这些功能并不标准且令人困惑,其实用性值得怀疑.我被限制只使用C#2.0功能,他也在考虑禁止匿名方法.
由于我们的目标是.NET Framework 3.5,因此我看不出这些限制的任何原因.在我看来,也许唯一的缺点是我的几个同事和老板(也是程序员)必须学习一些C#3.0的基础知识,这应该不难.你怎么看待这件事?我的老板是对的,我错过了什么吗?在C#是主要编程语言的开发公司中,有没有充分的理由限制这种限制?
随着VS 2010的正式发布,在我的新代码中开始使用部分实现的C++ 0x功能集是否安全?
我现在感兴趣的功能都是由VC++ 2010和最新版本的GCC实现的.这是我必须支持的两个.
就第一句中提到的"安全性"而言:我可以开始使用这些功能(例如,lambda函数),并且仍然可以保证我的代码将在10年内编译成适当符合C++ 0x的编译器.正式发布?
我想我在问VC++ 2010或GCC是否有可能最终像VC++ 6一样; 它是在语言正式标准化之前发布的,因此允许编译严重错误的代码.
毕竟,微软确实说"10是新的6".;)
我最近开始学习Python,我很惊讶地发现1000深度递归限制(默认情况下).如果你把它设置得足够高,大约30000,就会像C一样崩溃.但是,C似乎要高得多.
(Python人员很快指出,你总是可以将递归函数转换为迭代函数,并且它们总是更快.这是100%正确.但这不是我的问题所在.)
我在Perl中尝试了相同的实验,并且在大约1000万次递归中它消耗了我所有的4个ram并且我使用了^ C来停止尝试.显然,Perl不使用C堆栈,但它在执行时会使用大量的内存 - 考虑到调用函数需要做多少工作,这并不是非常令人震惊.
我在Pike尝试过,并且在大约2秒钟内完成100,000,000次递归完全感到惊讶.我不知道它是如何做到的,但我怀疑它将递归转换为迭代过程 - 它似乎没有消耗任何额外的内存.[注意:Pike确实会使琐碎的案件变得扁平化,但是对于更复杂的案件会发生段错误,或者我被告知.]
我使用了这些无用的功能:
int f(int i, int l) { if(i<l) return f(i+1,l); return i; }
sub f { return f($_[0]+1, $_[1]) if $_[0]<$_[1]; return $_[0] };
def f(i,l):
if i<l:
return f(i+1,l)
return i
Run Code Online (Sandbox Code Playgroud)
我很好奇其他语言(例如,PHP,Ruby,Java,Lua,Ocaml,Haskell)如何处理递归以及它们为何如此处理它.另外,请注意,如果函数是"尾递归"(请参阅注释),它是否会有所不同.
language-agnostic recursion language-features language-design
如果C#允许一个?? =运算符,那将是非常好的.我发现自己经常写下面的内容:
something = something ?? new Something();
Run Code Online (Sandbox Code Playgroud)
我宁愿这样写:
something ??= new Something();
Run Code Online (Sandbox Code Playgroud)
思考?新的语言扩展总是存在争议的本质.
据我所知,没有一个显著写以下更优雅的方式....
string src;
if((ParentContent!= null)
&&(ParentContent.Image("thumbnail") != null)
&&(ParentContent.Image("thumbnail").Property("src") != null))
src = ParentContent.Image("thumbnail").Property("src").Value
Run Code Online (Sandbox Code Playgroud)
你认为应该有一个C#语言功能来缩短它吗?
如果是这样,它应该是什么样的?
例如,像延伸?? 操作者
string src = ParentContent??.Image("thumbnail")??.Property("src")??.Value;
Run Code Online (Sandbox Code Playgroud)
为相当人为的例子和我过度简化的解决方案道歉.
编辑...许多年后
这是一个计划的语言功能,称为" 空传播运算符 " ?.
https://roslyn.codeplex.com/discussions/540883(谢谢@Brian)
在Ruby中,对象有一个方便的方法method_missing,允许人们处理甚至没有(显式)定义的方法的方法调用:
当obj被发送一个它无法处理的消息时,由Ruby调用.symbol是被调用方法的符号,args是传递给它的任何参数.默认情况下,解释器在调用此方法时会引发错误.但是,可以覆盖该方法以提供更多动态行为.下面的示例创建一个类Roman,它响应名称由罗马数字组成的方法,返回相应的整数值.
class Roman
def romanToInt(str)
# ...
end
def method_missing(methId)
str = methId.id2name
romanToInt(str)
end
end
r = Roman.new
r.iv #=> 4
r.xxiii #=> 23
r.mm #=> 2000
Run Code Online (Sandbox Code Playgroud)
例如,Ruby on Rails使用它来允许调用诸如的方法find_by_my_column_name.
我的问题是,其他语言支持的等价物method_missing,以及如何在代码中实现等效语言?
我知道在JavaScript中,像这样创建一个for循环:for(int i = 0; i < arr.length; i++)因为它每次都计算数组长度,所以代价很高.对于列表和数组,这种行为在c#中是否代价高昂.或者在编译时它是否经过优化?还有其他语言如Java,这是如何处理的?
这种语言结构叫什么?
在Python中我可以说:
def a(b,c): return b+c
a(*[4,5])
Run Code Online (Sandbox Code Playgroud)
在Ruby中同样得到9.
def a(b,c) b+c end
a(*[4,5])
Run Code Online (Sandbox Code Playgroud)
当一个数组传递给一个需要多个参数的函数时,这叫做什么?
*运营商的名称是什么?
还有哪些语言支持这个很酷的功能?
虽然我理解F#中的自我标识符,但我对这种灵活性的好处感到困惑.为什么F#不仅仅this.Blah像C#一样支持并且完成它?我猜有些人用它来提高可读性,但即便如此,这似乎是一个延伸.那么,这种语言功能的用途/好处是什么?
对于未启动的,下面是一个定义类型范围的自身标识符"self"和方法范围标识符"this"的示例.该示例来自上面链接的MSDN文章.
type MyClass2(dataIn) as self =
let data = dataIn
do
self.PrintMessage()
member this.PrintMessage() =
printf "Creating MyClass2 with Data %d" data
Run Code Online (Sandbox Code Playgroud) 花了一些时间学习函数式编程,我想要使用不执行任何变异的静态方法变得越来越自然.
有什么理由可以抑制这种本能吗?