由于Value类型变量在Stack中分配内存,因为引用类型在Heap中分配它.
那么在引用类型(例如,在类中)声明值类型变量(例如int i = 4;)时分配的内存如何.
整个内存分配如何在.net中用于值类型和引用类型,以及在refence类型范围内的值类型.
请解释或提供有关的链接.
谢谢
我有两个专业的程序员朋友要教我,他们都喜欢这门语言(C#).我知道他们的特殊技能和热情超过了语言的任何弊端,但他们看起来像这样的粉丝我不知道这是什么问题.
我只有XHTML和CSS的经验,所以接受让我的头围绕面向对象将是一个挑战,例如.我隐约知道某些语言(python?)允许你单独测试小部分,这对初学者特别有用.我担心我要跑步才能走直奔C#.
对不起,这是一个漫无边际的问题,但建议将不胜感激.
我最近听说过7.2中的新C#Feature,所以我们现在可以返回值类型的引用(例如int)甚至是值类型的只读引用.所以据我所知,值类型存储在堆栈中.当剩下方法时,它们会从堆栈中删除.那么当方法GetX退出时,int会发生什么?
private ref int GetX()
{
// myInt is living on the stack now right?
int myInt = 5;
return ref myInt;
}
private void CallGetX()
{
ref int returnedReference = ref GetX();
// where does the target of 'returnedReference' live now?
// Is it somehow moved to the heap, because the stack of 'GetX' was removed right?
}
Run Code Online (Sandbox Code Playgroud)
我收到了错误
错误CS8168:无法通过引用返回本地'myInt',因为它不是ref本地(11,24)
那为什么它不起作用?它不起作用只是因为变量无法移动到堆中吗?这是问题吗?如果它们不在堆栈中,我们只能通过引用返回值类型吗?我知道这是两个问题.
第一:ref返回的值类型变量在哪里?堆栈还是堆?(我猜在堆上,但为什么)?
第二:为什么堆栈上创建的值类型不能通过引用返回?
所以这可以编译:
private int _myInt;
private ref int GetX()
{
// myInt is …Run Code Online (Sandbox Code Playgroud) 我读了一篇让我对内存分配感到困惑的文章,其中说:
Singleton对象存储在堆上,而静态类存储在堆栈中.
链接是:http: //www.dotnetjalps.com/2013/06/Static-vs-Singleton-in-Csharp-Difference-between-Singleton-and-Static.html
但在一些Stackoverflow问题中,例如
它被描述为
静态变量存储在堆上,无论它们是声明为引用类型还是值类型.无论创建多少个实例,总共只有一个插槽.
所以我对静态类的堆栈或堆存储感到困惑.如何为静态类分配内存?为什么?如何为单例类分配内存?
我的要求是使用有序哈希表中的那些整数键来存储整数键和访问哈希表值.
什么有效
当我使用字符串键时,没问题:
cls
$foo=[ordered]@{}
$foo.add("12",1)
$foo.add("24",2)
write-host ("first item=" + $foo.Item("12"))
write-host ("second item=" + $foo.Item("24"))
Run Code Online (Sandbox Code Playgroud)
输出:
first item=1
second item=2
Run Code Online (Sandbox Code Playgroud)
使用支架失败
当我使用括号时,程序不会抛出异常,但它不返回任何内容:
$fooInt=[ordered]@{}
$fooInt.add(12,1)
$fooInt.add(24,2)
write-host ("first item=" + $fooInt[12])
write-host ("second item=" + $fooInt[24])
Run Code Online (Sandbox Code Playgroud)
输出:
first item=
second item=
Run Code Online (Sandbox Code Playgroud)
使用Item方法失败
当我使用Item方法和整数键时,PowerShell将整数键解释为索引而不是键:
$fooInt=[ordered]@{}
$fooInt.add(12,1)
$fooInt.add(24,2)
write-host ("first item=" + $fooInt.Item(12))
write-host ("second item=" + $fooInt.Item(24))
Run Code Online (Sandbox Code Playgroud)
输出:
Exception getting "Item": "Index was out of range. Must be non-negative and less than the size of the collection.
Parameter …Run Code Online (Sandbox Code Playgroud) 如果我有这样的代码
for(int i=0;i<10;i++)
{
int iTemp;
iTemp = i;
//.........
}
Run Code Online (Sandbox Code Playgroud)
编译器是否会立即对iTemp进行10次操作?
或者它优化它?
我的意思是如果我重写循环为
int iTemp;
for(int i=0;i<10;i++)
{
iTemp = i;
//.........
}
Run Code Online (Sandbox Code Playgroud)
会更快吗?
我在 CMMI 5 级公司面试中被问到如何在 C# 中创建可变和不可变类。我听说过 mutable 和 immutable 这意味着可以改变和不能改变,比如String和StringBuilder。
但是,我不知道如何创建可变类和不可变类。为此,我们有 String 和 String builder。但是在创建一个的时候,我被迫在网上搜索了这个,但找不到任何有用的东西,所以想到这里问。
但是,我尝试通过在类中定义一个属性并在其 Getter 上创建它来创建它,我创建了一个新的字符串对象来复制它。但没有成功理解。
另外,我已经提到在 stackoverflow 中已经提出了一个关于不可变和可变的问题。但是,我的问题是不同的。我想知道我是否想创建一个可变类,那么除了使用 String 或其他可变类之外,我将如何使用它。
我想知道在哪里或如何存储由"Hello World"编写的字符串值.
例如:
例1:
radLabel1.Text = "Hello";
radLabel2.Text = "Hello";
radLabel3.Text = "Hello";
Run Code Online (Sandbox Code Playgroud)
例2:
string strTemp = "Hello";
radLabel1.Text = strTemp;
radLabel2.Text = strTemp;
radLabel3.Text = strTemp;
Run Code Online (Sandbox Code Playgroud)
我知道第二种方式是最有用的,我这样做,但我想知道示例1的字符串是如何存储在RAM中的.我想虽然它们是相同的,但是在RAM中为它们创建了三个地方来存储它们.但是在示例2中,仅为示例2的字符串创建了一个位置,并且访问了该地址.我对吗 ?你能解释一下这个或将变量存储在RAM中吗?
我有这个类结构:
class A { }
class B:A { }
A x = new B();
Run Code Online (Sandbox Code Playgroud)
这是运行时类型:
x.GetType(); //B
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到它的编译时间类型?
我试过typeof (x)- 但争论必须是一种类型......
我的愿望答案是: A
为什么我问它?
因为我认为int通过polymorphic引擎是有针对性的:
这样的事情:
object myInd = new Int32(); / /this DOES compile
Run Code Online (Sandbox Code Playgroud)
我想验证我的假设:
它来自对象吗?
为了做到这一点 - 我必须知道它的静态类型....
当我读到Java时,我通常会看到描述为基本类型或对象类型的变量.
当我读到C#,我一般参见变量描述为原始类型或非原始型?
术语对象类型和非基本类型之间有什么区别?
如果 C# 的内置数据类型的实现方式与 Java 的原始数据类型的实现方式相同,那么性能会不会有所不同?
例如,在C#中,如果我们编写如下代码:
int foo = 1;
Run Code Online (Sandbox Code Playgroud)
我们正在声明和实例化一个对象,对吗?
然而,在 Java 中,当我们编写同一段代码时,我们并不是在实例化一个对象。因为 ' int' 是“由 Java 编译器和 JVM 直接实现的”。
所以我想知道如果 C# 使用与 Java 相同的实现是否会有所不同——即每次int在 C# 中使用原始数据类型时都不创建一个对象。
这两者之间有什么区别。我用谷歌搜索但找不到满意的答案。例如,java 是一个 oop(面向对象编程)但不是纯 oop(在某些网站上写的)。有人可以解释一下吗?