浅学一下C#,顺便做了几个小工具


最近这段时间跑去简单尝试了一下C#,主要是因为我认为某些东西如果要用js去写,那旧必须运行个V8,性能上是个问题,如果换一种语言会好很多,于是综合考虑之下,选了C#,因为这个也是跨平台的

先看着菜鸟教程看了一会,好想学进去了,好像懂了,那就开始练手吧

然后发现大脑一片空白

于是乎便使用AI的力量,我并没有直接vibe,而是让它一步一步教我:

我是一个C#初学者,接下来你要辅助我开发一个程序,不允许帮我写而是教我怎么写,你要一行一行代码给出来,不能放上长长一段代码

然后……

好像什么也没学到!(大喜悲

我不知道啊,可能是AI时代下我们真的学不进去了,也可能是我真的没有学习的力气了……

说实话,我现在还不是很明白这玩意的语法,但我没什么时间去深入研究学习了……

感受

这与JS和PY还是有点区别的,比我当年py转js的跨越感大多了

被惯坏了

首先是类型上,其实也不算是困惑吧,我要创建一个数组array,我还是想着js的那个数组,也就是py和c#的列表list,而且写类型的时候也是写了ts中数组的写法(如string[]),不过很快发现这不太对啊,原来你也有list的吗,原来list和array不一样的吗

还有,在py和js被惯坏了,字符串肯定是单引号打起来最方便,但是在C#,这可不是一个玩意啊,单引号是char而双引号是string,一个存单个Unicode一个存平常用的字符串

还有重载,这玩意放别的语言可是要触犯天条的啊!我主要怕就是怕在乱,一旦重载多了,都不知道到底怎么回事了

XML

js用package.json写项目信息,py用pyproject.toml写项目信息,C#用.csproj写项目信息

但是.csproj再这之中,是可读性最低的,因为它是XML!

我让AI写了两者的示例,一目了然:

示例
{
  "name": "foobar",
  "version": "1.0.0",
  "description": "示例项目",
  "author": "Alice",
  "license": "MIT",
  "main": "Program.cs",
  "scripts": {
    "start": "dotnet run",
    "test": "dotnet test"
  },
  "dependencies": {
    "foo-bar": "1.0.0",
    "baz-qux": "2.0.0"
  },
  "devDependencies": {
    "test-lib": "3.0.0"
  },
  "files": [
    "Program.cs",
    "Foo.cs",
    "README.md"
  ]
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <AssemblyName>foobar</AssemblyName>
    <RootNamespace>Foobar</RootNamespace>
    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
    <OutputType>Exe</OutputType>
    <Version>1.0.0</Version>
    <Description>示例项目</Description>
    <Company>Alice</Company>
    <Copyright>MIT</Copyright>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="foo-bar">
      <HintPath>..\packages\foo-bar.1.0.0\lib\net45\foo-bar.dll</HintPath>
    </Reference>
    <Reference Include="baz-qux">
      <HintPath>..\packages\baz-qux.2.0.0\lib\net45\baz-qux.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="test-lib" Version="3.0.0" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Program.cs" />
    <Compile Include="Foo.cs" />
    <None Include="README.md" />
  </ItemGroup>
  <Target Name="Start">
    <Exec Command="$(OutputPath)foobar.exe" />
  </Target>
  <Target Name="Test">
    <Exec Command="dotnet test" />
  </Target>
</Project>

首先,在csproj中,键名的命名方式都是单词大写无分隔的命名方式,空间上又比较紧凑,没什么留白,名字全都挤在了一起,同时闭标签还得重复一遍键名,信息密度低就不说了,一眼下去全是视觉噪声,看都不知道看哪里

在json里面,一个[]就能包括的内容,到了XML,就得一个又一个<Item>

总之,看起来很难受,但是还没完,还有xmlns……

命名空间

但其实最搞不懂的,是命名空间namespace

其实我并不喜欢这套玩意,好乱

在py,引入一个模块用import,如果是项目内某个文件夹内的文件,比如foo/bar.py,就能用import foo.bar了用点分隔,在js,也是import(cjs用require),但是内容是路径字符串,例如import "./foo/bar.js"

到了C#,按我的理解,不知道对不对,这不是按文件看的,命名空间到处都是,是全局的,不能一眼看出这个命名空间是不是来自于哪个文件

命名空间可以随时使用,但一般用的时候嵌套起来挺严重的,直接长长一串贴上去,层数又多名字又长,要是想简便一点,可以用using,但即使是using,也得写得长长的

有时候简写,结果两个包都有这个命名空间,直接冲突了,而且这样搞写法也很多,这样也太乱了

好麻烦,不喜欢

或许C#的语法哲学不适合我吧……

或许也是因为如此,开发的时候IDE的语言服务器疯狂地在跑,扫来扫去,写几行代码,IDE报个错,等一段时间才反应过来……

项目

但是这段时间也是练了一下手并vibe了几个小软件的,毕竟C#实用性还是有的

这里有两个纯vibe的小软件,和两个伪手写的软件

什么是伪手写?那基本上是我照着AI给出的代码抄的,算是基本上都是AI写的,只不过AI没有调用工具操作文件而是我代劳手敲或者复制过去的

没错我就是这么颓废,说好的自己写呢怎么指导了几下几乎没有哪部分是自己写的了

至于构建产物的下载链接,我统一压缩了放在这里,采用分卷压缩,因为四个有三个都是Avalonia的而且文件体积比较大,就算分开来压缩放到这里也得分卷成两个文件(我要考虑到部署在cf pages上有单文件最高25MiB的限制,也顺便让你可以多线程同时下载三个部分更快一点),就是浅浅委屈一下想用那个WinForms写的的读者了,200kb和其它90~100mb的玩意混在一起下载

001/002/003

此外还有发在L站的帖子和发在Gist上的源码,在章节内会给出

接下来依旧是我的金字塔结构写法,越到后面越强

Simpic

L站帖子和源……好像没放,那算了

这玩意有一半是vibe的,有一半是伪手写的

首先一打开就是一个亚克力背景的UI,叫你Drop Here

Linus:DROP IT!

把图片或含有图片的文件夹拖进去,会自动识别并开始展示

可以通过按键切换图片,也可以通过按键打开悬浮窗选择图片

至于按键:

按键功能
A / W / , / [上一张(到头循环)
D / S / . / ]下一张(到尾循环)
R / Space随机一张
E / Enter打开/关闭悬浮窗
Esc关闭窗口

SvcTray

L站帖子和源码

dsh刚发布的时候,很明显有一个与众不同的地方,它不是tui软件,但是要tui启动,启动之后给的是本地服务器url,要访问相应的网页才行,一时间各种相关插件和改版出来了,可其中有一些不是影响使用就是不与本机装好了的dsh互通,同时这dsh --profile web这么长也懒得打了(虽然终端会自己补)

命令长的还有scrcpy(我的命令要加一堆参数所以会比较长,你可以看到我的配置里面有dsh和scrcpy和一个不知道干什么只是拿来测试的Simpic),不是很方便

于是完全伪手写了一个WinForms的,在反复拉扯之后,「我」——这个Harness其实还不错

只需要右键托盘菜单,快速管理服务,点一下就能开,点一下就能结束掉,不会弹出终端窗口(想看的话也有一个简陋的文本框可供查看输出)

VertualKb

L站帖子和源码

帖子里面有演示视频我就懒得在这里放上去了

其实就是一个翻转了90°的虚拟键盘,方便Moonlight串流用触屏模式的时候打字,这样打字舒服一点

Keyeal

L站帖子和源码(什么叫你放个7z包的base64上去就行了)

一个模仿Keyviz V1的软件,但是那个软件我认为按键太大了,于是vibe了一个更好的,也有自定义(样式和颜色和位置),虽然不会太多主体就是了,不过也足够好用了

这是按键显示:

这是鼠标按下和鼠标轨迹(这是两张图片拼在一起了):

三个均可单独关闭启动

就这样了,没啥好写的