好怪,在邀请回答里但是没有被邀请,嗯。

c#

理由是:学习难度,全能性与兼容性,执行效率与开发效率,语法糖和预期。

现在c#是.Net6和.Net7(预览),看一下.Net6的语法可以是:

之前在某评论区随便写的

1.学习难度:

首先c#可以用visual studio,有着如此高功能的IDE,甚至在2022版上可以教你如何优化代码,省去了很多后续排查错误的问题,这对初学者来说十分有用。而更重要的是,c#有着微软的说明文档,你可以找到各个版本的各种函数的详细说明,而大多数说明在visual studio就可以直接提示你(跟java的eclipse一样且效果高于eclipse)

再有就是很多语法,都不像某些语言会有很多奇奇怪怪的bug,如果两个东西类型不同,就会要求你进行转换,或者干脆就直接禁止这种不安全操作,所以想写出一些很离谱的内容其实不那么容易。比如你用double和int进行计算得到double后,读取时如果要求int是不会直接转换的,是需要你指定int强转,丢失精度来floor一下才允许转换,避免了很多读取时出现3.0+3.0≠6的问题。再就是数据类型的nullable,对于数据可为null的类型可以指定'int'为'int?'来进行空值的判断和处理,在比较时通常不会出现NaN==NaN返回false之类的问题。

2.全能性与兼容性:

c#在学习的时候会涵盖很多基本的编程内容,你需要定义数据类型(不像python,类似java)。而c#的.Net使用的Nuget使你可以很方便的安装各种开源类库来辅助你完成任务(生态)。

重点是它的涉猎范围:

从调用系统dll,你可以很轻松的与c语言或c++编写的类库进行互动;

到多平台开发,如Windows,iOS,Linux。在.Net的支持下可以使用nuget环境来开源,并为同一个项目在不同平台下使用不同package来完成目标。什么?jvm?一会儿讲;

再比如软件的窗口开发,无论是xaml的窗体,还是winform,现在还有跨平台的MAUI都能支持各种平台并且通过visual studio强大的可视化交互让你开发软件就只需要拖拽,选择下拉框,输入参数等简单操作就能解决大多数UI交互,让你能专注在后端的数据处理;

支持手机平板等设备的开发环境和模拟器,允许你开发安卓APP,使用xamarin开发包括iOS、Android、Universal Windows Platform、Watch OS、tvOS和Mac App这些你可能想要涉足的领域;

对于网页开发,visual studio可以方便的部署项目(虽然java也可以,但visual studio汉化香啊)。有着功能强大的core作为支撑,现在进入到了.Net之后合并了framework和core只能说是极其能打。你可以通过.net开发前台后台,数据的传输相比于复杂的提交验证操作来说,更像是对程序内变量的操作一样轻松;

对于游戏开发,unity是对c#有着良好支持的,如果你直接去搞虚幻,难度是偏高的,对其它领域并不是很友好。而c#和unity所能做出的游戏也并不逊色,除了端游的:Inside,坎巴拉太空计划,漫漫长夜,七日杀,VRChat等作品,还有很多手游:

3.执行效率

在不考虑对程序本身进行高度优化的前提下,net的缺点是通常会占用相对较多的内存,但是相比于jvm的启动速度来说,能快速执行代码对于个人开发者来说显然是具有优势的。

再就是如果不对代码进行高度优化,就算是写的很烂的代码,以相同代码移植到java或python上,速度会变慢。我当初用java换成c#的一个主要理由就是执行效率,同样的代码复制粘贴数组操作,在c#上用了50多ms的代码在java用了200多ms,还不包括jvm启动和创建exe时打包exe的繁琐操作。这些java问题大大影响了我的开发效率,虽然这些问题都可以通过优化和熟练来解决,但是对于新手来说,简单好用效率高才是硬道理,我不需要知道那么多优化,简单操作时相同写法更快就行。至于python和java比较,那就仁者见仁智者见智了˃ʍ˂

不过相比于c/c++等语言,c#的效率还是不够快的。但如我上边提到过,c#可以很好的兼容c类语言的类库,你可以在某些模块用c++写后用c#调用,且执行效率不低。这样你就可以在算法等耗时的操作上使用c类进行执行效率优化,而窗体等可视化界面又有c#便利的开发。

