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


引用类型使用“=”

		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的内容也被修改了
在这里插入图片描述
很显然这不是我们想要的,这是因为=在引用类型中的使用,仅仅是创建了一个新的引用变量,并没有复制真正的内容,所以我们需要深拷贝


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的修改而修改
在这里插入图片描述


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

还是之前的代码,打印"在家玩游戏"和"还是在家打游戏"出现乱码
在这里插入图片描述
修改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",
在这里插入图片描述

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

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


一些问题

经过上面的操作,C#的话,无论CodeRunner还是F5都没有乱码的问题
在这里插入图片描述
在这里插入图片描述
但是C++的话,CodeRunner没有问题,但是调试会乱码
在这里插入图片描述
在这里插入图片描述

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

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

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

②使用__attribute__((constructor))

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

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

#include <stdlib.h>
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试一下
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值