.NET 1.0创建整数集合的方法(例如)是:
ArrayList list = new ArrayList();
list.Add(i); /* boxing */
int j = (int)list[0]; /* unboxing */
Run Code Online (Sandbox Code Playgroud)
使用它的代价是由于装箱和拆箱而缺乏类型安全性和性能.
.NET 2.0方式是使用泛型:
List<int> list = new List<int>();
list.Add(i);
int j = list[0];
Run Code Online (Sandbox Code Playgroud)
拳击的价格(据我所知)是需要在堆上创建一个对象,将堆栈分配的整数复制到新对象,反之亦然,以便取消装箱.
泛型的使用如何克服这个问题?堆栈分配的整数是否保留在堆栈上并从堆中指向(我想这不是这种情况,因为当它超出范围时会发生什么)?似乎仍然需要将其复制到堆栈外的其他地方.
真的发生了什么?
当将FixedDocument序列化为XPS时,我有时会FileFormatException告诉我字体的格式(我假设)不符合预期的文件格式规范(请参阅下面的例外).
神秘的部分是:
有人知道为什么会发生这种情况(特别是为什么它不会一直发生但只是在不可预测的时间间隔内)?
遵循最小可重复性示例将在每次运行时触发异常约4至5次(在我的Windows 10计算机上,发生在.NET 4,4.6.1等):
private void TestXpsSerialization(object a)
{
for (int i = 0; i < 400; ++i)
{
TextBlock block = new TextBlock
{
Text = "Test",
FontFamily = new FontFamily("Segoe UI"),
FontStyle = FontStyles.Italic,
FontWeight = FontWeights.Bold,
Background = null,
FontSize = 12
};
FixedDocument fixedDoc = new FixedDocument();
PageContent pageContent = new PageContent();
FixedPage fixedPage = new FixedPage();
fixedPage.Children.Add(block);
((IAddChild) pageContent).AddChild(fixedPage);
fixedDoc.Pages.Add(pageContent);
using (MemoryStream documentStream = new MemoryStream())
{
string …Run Code Online (Sandbox Code Playgroud) 我想将FileStream的一部分复制到内存流.
FileStream.Write(Pointer(MemoryStream)^, MemoryStream.Size);
FileStream.Read(Pointer(MemoryStream)^, count);
Run Code Online (Sandbox Code Playgroud)
是对的吗?它不适合我.
为什么两个地址之间的区别是错误的? http://codepad.org/NGDqFWjJ
#include<stdio.h>
int main()
{
int i = 10, j = 20;
int *p = &i;
int *q = &j;
int c = p - q;
printf("%d\n", p);
printf("%d\n", q);
printf("%d", c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
-1083846364
-1083846368
1
Run Code Online (Sandbox Code Playgroud) 我需要从 at\xd0\xb5xt 文件中读取一个(engl.: Star)对象的所有属性,如下所示Stern。我需要将字符串替换"leer"为"",但也可能存在不应替换为 的有效字符串""。
即对于另一个Stern对象也可以有"leer"代替"Sol"。
问题:
\n问题是它没有将 替换"leer"为"". 看起来它保存"leer\\\\r"在对象中而不是仅保存在对象"leer"中,但我也尝试替换"leer\\\\r",但它仍然不起作用。
这是Stern应该阅读的文本文件中的一个:
0\nSol\n0.000005\n0.000000\n0.000000\nleer\n1\n0\nRun Code Online (Sandbox Code Playgroud)\n\n这是我的operator >>阅读内容:
istream& operator>>(istream& is, Stern& obj)\n{\n string dummy;\n is >> obj.m_ID;\n getline(is, dummy);\n getline(is, obj.m_Bez);\n\n if (obj.m_Bez == "leer")\n obj.m_Bez = "";\n\n is >> obj.m_xKoord >> obj.m_yKoord >> obj.m_zKoord;\n getline(is,dummy);\n getline(is,obj.m_Sternbild);\n\n if (obj.m_Sternbild …Run Code Online (Sandbox Code Playgroud) 我无法理解这段代码的结尾(array = 0;):
#include <iostream>
int main()
{
std::cout << "Enter a positive integer: ";
int length;
std::cin >> length;
int *array = new int[length];
std::cout << "I just allocated an array of integers of length " << length << '\n';
array[0] = 5; // set element 0 to value 5
delete[] array; // use array delete to deallocate array
array = 0; // use nullptr instead of 0 in C++11
return 0;
}
Run Code Online (Sandbox Code Playgroud)
最后,删除动态分配的数组(返回到OS),然后分配值0.
为什么这样做?数组返回操作系统后,无需为其赋值0,对吗?
代码来自:http …
有这个代码:
#include <cstdio>
#include <chrono>
int main()
{
auto d = std::chrono::microseconds(1).count();
printf("%lld", d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当在64位模式下编译时,会出现警告:
Run Code Online (Sandbox Code Playgroud)main.cpp: In function ‘int main()’: main.cpp:7:19: warning: format ‘%lld’ expects argument of type ‘long long int’, but argument 2 has type ‘long int’ [-Wformat=] printf("%lld", d); ^
在32位模式下编译时使用此警告(使用-m32标志).它看起来就像std::chrono::duration::rep是一个类型的long int在64位程序,并long long int在32位程序.
有没有一种可移植的方式来打印它像%zu说明符size_t?
我最近开始用一本好书学习C#,现在阅读有关Conditional属性和#if编译器指令的内容.
我知道#if编译器指令的用法:
#if DEBUG
public void foo(int value)
{ ... }
#endif
Run Code Online (Sandbox Code Playgroud)
和Conditional属性:
[System.Diagnostics.Conditional("DEBUG")]
public void foo(int value)
{ ... }
Run Code Online (Sandbox Code Playgroud)
我也知道被#if... #endif语句包含的代码没有到达IL但是Conditional属性代码会这样做,并且对该函数的调用将被省略.
我的问题:
为什么有关于限制Conditional属性的使用,标志着与属性函数必须返回void作为这里的文件中写?
如果将此属性应用于不返回void的方法,则会在Visual Studio中出现编译错误.
我已经搜索了信息,但没有找到任何解释.
我使用Arduino UNO(Arduino 1.8.3)。
这是我的代码:
void setup() {
Serial.begin(115200);
}
void loop() {
uint64_t num = 9223372036854775807;
Serial.print(num);
delay(1000);
}
Run Code Online (Sandbox Code Playgroud)
这是错误消息:
退出状态1
重载“print(uint64_t&)”的调用不明确
我该如何解决这个错误?
以下代码有效:
int main(void)
{
float f = get_float();
int i = round(f*100);
printf("%i\n", i);
}
Run Code Online (Sandbox Code Playgroud)
然而,如果以这种方式编码会产生错误:
printf("%i\n", round(1.21*100));
Run Code Online (Sandbox Code Playgroud)
输出说round(1.21*100)是float.那么,为什么呢
int i = round(f*100);
Run Code Online (Sandbox Code Playgroud)
很好吗?
c++ ×4
c# ×3
.net ×2
c ×2
pointers ×2
arduino-uno ×1
arrays ×1
boxing ×1
c++-chrono ×1
c++11 ×1
delphi ×1
delphi-7 ×1
generics ×1
io ×1
long-integer ×1
unboxing ×1
xpsdocument ×1