Я понимаю теоретическую концепцию, согласно которой при присвоении одной переменной ссылочного типа другой копируется только ссылка, а не объект. присваивая одну переменную типа значения другой, объект копируется. Но я не могу заметить отличия в коде. Кто-нибудь любезно указал бы на разницу между следующими двумя блоками кода? Спасибо!
НАЗНАЧЕНИЕ РЕФЕРЕНТНОГО ТИПА
using System;
class Employee
{
private string m_name;
public string Name
{
get { return m_name; }
set { m_name = value; }
}
}
class Program
{
static void Main()
{
Employee joe = new Employee();
joe.Name = "Joe";
Employee bob = new Employee();
bob.Name = "Bob";
Console.WriteLine("Original Employee Values:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine();
Console.WriteLine("Values After Reference Assignment:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
joe.Name = "Bobbi Jo";
Console.WriteLine();
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Name);
Console.WriteLine("bob = " + bob.Name);
Console.ReadKey();
}
}
НАЗНАЧЕНИЕ ТИПА СТОИМОСТИ
using System;
struct Height
{
private int m_inches;
public int Inches
{
get { return m_inches; }
set { m_inches = value; }
}
}
class Program
{
static void Main()
{
Height joe = new Height();
joe.Inches = 71;
Height bob = new Height();
bob.Inches = 59;
Console.WriteLine("Original Height
Values:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
// assign joe reference to bob variable
bob = joe;
Console.WriteLine();
Console.WriteLine("Values After Value Assignment:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
joe.Inches = 65;
Console.WriteLine();
Console.WriteLine("Values After Changing One Instance:");
Console.WriteLine("joe = " + joe.Inches);
Console.WriteLine("bob = " + bob.Inches);
Console.ReadKey();
}
}
5 ответов
Что ж, очевидная разница в том, что в примере с классом кажется, что и joe, и bob изменились в последней части на одно и то же значение.
В примере структуры они сохраняют свои отдельные значения просто потому, что каждая переменная сама по себе является целым значением структуры, а не просто ссылкой на общий объект в памяти.
Основное различие в коде заключается в том, какой тип вы используете, class или struct , который определяет, создаете ли вы ссылочный тип или тип значения.
Один - это структура, а другой - класс. Это кажется слишком сложным примером, включающим не только различия в значениях и ссылках, но и различия между классами и структурами.
Когда одна структура назначается другой, создается копия.
Когда один класс присваивается другому, изменяется только ссылка.
// Тип ссылки
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
sb2 = sb1;
sb1.Append("hello");
sb1.Append("world");
Console.WriteLine(sb2);
// Output Hello World
// value Type
int x=100;
int y = x;
x = 30;
Console.WriteLine(y);
// Out put 100 instead of 30
Первый фрагмент кода содержит Employee, который является классом , а во втором Employee - структура .
В моей системе эти два блока кода дают следующий результат:
Исходные ценности сотрудников:
joe = Joe bob = Bob Values After Reference Assignment: joe = Joe bob = Joe Values After Changing One Instance: joe = Bobbi Jo bob = Bobbi Jo
...и...
Original Height Values: joe = 71 bob = 59 Values After Value Assignment: joe = 71 bob = 71 Values After Changing One Instance: joe = 65 bob = 71
Разница кажется очевидной. В первом примере изменение одного из значений влияет на обе ссылки, поскольку они обе ссылаются на один и тот же базовый объект. Во втором примере изменение одного из объектов влияет только на этот объект, поскольку при копировании типов значений каждый объект получает свою собственную частную копию. Когда вы говорите bob = joe; во втором примере вы не назначаете ссылку (комментарий вводит в заблуждение). Вы создаете новый экземпляр структуры Height, копируете все значения из joe и сохраняете новый объект как bob.
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.