yuyuyouling 发表于 2023-10-16 16:51:48

C# 有什么惊艳到你的地方?

C# 有什么惊艳到你的地方?

norris1109 发表于 2023-10-16 16:52:17

旁边的java团队leader正在跟小弟们炫耀jvm“调优” 技巧, 我抿嘴一笑 ,起手 struct 、fixed、unmanaged、unsafe、stackallocmarshal 默默默写起了 0gc 代码。

kino 发表于 2023-10-16 16:53:01

极高的上限,你甚至能借助 unsafe 手动实现一个 JIT:
using Iced.Intel;
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using static Iced.Intel.AssemblerRegisters;

unsafe
{
    var kernel32 = NativeLibrary.Load("kernel32.dll");
    var virtualProtectEx = (delegate* unmanaged<nint, void*, nint, int, out int, bool>)NativeLibrary.GetExport(kernel32, "VirtualProtectEx");
    var processHandle = Process.GetCurrentProcess().Handle;

    var asm = new Assembler(64);
    asm.lea(rax, rcx + rdx);
    asm.ret();

    using var stream = new MemoryStream();
    asm.Assemble(new StreamCodeWriter(stream), 0x0);
    var code = stream.ToArray().AsMemory();
    using (var handle = code.Pin())
    {
      virtualProtectEx(processHandle, handle.Pointer, code.Length, 0x40, out _);
      var f = (delegate*<int, int, int>)handle.Pointer;
      Console.WriteLine(f(2, 3));
    }

    virtualProtectEx = null;
    NativeLibrary.Free(kernel32);
}
运行将会输出 5。

轻雨风飘 发表于 2023-10-16 16:53:40

使用C#有12年了,02开始使用java,是国内第一批做java和j2ee的人,后来回到实验室埋头生物实验和perl、matlab等,毕业后做的工作是硬件编程,当初因为频繁使用COM和ActiveX等,开始使用C#,但是所有工作都局限于硬件和windows界面。C#惊艳地方太多,语法合理简单,支持windows几乎所有技术,一个dllimport就能无缝使用其他dll和win32方法,使用COM和ActiveX也和使用一个类一摸一样,方法事件无缝搞定,加几个标签,就能完成COM和ActiveX的编写,宇宙无敌的vs更是让开发傻瓜化,一般项目,经常一个人就能搞定,代码易读多人合作简单,windows下开发无敌一样存在。
更厉害的是C#和WPF的组合,自己突然想挑战下自己,就写了一个图形化编辑器,WPF界面绑定数据,让整个界面显示,几个类就完成了,各种关系全在xaml里边,编码也少的很,windows下应用绝对是非常赞的技术,不过windows应用在国内太边缘化了,好技术压不住巨硬各种折腾,跨平台太晚,silverlight飞快放弃,WPF没有优化好,就转到UWP,然后又有Xamarin,最近又要折腾什么MUI(具体记不清名字),dotnet和dotnet core导致很多东西很混乱,最近又要合并成dotnet 5,让太多微软技术栈的开发者,需要不停的学习新技术,然后再被抛弃掉,巨硬的脚步很难跟随。

eduportal 发表于 2023-10-16 16:53:49

作为一名用C#写游戏服务器,C#写Unity3D客户端的人,逻辑的复用简直太爽了!还要啥自行车?马上unity3d的webassambly要出正式版了,瞬间感觉自己被全栈了。。。。我一直主张程序员要把尽可能多的脑细胞放在业务逻辑上,一天工作完成,你就可以回家啦!C#几行代码就能完成的事,非要用几十行几百行去做,无聊不?又不是啥高深代码。。。。。这个地方用这语言,那个地方用别的语言整个项目丑的一匹。
基本语言特性我不说了,大家说的都很全面。我只能结合我的工作说一下。首先就是我这里服务器客户端全部C#,核心逻辑代码两边通用,省时省力不容易出错。而且说实话,高手用C#写的服务器,还是巨快巨稳定的。再次就是C#要感谢unity3d的选择和不离不弃,没有unity3d,C#真走不了这么远。unity3d的IL2TPP,让你用C#写代码,发包时替你编译成本地代码,完全就是C#的工作效率加本地代码的运行效率,值类型我有,指针我也有,写的够叼unity3d编译出来运行效率奇高。我还要啥c++自行车?

