在某些情况下,需要将值类型的实例视为引用类型的实例.对于这种情况,可以通过名为boxing的过程将值类型实例转换为引用类型实例.当盒式化值类型实例时,将在堆上分配存储,并将实例的值复制到该空间中.对此存储的引用放在堆栈上.盒装值是一个对象,一个包含值类型实例内容的引用类型.
在维基百科中有一个Java的例子.但是在C#中,有哪些情况需要打包一个值类型?或者更好/类似的问题是,为什么人们想要在堆上(盒装)而不是堆栈上存储值类型?
我不确定这个功能的名称是什么,但它让我疯了.我只在Visual Studio Code中编写了一些Dart,所以我不知道这是否会在其他语言模式下发生.
给出以下代码:
class FriendlychatApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: "Friendlychat",
home: new ChatScreen(),
);
}
}
Run Code Online (Sandbox Code Playgroud)
VSCode将显示:
class FriendlychatApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: "Friendlychat",
home: new ChatScreen(),
); // MaterialApp
}
}
Run Code Online (Sandbox Code Playgroud)
如果结束括号是paren()
)或方括号(]
),则会发生这种情况.
请注意,// MaterialApp
实际上并没有写入文件,它只在屏幕上呈现.
由于VSCode已经显示缩进线,因此噪声相当快,并且非常冗余.
有禁用此设置的设置吗?
我开始通过阅读K&R并完成一些练习来学习C语言.经过一番挣扎,我终于可以用以下代码完成练习1-19:
/* reverse: reverse the character string s */
void reverse(char s[], int slen)
{
char tmp[slen];
int i, j;
i = 0;
j = slen - 2; /* skip '\0' and \n */
tmp[i] = s[j];
while (i <= slen) {
++i;
--j;
tmp[i] = s[j];
}
/* code from copy function p 29 */
i = 0;
while ((s[i] = tmp[i]) != '\0')
++i;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是关于tmp
char数组被复制到的最后一段代码s
.为什么不是简单的s = tmp;
工作呢?为什么必须按索引遍历数组复制索引?