虽然是为了Unity学的C#,但是Hello World我觉得还是有必要的。

你好世界

从最简单的终端Hello World开始。

实在不想折腾VS Code,把Visual Studio的C#装上了。

using System;
namespace hello_dotnet
{
    class main
    {
        static public int Main(string[] args)
        {
            Console.WriteLine("你好世界!");
            string scanstr;
            do
            {
                Console.WriteLine(scanstr = Console.ReadLine());
            } while (scanstr.Length != 0);
            
            return 0;
        }
    }
}

Main方法的class可以是任何名字。

窗口程序

只写个helloworld就算是不学C#也能写啊,我要再做点其他的事,VS上装的环境是.net桌面开发,我创建个窗口不过分吧。

先创建了一个窗口程序的模版,参照这个模版写程序。

在System.Windows.Forms下,有Application类,它的方法属性都是静态的,这个类简化了编写窗口程序过程。

用宇宙最强IDE在项目里新建一个Windows窗体,我取了个名字叫mainwindow,直接下面的代码,进入窗口的事件循环。

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new mainwindow());

C#只要是同一个程序集的东西就可以直接拿来用,这里mainwindow类就没导入什么的,很舒服。

创建的窗口是一个空窗口,我要往里加点东西,找了好久,往里加控件需要用到VS里的工具箱(菜单栏>视图>工具箱),布局用的控件感觉不如QT。

在VS的属性里面可以给选中控件绑事件,可以直接选择类的方法或者是双击创建一个方法。

partial 关键字

如果我想把一个class拆到两个C#源文件里面应该怎么做?

加partial!

partial修饰的class,所有同名的会合成一个(不加partial会重定义错误)。

C#的窗体类,一部分代码需要手动编写,这些代码放在一个cs里面,一部分代码由编辑器根据设计生成,这些代码在另一个cs里,但这些代码都在同一个class里面。

资源文件

对于写Unity脚本来说,这里跑题了。

假如我想吧一张图片嵌入到exe里怎么办?

我可以用工具,把图片数据转换文本,转换成类似这样的:···0x66,0xff,0x66···,然后放到代码里面作为常量构造Bitmap(位图),但是,我又不是在给单片机写程序,要是非得这样写,我宁可把图片放到exe外面。

在VS里,用.resx文件记录资源文件,在编译时会将这些文件编译进exe。(我的.resx是编辑器生成的,在我给一个图片控件添加图片文件时自动创建的)

VS会给resx文件生成代码,用于访问资源。

生成的代码在global::下,我位于项目/Properties/Resources.resx的资源文件生成的代码在global::hello_dotnet.Properties.Resources,利用代码提示,轻松找到资源。

Resources下面有与资源同名的属性,可以直接取过来用。

虽然资源文件在用的时候是像常量那样取过来用的,但是资源文件并非在启动的时候就加载到内存了,这些与资源同名的属性都是属性访问器,取值相对于执行了方法,这个方法会加载和缓存资源文件,通过IDE跳转过去的具体实现:

/// <summary>
///   查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap _1 {
    get {
        object obj = ResourceManager.GetObject("pic1", resourceCulture);
        return ((System.Drawing.Bitmap)(obj));
    }
}

我还用一个超大的文件进行了测试,确实没有启动时往内存里加载。

VS的C++也有资源文件的概念,以我之前那时候的计算机水平,到放弃也没整明白。

输出类型

在项目属性里面有个叫输出类型的选项,控制台应用程序 会在启动时带着终端启动,windows应用程序不会带终端。


我能想到的,最大的成功就是无愧于自己的心。