【C#】复杂类型的深拷贝(并且解决CodeRunner输出窗口string乱码)

文章目录

    • 引用类型使用“=”
    • XML序列化反序列化完成深拷贝
    • VsCode中CodeRunner插件输出窗口中文乱码
      • ①网上建议的,CodeRunner使用终端
      • ②如果是Windows平台:
      • ③Linux下就不存在乱码,但是如果是RemoteSSH连接到服务器,怎么使用CodeRunner呢?
    • 一些问题
      • ①cpp代码中加入控制台代码
      • ②使用__attribute__((constructor))


引用类型使用“=”

		static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.Name = "Luzihan";
            p1.Job = "在家玩游戏";

            Person p2 = new Person();
            p2 = p1;
            p1.Name = "Lubaobao";
            p1.Job = "还是在家打游戏";

            Console.WriteLine(p1.Name);
            Console.WriteLine(p1.Job);
            Console.WriteLine(p2.Name);
            Console.WriteLine(p2.Job);
        }

这样的最直接后果就是,修改了p1的内容,导致p2的内容也被修改了
【C#】复杂类型的深拷贝(并且解决CodeRunner输出窗口string乱码)_第1张图片
很显然这不是我们想要的,这是因为=在引用类型中的使用,仅仅是创建了一个新的引用变量,并没有复制真正的内容,所以我们需要深拷贝


XML序列化反序列化完成深拷贝

        public static T DeepCopyByXml<T>(T obj)
        {
            object result;
            using (MemoryStream ms = new MemoryStream())
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
                xmlSerializer.Serialize(ms, obj);
                ms.Seek(0, SeekOrigin.Begin);
                result = xmlSerializer.Deserialize(ms);
                ms.Close();
            }
            return (T)result;
        }

使用深拷贝之后的结果,很明显,p2的内容不会因为p1的修改而修改
【C#】复杂类型的深拷贝(并且解决CodeRunner输出窗口string乱码)_第2张图片


VsCode中CodeRunner插件输出窗口中文乱码

还是之前的代码,打印"在家玩游戏"和"还是在家打游戏"出现乱码
【C#】复杂类型的深拷贝(并且解决CodeRunner输出窗口string乱码)_第3张图片
修改VsCode右下角的通过编码打开,通过编码保存设置为gbk什么的都不行

网上大多数说的确实是对的,确实是因为cmd的编码格式造成的,但是我只想要VsCode的输出窗口正常,调试也正常,所以我不需要去设置cmd,cmd和我有什么关系?设置cmd或者全部使用utf-8也可能会导致其他的问题

①网上建议的,CodeRunner使用终端

确实可以解决,但是我不喜欢终端的字体,我就喜欢输出窗口的风格,和设置的字体统一
example:
"csharp":"clear && cd $dir && csc /nologo $fileName && ./$fileNameWithoutExt",
"code-runner.runInTerminal": true

②如果是Windows平台:

SettingJson中code-runner.executorMap里Csharp相关的前面加上chcp 65001,不需要修改cmd只需要修改vscode这里
example:
"csharp": "chcp 65001 && cd $dir && echo= && csc /nologo /utf8output $fileName && $fileNameWithoutExt",
【C#】复杂类型的深拷贝(并且解决CodeRunner输出窗口string乱码)_第4张图片

③Linux下就不存在乱码,但是如果是RemoteSSH连接到服务器,怎么使用CodeRunner呢?

还是刚才的设置,服务器提前安装mono
example:
"csharp": "csc /nologo /utf8output $fileName && mono $fileNameWithoutExt.exe",


一些问题

经过上面的操作,C#的话,无论CodeRunner还是F5都没有乱码的问题
【C#】复杂类型的深拷贝(并且解决CodeRunner输出窗口string乱码)_第5张图片
【C#】复杂类型的深拷贝(并且解决CodeRunner输出窗口string乱码)_第6张图片
但是C++的话,CodeRunner没有问题,但是调试会乱码
【C#】复杂类型的深拷贝(并且解决CodeRunner输出窗口string乱码)_第7张图片
【C#】复杂类型的深拷贝(并且解决CodeRunner输出窗口string乱码)_第8张图片

①cpp代码中加入控制台代码

	system("chcp 65001");
    system("cls");

虽然能解决,但是这么麻烦所以一般都不会这么做的,想一个办法把这两句代码自动先运行

②使用__attribute__((constructor))

使用__attribute__((constructor)),放在函数声明后,表示在main函数调用前,先调用此函数,同样的还有__attribute__((destructor)),表示在main函数调用exit()之后调用此函数

在.vscode文件夹下创建一个head.h头文件

#include 
static void before(void) __attribute__((constructor));
static void before()
{
    system("chcp 65001"); 
    system("cls");
}

然后把task.json中的参数修改一下
"args": ["-g","${file}","-include","${workspaceRoot}\\.vscode\\head.h","-o","${fileBasenameNoExtension}.exe"],
其他不需要什么操作了,直接F5试一下
【C#】复杂类型的深拷贝(并且解决CodeRunner输出窗口string乱码)_第9张图片

你可能感兴趣的:(C#)