无论是开发效率还是执行效率,c#都是中规中矩算是优秀的一门语言。

4.语法糖和预期

这个c#的语法糖,书写的优雅,格式的自由,模块化的多种方式... 如果你用惯了c#,再回去用java,你会头大得很,反过来java的语法基本上在c#上大多都有更萌新友好的实现。如果同时学习两门语言,对于萌新来说c#的可选路径其实更多,完成同一个目的的实现方式很多。

再就是以最开始的那张图举例,到了.Net5之后,也不再强制像java那样去写namespace, class, void, main这些。你可以直接用lambda代替这些工作,相当于书写函数一样来完成任务,这种匿名函数让你在快速开发的时候就跟书写python那样简单轻松。需要被调用的void是可以写在后边的而不需要提前def(和java一样而不同于python)。所以你甚至可以在一个单独的文件里创建出丰富的模块,来满足你的各种需求。使用方便的Func函数可以直接封装需要返回值的操作,对于想要模块化的代码块可以使用Action或直接var act = () => {代码}后调用act();来执行。而函数的传参也支持ref,因此可以直接在匿名方法里通过ref来进行递归/迭代。其中正常传参如java是除了指针对象外不修改原数值,如void foo(int x){x=x+1}的话,传入foo(a)执行后a的值不会改变。但如果使用c#的ref可以重写为void foo(ref int x),在执行foo (a)后,a的值会改变,而不需要返回x进行a=x的操作。再比如对于元组,比如你想在一个函数中同时返回一个int和一个string,就可以直接把这两个数据括号起来写成(32, "hi")而不需要像java一样去定义一个返回类型。只需要在函数的返回数据类型注明(int, string) foo(){...},调用foo();即可。

而我认为最重要的一点是,c#在绝大多数时候,它运行的结果是符合你设计的预期的。

在很多语言中,总会有一些人吹捧一些乱七八糟的操作,还称之为语言特性,好像学会这些语言特性就很光荣一样。 如果我预期得到2,而语言特性让你1+1=3,非要写成1+1-1才能等于2的话,我觉得这是很反人类的。那些所谓的语言特性对于大多数情况来说总是一个又一个的坑,一不小心就会因为“我想这样设计”和“语言特性”的差异而导致结果不符合预期。

拜托,写程序已经很累了,1+1不要等于3,好吗?

而且各种IDE的提示也会告诉你如何去规避某些问题,比如文件的处理会提示你某个操作可能返回的异常。如果你直接写读写文件操作而不写trycatch也会贴心提醒你这里可能异常。如果你的数值可能返回null也会警告你当心null,记得处理掉。当你的语法很无意义啰嗦的时候也会提醒你如何能够优化你的语法,简化语法等。

我喜欢c#的理由便是它在绝大多数情况下你都不需要对这门语言很了解,你就告诉他干什么,它就能返回一个很符合预期的结果。


以上是我作为一个个人开发者,粗浅的尝试过c,Java,c#,python,vb等常见语言后的一些经验。这个经验是很主观且,并不保证其中哪些地方是我对其它语言的行为不够了解所导致了某些不满。

但就这个问题本身来说,我的建议是,c#可以作为你的个人开发用语言,它很舒服。

但之后当你真正有特化的需求时,比如:

数据分析(Python,R语言等),网络开发/跨平台(Java),人工智能(Python),游戏(类C),办公(vb),硬件交互(类C),软件开发(C#)

这些语言各有自己的优缺,当你有需要的时候,可以再多学几门语言,毕竟虽然c#功能很广,但我觉得python也应当作为第二个需要学习的语言。

哦对了,学会了c#之后,Java也不难,语法差不多,就是有点难受


题外话:我就是对Java和python有偏见,有Java吹和python吹可以不用讲了,说了我也不会听,没意义,咱就是跨平台不兼容了哈。你是大佬来说Java怎么写够快Python怎么写够快,我就说对萌新不友好,太复杂!懒得学~ 你要是萌新来说你觉得其它语言没这么差,我就说你懂个球。哈哈哈我好坏。

不过,中肯的建议和对语言特性的一些建议我是会认真听取的,我也希望能学到Java和Python上某些优秀的特性,因为我经常也会用到,也希望自己能进步。