这可能是一个非常基本的问题,但我对它有点困惑.如果我反映Int32/Double/any值类型代码,我看到它们是结构体,如下所示:
[Serializable, StructLayout(LayoutKind.Sequential), ComVisible(true)]
public struct Double : IComparable, IFormattable, IConvertible, IComparable<double>, IEquatable<double>
{
....
}
Run Code Online (Sandbox Code Playgroud)
那么,为什么我们说.NET中的所有内容都是从System.Object派生的.我想在这里缺少一些关键点.
编辑: 让我更加困惑的是,作为结构的值类型如何从System.Object继承,这是一个类.
我只是参与Stack Overflow问题.NET中的所有内容都是对象吗?.
并且一张海报(在接受的答案的评论中)似乎认为对值类型执行方法调用导致拳击.他向我指出了Boxing和Unboxing(C#编程指南),它没有明确指出我们描述的用例.
我不是一个信任单一来源的人,所以我只是希望得到关于这个问题的进一步反馈.我的直觉是没有拳击,但我的直觉确实很糟糕.:d
进一步阐述:
我使用的例子是:
int x = 5;
string s = x.ToString(); // Boxing??
Run Code Online (Sandbox Code Playgroud)
如果有问题的结构覆盖从对象继承的方法,则不会发生拳击,如此处所接受的答案所述.
但是,如果结构不覆盖该方法,则在callvirt之前执行"约束" CIL命令.根据文档,OpCodes.Constrained Field,这导致拳击:
如果thisType是一个值类型而thisType没有实现方法,则ptr被解除引用,装箱,并作为'this'指针传递给callvirt方法指令.
我昨天看到了一个问题(对我来说)另一个问题.请看下面的代码:
public class Class1
{
int A; //as I uderstand, int is value type and therefore lives in the stack
}
class Class2
{
Run()
{
Class1 instance1 = new Class1();
instance1.A = 10; //it points to value type, but isnt this reference (on heap)?
}
}
Run Code Online (Sandbox Code Playgroud)
或者在创建Class1的实例时,它的字段类型也在堆上创建?但后来我不明白什么时候它真的会在堆栈上,因为几乎总是你需要创建一个对象实例才能使用它.
为什么ints和doubles不可变?每次要更改值时返回新对象的目的是什么?
我问的原因是因为我正在创建一个类:BoundedInt它有一个值和一个上限和下限.所以我想知道:我是否应该使这种类型不变?(或者它应该是struct?)
我认为面向对象编程被高估了,但我想学习这个范例.我一直在尝试使用QT 4在PHP 5和C++中执行此操作.不幸的是,我倾向于以结构化方式编程,我不使用很多继承也不使用多个实例.我想我必须学习一种纯粹的面向对象语言,迫使我使用上述功能.
我认为最好的选择可能是学习Ruby.您能否确认或命名更好的替代方案?
我主要在x86-64 Linux上工作.
值类型行为表明,我们持有的任何值都无法通过其他变量进行更改.
但是我仍然对我在这篇文章标题中提到的内容感到困惑.任何人都可以澄清吗?
从技术上讲,在C#中声明,实例化,初始化和分配对象的术语的含义和区别是什么?
我想我知道分配的意思,但我没有正式的定义.
在msdn中,有人说"创建对象的行为称为实例化".但创造的意义对我来说似乎含糊不清.你可以写
int a;
Run Code Online (Sandbox Code Playgroud)
在a随后产生的?
可能重复:
.NET中的所有内容都是对象吗?
ValueTypes如何从Object(ReferenceType)派生而仍然是ValueTypes?
嗨,我只是不明白.System.Object是(我认为)引用类型,但.NET中的所有数据类型都继承自它.值类型也是如此.我不明白它 - 值类型在堆栈上有它的值,但它继承自Object?希望有人能帮助我理解
如果有人能告诉我我是否理解它,我真的很感激:
class X
{
A a1=new A(); // reference on the stack, object value on the heap
a1.VarA=5; // on the stack - value type
A a2=a1; // reference on the stack, object value on the heap
a2.VarA=10; // on the stack - value type
}
Run Code Online (Sandbox Code Playgroud)
此外a1,a2引用都在堆栈上,而它们的"对象"值在堆上.但是VarA变量,它仍然是纯粹的价值类型呢?
class A
{
int VarA;
}
Run Code Online (Sandbox Code Playgroud) 很简单的问题:
int a = 5;
string str = a.ToString();
Run Code Online (Sandbox Code Playgroud)
既然ToString是System.Object的虚方法,它是否意味着每次我为整数类型调用此方法时,会发生装箱?
c# ×8
.net ×3
boxing ×2
stack ×2
types ×2
value-type ×2
heap ×1
immutability ×1
object ×1
oop ×1
terminology ×1