版版有王暴 发表于 2023-10-30 11:10:16

大学编程入门为什么不以C#作为首选?

作为一个拥有优秀语法结构,内存托管的语言,实在想不出有什么理由被过时的C与一锅乱炖C++所替代。让没有基础的人不去理解指针与过于复杂的结构,以C#入门后再结合自身能力去了解岂不更好?
是啊,我们要在windows上面写软件,原来都是用vb拖拽的,少量代码就可以四两拨千斤。如今c#什么都有生态链都健全了,你看做游戏有unity3d,还可以跨平台,什么游戏机都能做。数据库啥的,直接跟sql server进行对接。而且vs编辑器功能多强大啊,很多人第一个编辑器可能是记事本,第二个就被介绍用了vs编辑器。
我们根本不用管那么多啊,只需要能把自己的思想,转化成软件,在各大平台上面运行就行了嘛。你看c#多好,当初只是在windows平台上面运行,现在不是跨平台了嘛。你看这是一个多么开放的编程语言啊。
不过我就是有一点担心,一旦它的发展公司出了问题,那么c#会被谁接管?还是。。说。。。唉,人无远虑必有近忧啊。

七笼猪 发表于 2023-10-30 11:11:02

教学语言我只推荐c和python

cdra 发表于 2023-10-30 11:11:27

大体上是因为想增加学生就业率。而且有段时间买Visual Studio很贵。 学校虽然有减价、免费的, 外面公司买不起...进而会影响就业。
我读中学的时候, 感觉学校的想法就是中学编程基本上教什么都可以, 只要能上手就行。 老师当时第一个学期教了Agent Sheets(几乎纯教学用的语言),而第二个学期教了Visual http://Basic.NET, 基本上也就是写点字符变换之类的东西。 因为反正也不指望我们中学学的东西有什么用, 所以老师专门捡了些容易提升学生兴趣的东西教。到现在我都还是很怀念当年用.NET写东西的时候。
后来我要上大学了。我入学前在一个学校面试时, 一个老师就告诉我, 电脑系人挺少的, 而且他们学校电脑系毕业率才4%(都转行了)。当时我旁听了一节他讲递归的课。 那节课上有2-3个学生——这就是他整个电脑系的大三学生了。怎么说呢, 我当时在想...既然电脑系这么冷门、毕业率还这么低, 等我毕业时不是刚好适合就业? 于是修了个电脑专业。
我入学时学校刚把基础课从C++转到Java。系里当时说市面上Java比较好找工作, 学生上手Java也比C++容易, 不那么容易造成学生学不下去,然后转行。 所以整个教育体系就在改成以Java为主的。 有很多老师当时对此耿耿于怀, 觉得这样没法教学生指针了, 还鄙视Java。 顺带一提, 敌视微软的老师也挺多的, 所以几乎没人用C#。 有些老师继续沿用Python或者C++去授课、让学生做作业。
结果又怎么样呢?大一入学了100多人的电脑系, 跟我一起毕业的才8个人。别的系毕业时都黑压压一片人上去庆祝,电脑系就孤苦伶仃的几个小伙伴(还好我还修了别的专业, 于是抛弃他们跟别人庆祝去...)。 大多跟我们一起入学的电脑系同学, 第一个学期就不干了, 转去了外语系和数学系之类的(跟咱电脑系一栋楼)。基础课上的是C++, C#,还是Java? 感觉根本不重要。 毕业时哪门语言我们不会呢? 关键是四年得读下来啊。 不过当时电脑有点冷门, 所以也可以理解了。我国内的同学当年就不少都读了会计、金融之类的。
然后我2010年毕业的时候傻不拉几地去考了研...

qijian 发表于 2023-10-30 11:12:02

可能是太难了吧。C# 指针链表什么的,当年难倒了一堆同学。
using System;
using System.Runtime.InteropServices;

namespace ThisAssembly {
    using static Module;

    public static class Module {

      public static unsafe T* Alloc<T>() where T : unmanaged {
            return (T*)(void*)Marshal.AllocHGlobal(sizeof(T));
      }

      public static unsafe void Free<T>(T* ptr) where T : unmanaged {
            Marshal.FreeHGlobal((IntPtr)ptr);
      }
    }

    public unsafe struct SinglyLinkedListNode<T> where T : unmanaged {
      public T Value;
      public SinglyLinkedListNode<T>* Next;
    }

    public unsafe static class SinglyLinkedListNode {

      public static ref SinglyLinkedListNode<T>* SeekByIndex<T>(
            ref SinglyLinkedListNode<T>* head,
            int index) where T : unmanaged {

            if (0 > index) {
                throw new IndexOutOfRangeException();
            }
            ref var current = ref head;
            for (var i = index; i > 0; --i) {
                if (current is null) {
                  throw new IndexOutOfRangeException();
                }
                current = ref current->Next;
            }
            return ref current;
      }

      public static void Insert<T>(
            ref SinglyLinkedListNode<T>* node, T value) where T : unmanaged {

            var t = Alloc<SinglyLinkedListNode<T>>();
            t->Value = value;
            t->Next = node;
            node = t;
      }

      public static void Remove<T>(
            ref SinglyLinkedListNode<T>* node) where T : unmanaged {
            if (node is null) {
                throw new ArgumentNullException(nameof(node));
            }
            var t = node;
            node = t->Next;
            Free(t);
      }

      public static void InsertByIndex<T>(
            ref SinglyLinkedListNode<T>* head, int index, T value) where T : unmanaged {

            Insert(ref SeekByIndex(ref head, index), value);
      }

      public static void RemoveByIndex<T>(
            ref SinglyLinkedListNode<T>* head, int index) where T : unmanaged {

            Remove(ref SeekByIndex(ref head, index));
      }

