在C#中,我已经注意到如果我运行以下代码对我的内存没有任何影响:
Console.WriteLine("press a key to allocate the memory");
Console.ReadKey();
double[] hudgeBunchOfMemory = new double[100000000];
Console.WriteLine("allocated");
Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)
但是如果我遍历数组并使用它们,那么分配就会运行,就像在这个示例中一样:
Console.WriteLine("press a key to allocate the memory");
Console.ReadKey();
double[] hudgeBunchOfMemory = new double[100000000];
for (long i = 0; i < 100000000; i++)
{
hudgeBunchOfMemory[i] = i + 1;
}
Console.WriteLine("allocated");
Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)
什么产生这种行为?
编辑
我已经在发布和调试模式下使用Visual Studio 2012破坏了代码,并且我已经通过任务管理器评论了内存更改,并且可以非常简单地观察到差异,因为它需要800Mb的内存.
关于这种行为最合适的问题是:代码是否已执行,内存是否仍然没有被占用,或者根本没有被执行,并且被JIT编译器避免了?
我有一个A
派生自 class 的类B
:
public class B
{
protected void Run() // pass data here used by all 3 Run methods
{
BeforeRun();
RunInternal();
AfterRun();
}
private void RunInternal()
{
}
private void BeforeRun()
{
}
private void AfterRun()
{
}
}
public class A : B
{
}
Run Code Online (Sandbox Code Playgroud)
强制从 B 类继承的用户必须调用基本方法的最近成就是什么Run()
?
在您想要的地方添加protected
、virtual
、abstract
等,我可以随意更改您的建议。
从我现在所理解的,我可以说C#中的引用是一种指向具有引用计数的对象的指针,并且知道类型兼容性.我的问题不是关于值类型如何与引用类型不同,而是关于如何实现引用的更多信息.
我已经阅读了这篇文章,介绍了引用和指针之间的差异,但这并没有涵盖引用的内容,但是它与C++中的指针相比,它描述了更多的属性.我也理解传递引用传递值之间的差异(因为C#对象默认按值传递,甚至是引用),但是当我试图向我解释时,我很难理解什么是真正的引用.同事为什么通过引用发送的参数不能存储在闭包内,如Eric Lippert 博客条目中关于堆栈作为实现细节.
有人可以向我提供一个完整的,但希望简单的解释,说明C#中的引用是什么,还有一些关于它们是如何被赋予的?
编辑:这不是重复,因为在C#中的Reference类型中,它解释了引用如何工作以及它与值的不同之处,但我要问的是如何在低级别定义引用.
假设我有以下代码:
float[] test = new float[10];
for(int i = 0; i < 10; i++)
{
test[i] = i + 1.0f;
}
Run Code Online (Sandbox Code Playgroud)
我将一个新的浮点数重新分配给测试数组,如下所示:
test = new float[10];
Run Code Online (Sandbox Code Playgroud)
通过Console.WriteLine调试后,显示reassign的test
值为0,test
是不是引用了新创建的float数组,还是之前的数组被清空重新创建?
我已经阅读了一些关于堆和堆栈的文章,但这并没有解决我的困惑。
您好,我在从 ASCII 转换为字节时遇到了问题。我有代码:
byte M = Convert.ToByte('M');
Run Code Online (Sandbox Code Playgroud)
但这从 UTF-16 转换为字节,我不想要。在我的问题中,我想用 ASCII 代码发送字节。