2010-08-26 2 views
0

hi Я немного запутался в типе значения или ссылочном типе ... например, int является строкой типа значения, является ссылочным типом, но int также ссылается на некоторое значение , как int int i=4 int j=i здесь j также ссылается на 4 как на i, так почему бы нам не назвать его ссылочным типом ...... в случае string s="hello" string s1=s здесь s реферирует s ..... будет ли кто-нибудь объяснять с точки зрения хранения. ..... существует ли какое-либо ограничение по типу ценных бумаг или типу ссылочного типа.что такое тип значения и тип ссылки в .net

ответ

1
int i=4; 
int j=i; 

int является типом значения, это означает, что это выражение j=i копирует значение из г в у.

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

string является ссылочным типом, так здесь не значение копируется, но ссылка на эту строку, поэтому теперь они указывают на тот же объект.

1

Тип значения содержит значение, ссылочный тип содержит ссылку на другую переменную.

В вашем примере я держу значение 4, но j = i означает, что j все еще содержит значение 4, даже если i изменяется на 5. j не изменяет его значение, поэтому это не ссылочный тип.

Строки такие же. Вы можете сказать s1 = s, но когда s изменится на «hello2», s1 останется «привет». Действует как тип значения, но под капотом, хранящийся как ссылочный тип, см. Ниже.

Массивы и объекты являются ссылочными типами. Если вы скажете obj2 = obj, а obj изменится, obj2 также изменится. Obj2 содержит ссылку или указатель на, obj, изменения и все.

также смотрите: Visual Basic .NET Syntax Reference Primer

содержащий:

Строка инициализации выглядит следующим образом: "Hello, World!"

Dim туЗЬптд As String =

Строки неизменяемы, что означает, что после присвоения им значения они не могут быть изменены. Всякий раз, когда вы назначаете другое значение строке или конкатенируете значение для строки, вы фактически создаете новую копию строковой переменной и удаляете старую копию строки. (Это связано с потенциальными соображениями производительности, если вы выполняете повторяющуюся работу с строковой переменной, используйте StringBuilder для таких задач, поскольку это не является неизменным, т. Е. StringBuilder является Mutable).

Я думаю, что более точно сказать, что вы удаляете старую ссылку на строковую переменную, так как любые другие строки, указывающие на нее, сохраняют свое значение.

+0

Строки неизменны, но очень ссылочный тип, они просто ведут себя, как типы значений для целей сравнения равенства. –

+0

Я думаю, это то, что пугает людей. Под капотом строки являются ссылочными типами, пока они не будут изменены, когда они получат новую ссылку на новое значение. Другие строки, ссылающиеся на исходное значение, не следуют вместе с новым. – Beth

+1

Но подумайте об этом, назначение строк не отличается от других назначений ссылочного типа. 'string a =" abc "; строка b = a; a = "123"; 'не отличается от Foo a = new Foo (" abc "); Foo b = a; a = new Foo ("123"); 'В обеих ситуациях объект, на который ссылается' b', не изменился. Тот факт, что строки неизменяемы, - это то, что бросает людей, так как манипуляция строка * всегда приводит к новой строке. Но изменение строки целиком с помощью оператора '=' не уникально для 'string' по сравнению с другими ссылочными типами. –

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"; 

Теперь мы chnaged ссылку в s1, но s2 еще относится к «шататься»

+0

снова я смущен от вашего последнего заявления, когда у нас есть шанс s1 = "somethingelse", то почему бы не s2 не изменится bcz you s2 и s1 - тип ссылки –

+0

привет, сэр, я смущен из вашего последнего заявления ..... вы будете уточните его plz sir .. –

+1

славный сэр теперь я получил его на самом деле в последнем заявлении, которое вы меняете, это аромат, который обозначен s1..but, здесь точка разговора - это то, что s2 все еще ссылается на s1 предыдущее значение. .......... спасибо много –

Смежные вопросы