      public static ref T GetValueRefByIndex<T>(
            ref SinglyLinkedListNode<T>* head, int index) where T : unmanaged {

            return ref SeekByIndex(ref head, index)->Value;
      }

      public static void SetValueByIndex<T>(
            ref SinglyLinkedListNode<T>* head, int index, T value) where T : unmanaged {

            GetValueRefByIndex<T>(ref head, index) = value;
      }

      public static T GetValueByIndex<T>(
            ref SinglyLinkedListNode<T>* head, int index) where T : unmanaged {

            return GetValueRefByIndex<T>(ref head, index);
      }

      public static void Clear<T>(
            ref SinglyLinkedListNode<T>* head) where T : unmanaged {

            for (ref var current = ref head; current is not null; Remove(ref current)) {
            }
      }

      public static void ForEach<T>(
            in SinglyLinkedListNode<T>* head,
            delegate* managed<T, void> action)
            where T : unmanaged {

            for (var current = head; current is not null; current = current->Next) {
                action(current->Value);
            }
      }
    }
}

namespace ThisAssembly {
    using static Module;
    using static SinglyLinkedListNode;

    public unsafe static class Program {

      public static void Print(int x) {
            Console.Out.Write(x);
      }

      public static void Main() {
            for (var i = 0; 1000000000 > i; ++i) {
                SinglyLinkedListNode<int>* list = default;
                Insert(ref list, 4);
                Insert(ref list, 9);
                Insert(ref list, 5);
                RemoveByIndex(ref list, 1);
                Insert(ref list, 0);
                Insert(ref list, 1);
                InsertByIndex(ref list, 3, 1);
                Insert(ref list, GetValueByIndex(ref list, 3));
                SetValueByIndex(ref list, 2, 4);
                ForEach(in list, &Print);
                Console.Out.Write('\n');
                Clear(ref list);
            }
      }
    }
}

csyxd 发表于 2023-10-30 11:12:41

——12月21修正。。
C语言里有排序方法,感谢评论里的指正(我对C不了解,不过还是用C语言入门很经典,代码更接近底层(不要再告诉我C#有非托管unsafe,我也知道有))
刚刚才看到王者荣耀居然是用Unity3D+C#写的_(°ω°」∠)_而且好多中大型手游都是unity+C#
unity3d的后台语言之一C#是基于xaramin的,这点是我孤陋寡闻了,我也才是个实习生
unity3d的语言现在好像只有C#了?那么这样来看,C#好像也不是不火啊
嗯,打算过过就开始搞unity3d
————————
先学C,再学C++/java/C#/python
这本身就是个由复杂到简单的过程,高级语言里抽象了很多方法,像C语言里手动写个排序,C++和C#一个函数就解决了,如果让你直接用方法,很多的逻辑思维你就学不到
C是很根本的东西,用C去学基础的东西很适合。
打个比方,你得先学加减乘除,再去用计算器
此外,纠正一点,C和C++目前可以说永不过时,桌面端的主流依旧是C++,底层开发特别是自动化依旧是C/C++
安卓java的话不知道以后会不会被kotlin之类的取代掉,java代码繁杂是众所周知的,写个代码都要花好多时间
不过kotlin依旧是基于JVM
而且,好些年以内还是不可能被取代的,各个公司都已经有自己的框架了
python正在迅速崛起,要学
C#之所以不火
你要明白C#的优点:开发周期大幅缩短,入门比较容易,上手快,一个人做一个项目不再是难题。还有天下第一IDE如虎添翼
缺陷也很明显:.NET框架的互不兼容(3.5,4.0,4.5),微软老是喜欢干这种没屁眼的事,出了新的就扔旧的。开发一个程序需要准备好几个版本?虽然最简便的方法还是用3.5,在代码里写上对4.0和4.5以上的支持,但是并不能保证不会出错。
不火的原因一是因为之前C#的不开源。现在跨平台方面有了mono和xamarin,但是用起来比较麻烦,而且mono不支持WPF的跨平台,winform做出来好看的界面不容易,分层也不如WPF。
然鹅,WPF的性能相比QT C++,差的太多了(具体例子参见QQ概念版之死)
xamarin可以用C#来写安卓,但国内你见几个人用过?学习成本太高。远远不如去学java或者kotlin去写安卓来的快。
公司现在在观望.NET CORE,我觉得这是微软翻身的一个机会。就看能不能打好这手牌了。能不能在国内建成一个氛围是很重要的。
c#的生态圈远远不如java之流,以至于有时候出现比较稀罕的问题找不到解决方法。
java比C#发育的早,现在遍地都是java了,学的人自然越来越多。当然,C#的缺陷也很明显,C#迟了一步,而且微软反应的有些缓慢,开源迟了。
原因二
C#找工作一般也就只有中小企业,大企业也有,但是接触不到核心内容。不过就算学了其他语言,能进大公司的也不是很多吧。
我大二开始自学了WPF,大四带着小项目发现找不到实习工作,压根不招实习生。
但winform和http://ASP.NET的招人依旧不少,简历投了很多都回应我了。
winform目前主要是机械控制什么的在用,开发速度贼快,省时间。
目前已经转到http://ASP.NET MVC,一边实习一边自己架站

xtigmh 发表于 2023-10-30 11:13:27

作为一名老C#应用开发者,虽然非常喜欢C#,但我不得不说,题主啊,你的问题描述会给C#招黑的……
另外扫了一眼当前的各个回答,一口老血差点喷出来,没有真用过C#写过项目的就别强答了吧?要黑C#也得黑到点上啊……
页: [1]
查看完整版本: 大学编程入门为什么不以C#作为首选?