tubal 发表于 2023-10-16 16:54:40

很多游戏开发者都是由于Unity而“被迫”使用C#的。但用过一段时间,就会由衷赞叹:真香。
如果有些同学没感觉到很香,有可能是没有仔细和其它语言比较 :)
1、C#良好兼容了值类型/引用类型,在发展中逐步解决了其他高级语言没解决好的问题

纵观主流语言,C语言在语法上是以值类型为基础,借助指针实现引用类型;而Python/Lua等语言,是以引用类型为基础。
论性能和细节控制力,C语言的设计上限更高;但是论简易程度,Python更为统一、易用。这一基本矛盾在之前的语言里都没有解决好。
而C#很好的总结了前人的经验,在基础语法上就区分了值类型和引用类型。对初次接触编程的同学来说这一点容易造成学习障碍,但是只要掌握了它,就会给实际工作带来极大便利。
反观历史,C#也曾经因为 值类型/引用类型 保守诟病,“拆箱”和“装箱”一直是个招黑的设计。但后来我们看到,随着泛型的成熟和普及,随着泛型容器代替通用容器,装箱和拆箱的问题已经在很大程度上解决了。

http://pic1.zhimg.com/v2-772f4a1d943e5928db68a5107d5aa68b_r.jpg?source=1940ef5c
还有对异步的支持等等,C#的设计最初带来了一些问题,但是最终还是交上了一份满意的答卷。
2、充分利用栈空间,非常高效,做了一部分C/C++擅长的事

值类型有一大特点,就是能充分利用栈空间。高级语言的GC特性一直饱受诟病,但下面的Unity常见代码,运行时没有GC:
// 通过输入的三维向量,移动物体的位置
void Move(Vector3 input)
{
    // 演示代码,有意分成很多行
    input = input.normalized;
    Vector3 move = input * 2.0f;
    move *= Time.deltaTime.
    transform.position += move;
}这段代码没有在堆上分配空间,你所看到的操作全都是在栈上进行的,GC压力为0。我认为这是C#最令人惊艳的一点。
一般来说数组长度较长,默认分配在堆上。但是C#也提供了便利的语法,在栈上分配数组,对项目后期优化来说简直是神技:
public void unsafe foo()
{
    int* bar = stackalloc int ;
}没错,C#依然保留了指针,但一般仅用于局部的unsafe代码。在局部热点可以完全解放性能。
3、良好的语法设计和库函数设计,引导程序员写出更快且更自然的代码

C#中最常用的容器List,也具有一些良好的设计(当然其它语言也有类似的优点)
      // 新建一个list,长度为0。但在堆中预留10万个位置
      List<int> list = new List<int>(100000);
      // 加入很多元素,由于容量足够没有GC
      for (int i=0; i<89000; i++)
      {
            list.Add(i);
      }
      // 用过以后清空list,长度变成0
      list.Clear();
      // 但容量还是10万,继续增加元素还是没有GC
      for (int i = 0; i < 99000; i++)
      {
            list.Add(i);
      }list在预留空间充足时,添加元素不会产生GC。而且List和值类型结合使用,在内存占用上也有优势。当然,很多其它语言也有类似的设计,可以说别的语言做的好的部分,C#做的也一样好。
4、继承、泛型、接口、类型约束等等高级特性,都有着良好且自洽的设计

最初接触C#的时候,看看int的原型,收获很大:
    public struct Int32 : IFormattable, IConvertible, IComparable, IComparable<Int32>, IEquatable<Int32>
    {
      // ....
    }熟悉C++的人,经过思考,可以很好的理解IComparable、IEquatable以及它们的泛型形式。同时也能猜出“Interface”的概念。思考C#的底层设计,给人的感觉就是自然、规范、恰到好处。
总之,C#语言及其标准库的设计,非常值得借鉴和推崇。

C#的良好设计让它在游戏开发领域走出了一条光明大道,在其它领域也有着越来越广泛的应用。
C#出现较晚,算是当今所有语言的集大成者。现在它的发展主要受市场环境制约。也许几年以后,会有新的语言在它的基础上更上一层楼 :)
页: [1]
查看完整版本: C# 有什么惊艳到你的地方?