c # pod копия или ссылка - PullRequest
       6

c # pod копия или ссылка

0 голосов
/ 17 октября 2011
float a = 3f; // presumably the same as float a = new float(3f);
float b = a;

Я хочу, чтобы 'b' было совершенно новым числом, а не ссылкой на 'a'.

Как мне это сделать?

Ответы [ 4 ]

6 голосов
/ 17 октября 2011

числа с плавающей точкой - это типы значений, а не ссылочные типы, поэтому b - это новое число с плавающей точкой, и изменение a не повлияет на b.

отметьте это: C # типы значений

2 голосов
/ 17 октября 2011

Я собираюсь продемонстрировать, используя ваш собственный код, что это уже работает так, как вы хотите:

using System;
public sealed class Program{

    public static void Main()
    {
        float a = 3f; // presumably the same as float a = new float(3f);
        float b = a;
        a = a + 1;
        Console.WriteLine("A:{0}", a);//prints 4
        Console.WriteLine("B:{0}", b);//prints 3
    }
}

И да, как уже отмечали другие люди, это работает так, потому что floatтип значения.Типы значений расположены в стеке.Это означает, что каждая переменная, которую вы объявляете и определяете как тип значения, будет иметь свое собственное пространство в стеке.По ссылочному типу выделяется куча.Это означает, что эти переменные не имеют реальных значений, которые они представляют в стеке.Но они просто указатели на реальные объекты в куче.Посмотрите на MSDN System.ValueType класс для большей ясности.

РЕДАКТИРОВАТЬ 1: Я был не прав насчет того, как типы значений ВСЕГДА хранятся в стеке.Любой, кто читает это, должен также прочитать этот вопрос и этот пост Эрика Липперта, чтобы понять, что на самом деле происходит под одеялом.В этом одном случае официальная документация Microsoft (ссылка, указанная выше) кажется неверной или, по крайней мере, способной неверно истолковать.

2 голосов
/ 17 октября 2011

Поскольку тип float является типом значения , он будет полностью отдельной переменной и никоим образом не будет ссылаться на a.Refernce Термин не имеет смысла для типов значений.

См. Типы значений в MSDN:

Типы значений состоят из двух основных категорий:

  1. Структуры
  2. Перечисления

Структуры подразделяются на следующие категории:

  • Числовые типы
  • Интегральные типы
  • Типы с плавающей точкой
  • десятичные
  • bool
  • Пользовательские структуры.
1 голос
/ 17 октября 2011

Просто продолжайте с вашим кодом.

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

Подтверждение факта:

Сделайте это вLinqPad

float a = 3f;
float b = a;

b = 3.1f;

a.Dump();
b.Dump();

Это результат:

3
3.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...