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