代码 > csharp用后感
2025-04-25
怎么说呢
csharp这个语言,用起来,的确有优点,有缺点。
真的让我感觉用起来很舒服的,其实只有两个点
第一个是partial关键字,可以把一个类拆成很多个文件来写,这个的确我会滥用。
另一个是字段和属性的无缝转换,字段转属性直接写get和set就好,不需要调整其他地方调用的代码。
至于不爽的地方,就是全局OOP模式了。
我写个单例都不能写在全局变量里,必须写一个静态方法。
蛋疼的不行。
代码 > 发现现在做GUI程序的思路基本已经定型了
2025-04-16
不管做APP还是PC端基本一样。
首先是View+ViewModel搞定显示(前端)
然后当中插入一层引擎,串接起负责提供数据给VM,然后通过Event和嵌入的UI Interface和前端交互,引擎大概率引入个单例,从引擎层分为可交互和不可交互两层。
这样可以做到UI无关化,方便测试,方便GUI转API/CLI,彻底分层
接着是Service层,为处理Model数据的代码提供封装和帮助。
然后是Model层,实际的数据/业务的处理。
感觉还是Frontend+API那套底子。
代码 > 解决csharp xml序列化的hexadecimal value 0x00, is an invalid character问题
2025-04-11
最近在做xml序列化,发现这个问题。
一开始怀疑是源文件问题或者对象失效问题,拿着原文件不停删除行对比,发现具有随机性。
搞了几小时。
起床后灵机一动,是不是真有无效字符,立刻寻找\0字符串。
发现固定在原始数据解析的最后一个元素上。
然后再一查
是读文件的问题
之前用的
var body = new byte[fileStream.Length];
fileStream.Read(body, 0, (int)fileStream.Length);
不行
需要使用
ReadExactly
或者
var body=new StreamReader(fileStream,Encoding.UTF8).ReadToEnd();
的形式。
这命名,绝对属于踩到屎山了。
网络 > csharp AOT中的XML序列化
2025-04-02
玩具项目引入序列化后,开始体会到CSharp的AOT的蛋疼了。所以也明白CSharp之父做的TSChekcer为啥要用golang不用csharp了。
两门语言对待AOT的优先级上的确不同,CSharp的AOT只是能用,绝对不是优势。
实现,CSharp开启AOT后,反射的功能就开始受限,这对于序列化的影响很大,解决方案是必须显示的指定可能用到的类。
第一个会出现的错误是,报找不到空参数构造函数。
---> System.InvalidOperationException: HellMapManager.Models.Map cannot be serialized because it does not have a parameterless constructor.
本质是因为没有指定可能使用的类型(以及子类中可能没指定)。
需要引入
using System.Diagnostics.CodeAnalysis;
然后在类定义中显示的指明
public partial class Map
{
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Map))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(MapInfo))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Alias))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Room))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Exit))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Route))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Variable))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Landmark))]
然后可能遇到的问题是提示
---> System.InvalidOperationException: You must implement a default accessor on System.Collections.Generic.List`1[[HellMapManager.Models.Room, HellMapManager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] because it inherits from ICollection.
这是需要在使用XML元素的地方显式指定类型
[XmlArray(ElementName = "Rooms")]
[XmlArrayItem(typeof(Room))]
public List<Room> Rooms { get; set; } = [];
继续写,继续踩坑。
代码 > 上手avaloniaui初体验
2025-03-28
在不需要行动力的地方,我行动力总是高的可怕。
找了个需求出来,开始做avaloniaui项目。
怎么说呢,对于vscode的支持一般,和vscode下的flutter体验完全不能比。
csharp本身语法糖有点多,少用点糖就行,Dart也算照着csharp一顿猛抄,所以上首速度还挺快。
axaml个是,也就是学xaml,用xml布局做画面的,和flutter的用代码写组件的体验完全不能比,总觉得丹疼的紧,也没有Vue那么丰富的模板语法。
AOT的话本身体验还行。裁减或打包出来的文件也不多,和flutter桌面版那一家老小一起出游的感觉不同。
继续写写,再体会体会。
代码 > 粗读了一遍C#图解教程
2025-01-24
既然决定要搞C#,那么在节前花了点时间找了个教程粗读了遍。
跳过了短期肯定不会去用的反射,粗看了泛型,其他的仔细过了编。
怎么说呢,csharp到底是这么多年的老语言了,语法层面,不说和C类语言的共通性,真的优点其实也被别的语言抄的差不多了。至少我在脑子里不停的在想:这个Flutter(Dart)抄过了,这个Flutter(Dart)也抄过了。
至于剩下的,没抄过的,至少在我这个一向推行使用多种编程语言的人来看,是在是只适合特殊场景,不值得抄。
对,我说的就是看到很多人吹的委托/事件和Linq。
委托和事件,在某些业务里的确重要,但作为一个通用语言来看的话,这么高优先级优点没必要。
至于Linq,看着那和SQL类似的语句,我只能说,恩,真牛逼,可我真用不上……
读完了,再招点资料和说明,准备开始写了。
代码 > 2025技术栈整理
2025-01-09
整理下自己手头的技术栈
1.golang
这个没的说,的确好用。
可以取代php/python/各种脚本
基本是个 可编译 强类型 基础库强大 的脚本语言。
特别时map和slice,太脚本化了。
能取代大部份使用脚本语言的场景
2.javascript
这个没得说,浏览器里大量使用,各个语言也有成熟的vm可以使用。至于TS,感觉不太适合我用的场景,绝大部分情况下,脚本语言对我只是胶水或者可配置逻辑,实际复杂应用还是走go
3.vue2
等到vue2什么时候停止更新了,再找新的前端框架吧。别的前端框架,哪怕vue3,都太重了,脱离了我对前端的需求
4.flutter/dart
对于一个熟悉前端,不经常写app的人来说,flutter太好用了。dart基本就时一个js,大部份场景下也有很多现成的flutter插件,各种云厂商的支持sdk也很多。随便捏一捏就能弄个app上架了,比较适合我的需求场景。android/ios原生开发实在离我太远,没必要
5.avaloniaui/c sharp
怎么说呢,flutter的确很好用,但再有些场合,太移动端为主,未毕合适。而且c sharp背后有微软在,各个领域未必时第一,但前三的解决方案总有。而且要说实话,golang太脚本化,很多场景c sharp可能会更好用一点。现在dotnet的linux支持看起来也不错,算是今年的研究反向了。20年前最火的时候没学,20年后再去学,也满有意思的。
其他的能看懂就行的语言
php:实在用途狭窄了
python:大部份场景不如用golang,能改改别人的python脚本就行了
lua:这个,实在,太不好用
java:能看懂就行,实在不想学
c:万物离不开C,总有可能要做ffi的
代码 > 试了下avaloniaui
2025-01-08
今天发现avaloniaui支持vscode了。
再本地跑了下,在linux应该说能用,但开发体验和vscode的flutter天差地别,只能说能用罢了。
考虑今年空下的时间搞搞看.net
不求多熟悉,能谢谢最基本的工具就行。
背景有微软这个大山在,各种生态还是不愁的。
至于投入太多精力么,也不至于,毕竟普通人还是跟不上微软的思路的。