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的内容也被修改了
很显然这不是我们想要的,这是因为=在引用类型中的使用,仅仅是创建了一个新的引用变量,并没有复制真正的内容,所以我们需要深拷贝
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右下角的通过编码打开,通过编码保存设置为gbk什么的都不行
网上大多数说的确实是对的,确实是因为cmd的编码格式造成的,但是我只想要VsCode的输出窗口正常,调试也正常,所以我不需要去设置cmd,cmd和我有什么关系?设置cmd或者全部使用utf-8也可能会导致其他的问题
确实可以解决,但是我不喜欢终端的字体,我就喜欢输出窗口的风格,和设置的字体统一
example:
"csharp":"clear && cd $dir && csc /nologo $fileName && ./$fileNameWithoutExt",
"code-runner.runInTerminal": true
SettingJson中code-runner.executorMap里Csharp相关的前面加上chcp 65001,不需要修改cmd只需要修改vscode这里
example:
"csharp": "chcp 65001 && cd $dir && echo= && csc /nologo /utf8output $fileName && $fileNameWithoutExt",
还是刚才的设置,服务器提前安装mono
example:
"csharp": "csc /nologo /utf8output $fileName && mono $fileNameWithoutExt.exe",
经过上面的操作,C#的话,无论CodeRunner还是F5都没有乱码的问题
但是C++的话,CodeRunner没有问题,但是调试会乱码
system("chcp 65001");
system("cls");
虽然能解决,但是这么麻烦所以一般都不会这么做的,想一个办法把这两句代码自动先运行
使用__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试一下