Другие языки программирования и технологии

C# Поле класса. Как присвоить не значение, а ссылку? Пример внутри.

Вот пример.
Class Program
{
static void Main(string[] args)
{
in Price = 10;

Car car = new Car();
car.CurrentPrice = Price;

Price = 20; //Изменяем Price
// Как сделать, чтобы car.CurrentPrice ссылалась на Price. Т. е. при изменении Price изменялось поле car.CurrentPrice тоже.
// Или так делать вообще не правильно?

}

}

Class Car
{
...
public int CurrentPrice { get; set; }
...
}
я так понял ты хочешь менять price в одном месте и что бы у всех объектов ссылающихся на этот price тоже было изменённое значение? можно конечно сделать как предлагает ra и использовать указатели, а можно int обернуть в ссылочный тип:

using System;

namespace ConsoleApplication64
{
class Program
{
static void Main(string[] args)
{
MyInt Price = new MyInt { Container = 10 };
Car car = new Car(Price);
Price.Container = 20;
Console.WriteLine(car.CurrentPrice);
}

}

class MyInt
{
public int Container { get; set; }
}

class Car
{
public int CurrentPrice
{
get
{
return ReferenceToPrice.Container;
}

set
{
ReferenceToPrice.Container = value;
}
}

public MyInt ReferenceToPrice { get; set; }

public Car(MyInt referenceToPrice)
{
ReferenceToPrice = referenceToPrice;
}
}
}
АЕ
Антон Елютин
1 816
Лучший ответ
Михаил Подрешетников Да! Спасибо. У меня то как раз не int Price предполагался, а объект класса. Я "упростил", пример, сделал просто число int, чтобы проверить сначала. Car.CurrentPrice = Price уже получает ссылку на Price, где Price - это объект класса, а не int. Про понятие "ссылочный тип" не знал.
> // Или так делать вообще не правильно?
Да.

Для чего нужна переменная Price? Можно:
car.CurrentPrice = 10;
...
car.CurrentPrice = 20;
...

Можно использовать указатели, но код становится небезопасным. Нужны очень веские причины, что бы использовать такое в программе.

using System;

class Test {
    unsafe private int* _val;
    unsafe public void SetPtr(int* ptr) { _val = ptr; }
    unsafe public int Val {
        get {
            if (_val != null) return *_val; else return 0;
        }
        set {
            if (_val != null) *_val = value;
        }
    }
}

class Program {
    static void Main(string[] args) {
        int n = 10;
        var test = new Test();
        unsafe {
            test.SetPtr(&n);
        }
        Console.WriteLine("test.Value = " + test.Val);
        n += 10;
        Console.WriteLine("test.Value = " + test.Val);
    }
}

Компилируется только с опцией /unsafe