.net中的值类型和引用类型的含义是什么

时间:2010-08-26 13:25:07

标签: .net

嗨,我对估值类型或反叛类型有点困惑...... 例如,int是一个值类型字符串是referance类型,但int也提供了一些值 像int int i=4 int j=i这里j也像我一样被判4,所以为什么我们不把它称为referance类型......在string s="hello" string s1=s的情况下,这里是s referancing s .....任何人都会在存储的角度解释......是否对价值类型或反对类型有任何限制。

3 个答案:

答案 0 :(得分:1)

int i=4;
int j=i;

int是值类型,表示此表达式j=i将值从i复制到j。

string s="hello";
string s1=s;

string是引用类型,所以这里没有复制值,而是引用该字符串,因此它们现在指向同一个对象。

答案 1 :(得分:1)

值类型包含值,引用类型包含对另一个变量的引用。

在你的例子中,我保持值4,但是j = i表示j仍然保持值4,即使我变为5. j不会改变它的值,所以它不是引用类型。

字符串也是一样的。你可以说s1 = s,但当s变为'hello2'时,s1保持'你好'。行为类似于值类型,但在引擎盖下,存储类似于引用类型,请参见下文。

数组和对象是引用类型。如果你说obj2 = obj,并且obj改变了,obj2也会改变。 Obj2拥有一个引用,或指向obj,change和all的指针。

另见: Visual Basic .NET Syntax Reference Primer

含有:

字符串初始化如下:

Dim myString as String =“Hello,World!”

字符串是不可变的,这意味着一旦为它们赋值,就无法更改它们。 每当您为字符串分配另一个值或将值连接到字符串时,您实际上是在创建字符串变量的新副本并删除该字符串的旧副本。 (如果您正在对字符串变量进行重复工作,则可能会考虑性能,使用StringBuilder执行此类任务,因为它不是不可变的,即StringBuilder是Mutable)。

我认为你说删除对字符串变量的旧引用更准确,因为指向它的任何其他字符串都保留它们的值。

答案 2 :(得分:1)

问问自己,当事情发生变化时会发生什么:

int i = 4;
int j = i;

i = 7;  // Q1). now what value does j have?

j = 99; // Q2) what value does i now have?

Q1)。将7分配给i对j没有影响,j仍然具有值4。

Q2)。将99分配给j对i没有影响,我仍然有(最新)值7;

字符串有点难以解释,因为在某些语言中你无法改变它们。所以我将使用一种(发明的)语言来改变字符串中的值是合法的。

string s1 = "Hello";
si[0] = 'J';  // now s1 is set to "Jello"

所以我们说

string s1 = "wibble";
string s2 = s1;
// here s2 is **referring** to "wibble", the same "wibble" that s1 refers to.

s1[1] = 'o';  

// now what does s1 refer to? "wobble"

// Big question: what does s2 refer to? The very same thing, "wobble".

所以s1和s2目前是引用到同一件事。我们现在可以写了

s1 = "SomethingElse";

现在我们已经在s1中修改了引用,但是s2 仍然引用了“wobble”