static void Main(string[] args) { SomeVal v1 = new SomeVal(); int a = v1.x; Boxed_Unboxed v = new Boxed_Unboxed(); v.Test2(); v.Test4(); v.Test5(); }
public void ShouldCopyreferenceButNotVal() { var r1 = new SomeRef(); var v1 = new SomeVal(); r1.x = 5; v1.x = 5; var r2 = r1; var v2 = v1; r1.x = 8; v1.x = 9; Assert.AreEqual(r1.x, r2.x); Assert.AreNotEqual(v1.x, v2.x); }
public static void Go() { SomeRef r1 = new SomeRef(); SomeVal v1 = new SomeVal(); r1.x = 5; v1.x = 5; SomeRef r2 = r1; SomeVal v2 = v1; r2.x = 8; v2.x = 8; Console.WriteLine("r1.x={0}", r1.x); Console.WriteLine("r2.x={0}", r2.x); Console.WriteLine("v1.x={0}", v1.x); Console.WriteLine("v2.x={0}", v2.x); }
static void ValueTypeDemo() { SomeRef r1 = new SomeRef(); SomeVal v1 = new SomeVal(); r1.x = 5; v1.x = 5; Console.WriteLine(r1.x); Console.WriteLine(v1.x); SomeRef r2 = r1; SomeVal v2 = v1; r1.x = 8; v1.x = 9; Console.WriteLine(r1.x); Console.WriteLine(r2.x); Console.WriteLine(v1.x); Console.WriteLine(v2.x); }
public static void Go() { SomeRef r1 = new SomeRef(); // Allocated in heap SomeVal v1 = new SomeVal(); // Allocated on stack r1.x = 5; // Pointer dereference v1.x = 5; // Changed on stack Console.WriteLine(r1.x); // Displays "5" Console.WriteLine(v1.x); // Also displays "5" // The left side of Figure 5-2 reflects the situation // after the lines above have executed. SomeRef r2 = r1; // Copies reference (pointer) only SomeVal v2 = v1; // Allocate on stack & copies members r1.x = 8; // Changes r1.x and r2.x v1.x = 9; // Changes v1.x, not v2.x Console.WriteLine(r1.x); // Displays "8" Console.WriteLine(r2.x); // Displays "8" Console.WriteLine(v1.x); // Displays "9" Console.WriteLine(v2.x); // Displays "5" // The right side of Figure 5-2 reflects the situation // after ALL the lines above have executed. }
static void ValueTypeDemo() { SomeRef r1 = new SomeRef(); // Allocated in heap SomeVal v1 = new SomeVal(); // Allocated on stack r1.x = 5; // Pointer dereference v1.x = 5; // Changed on stack Console.WriteLine(r1.x); // Displays "5" Console.WriteLine(v1.x); // Also displays "5" SomeRef r2 = r1; // Copies reference (pointer) only SomeVal v2 = v1; // Allocate on stack & copies members r1.x = 8; // Changes r1.x and r2.x v1.x = 9; // Changes v1.x, not v2.x Console.WriteLine(r1.x); // Displays "8" Console.WriteLine(r2.x); // Displays "8" Console.WriteLine(v1.x); // Displays "9" Console.WriteLine(v2.x); // Displays "5" }
static void ValueTypeDemo() { SomeRef r1 = new SomeRef(); // Allocated in heap SomeVal v1 = new SomeVal(); // Allocated on stack r1.x = 5; // Pointer dereference v1.x = 5; // Changed on stack Console.WriteLine(r1.x); // Displays "5" Console.WriteLine(v1.x); // Also displays "5" // The left side of Figure 5-2 reflects the situation // after the lines above have executed. SomeRef r2 = r1; // Copies reference (pointer) only SomeVal v2 = v1; // Allocate on stack & copies members r1.x = 8; // Changes r1.x and r2.x v1.x = 9; // Changes v1.x, not v2.x Console.WriteLine(r1.x); // Displays "8" Console.WriteLine(r2.x); // Displays "8" Console.WriteLine(v1.x); // Displays "9" Console.WriteLine(v2.x); // Displays "5" // The right side of Figure 5-2 reflects the situation // after ALL of the lines above have executed. }
static void Main(string[] args) { SomeRef Referencel = new SomeRef(); //分配在托管堆上 SomeVal Valuel = new SomeVal(); //分配在堆栈上 Referencel.x = 3; //解析指针 Valuel.x = 3; //在堆栈上修改 Console.WriteLine("引用类型:Referencel=" + Referencel.x); //显示为“3” Console.WriteLine("值类型:Valuel=" + Valuel.x); //显示为“3” SomeRef Reference2 = Referencel; //仅复制引用(指针) SomeVal Value2 = Valuel; //先在堆栈上分配,然后复制成员 Referencel.x = 8; //改变了Referencel.x和Reference2.x Valuel.x = 7; //改变了Valuel.x,没有改变Value2.x Console.WriteLine("引用类型:Referencel " + Referencel.x); Console.WriteLine("引用类型:Reference2 " + Reference2.x); Console.WriteLine("值类型:Valuel " + Valuel.x); Console.WriteLine("值类型:Value2 " + Value2.x); Console.ReadLine(); }
public static void TestInitialization() { // Две следующие строки компилируются, так как C# считает, // что поля в v1 инициализируются нулем SomeVal v1 = new SomeVal(); Int32 a1 = v1.x; // Следующие строки вызовут ошибку компиляции, поскольку C# не считает, // что поля в v1 инициализируются нулем SomeVal v2; // Int32 a2 = v2.x; // error CS0170: Use of possibly unassigned field 'x' // (ошибка CS0170: Используется поле 'x', которому не присвоено значение) }
static void ValueTypeDemo() { SomeRef r1 = new SomeRef(); // Размещается в куче SomeVal v1 = new SomeVal(); // Размещается в стеке // также можно записать: SomeVal v3; // Размещается в стеке r1.x = 5; // Разыменовывание указателя v1.x = 5; // Изменение в стеке Console.WriteLine(r1.x); // Отображается "5" Console.WriteLine(v1.x); // Также отображается "5" // В левой части рис. 5.2 показан результат // выполнения предыдущих строк SomeRef r2 = r1; // Копируется только ссылка (указатель) SomeVal v2 = v1; // Помещаем в стек и копируем члены r1.x = 8; // Изменяются r1.x и r2.x v1.x = 9; // Изменяется v1.x, но не v2.x Console.WriteLine(r1.x); // Отображается "8" Console.WriteLine(r2.x); // Отображается "8" Console.WriteLine(v1.x); // Отображается "9" Console.WriteLine(v2.x); // Отображается "5" // В правой части рис. 5.2 показан результат // выполнения ВСЕХ предыдущих строк }
public void TestInitialize() { _someRef = new SomeRef(); _someVal = new SomeVal(); }