как сохранить ссылочную переменную в классе С#

Я передаю classobject (объект класса Cache) в качестве ссылки в конструкторе Myclass.

public class Test{
  static void Main(string[] args){
     Cache<string, string> cache;
     Myclass obj = new MyClass(ref cache);
     obj.doSomething();
     Console.WriteLine(cache.key); // I want this value to get changed according to the doSomething Method
     Console.WriteLine(cache.value);// I want this value to get changed according to the doSomething Method
  }
}

Теперь в MyClass я хочу установить значение этого кеша

public class Myclass{
    ref Cache<string, string> C;
    Myclass(ref Cache<string, string> cache){
        this.C = cache;
    }
    void doSomething(){
        C.key = "key";
        C.value = "value"
    }
}

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

Вот полный сценарий, который я пытаюсь сделать. У нас нет нескольких организаций, и есть некоторые свойства организации, которые одинаковы для какой-то организации, и мы не хотим вычислять эти свойства снова и снова, поскольку это дорогостоящая операция. Эти свойства вычисляются в методе doSomethingMethod выше.

Мой кеш на самом деле представляет собой список. И эта переменная кеша будет передана в несколько организаций. Итак, в методе dosomething я хочу проверить, установлен ли кеш какой-либо другой организацией или нет, и если ключ присутствует, я не буду вычислять операцию, а просто вернусь из кеша.


person Devendra Verma    schedule 27.01.2021    source источник
comment
ref здесь вообще не требуется. Попробуйте не использовать его вообще.   -  person Damien_The_Unbeliever    schedule 27.01.2021
comment
Что такое кэш? Я думаю, вам нужно пересмотреть дизайн. Какова ваша цель? Пожалуйста, постарайтесь лучше объяснить вашу проблему, dev env, типы данных и ожидаемый результат, а также поделиться большим или меньшим количеством кода (без снимка экрана), изображениями или эскизами экранов, пользовательскими историями или диаграммами сценариев, а также примерами, как если это был модульный тест или использование API. Как я могу сделать вывод из предоставленного кода, изменение ключа и значения должно отражаться везде... я не понимаю этот дизайн, показанный здесь.   -  person Olivier Rogier    schedule 27.01.2021
comment
Привет, @Damien_The_Unbeliever, спасибо за комментарий. Это означает, что если я просто передам объект кеша (без ключевого слова ref), он будет передан как ссылка?   -  person Devendra Verma    schedule 27.01.2021
comment
Передавая экземпляр класса в качестве параметра метода, вы передаете ссылку по значению этой ссылки, поэтому при изменении свойств они изменяются в реальном времени в исходном объекте. Но присваивая переменную, вы не меняете исходную ссылку. Использование ref передаст ссылку на ссылку... для изменения самой ссылки: назначение ссылки с новым экземпляром отключит старый для нового даже с точки зрения вызывающей стороны.   -  person Olivier Rogier    schedule 27.01.2021
comment
@OlivierRogier Я обновил вопрос, указав сценарий, которого я пытаюсь достичь.   -  person Devendra Verma    schedule 27.01.2021
comment
@DevendraVerma Иногда описание целей может быть полезно для помощи, а также для понимания проблем кодирования, но для решения проблем с кодом, миссии Stack Overflow, нам нужен код. Чтение нескольких предложений, которые объясняют, как спецификации клиента, тем более, что я француз и не продвинут в английском языке, здесь для меня затруднено, а также для любого, кто медленнее, чем код, даже неправильный, плохой или псевдокод вместо литературы. Поэтому, пожалуйста, укажите, какое минимальное определение для Cache, это не список, а похоже на словарь, а также образец, как запрошено в моем предыдущем комментарии.   -  person Olivier Rogier    schedule 27.01.2021
comment
@DevendraVerma Например, я не понимаю, у нас нет нескольких организаций и мы не хотим вычислять это свойство снова и снова, поскольку это дорогостоящая операция и эта переменная кеша будет передана в несколько организаций и в методе dosomething я хочу проверить, установлен ли кеш какой-либо другой организацией или нет, и если ключ присутствует, я не буду вычислять операцию, и я просто вернусь из кеша. См. xyproblem.info и en.wikipedia.org/wiki/XY_problem   -  person Olivier Rogier    schedule 27.01.2021
comment
Если вы опустите ключевое слово ref, то, что вы передаете ctor , является ссылкой на экземпляр cache. Ссылка сама будет копией, но по-прежнему будет ссылаться на тот же экземпляр. Если вы затем измените свойства указанного экземпляра, это будет отражаться во всех других ссылках на тот же самый экземпляр.   -  person Fildor    schedule 27.01.2021


Ответы (1)


Если вы опустите ключевое слово ref, конструктору будет дана ссылка на экземпляр cache. Сама ссылка будет копией, но по-прежнему будет ссылаться на тот же экземпляр. Если вы затем измените свойства указанного экземпляра, это отразится на всех других ссылках на тот же экземпляр.

Рассмотрим этот пример:

using System;
                    
public class Program
{
    public static void Main()
    {
        MyCache sharedCache = new MyCache();
        Department dpt1 = new Department(sharedCache);
        Department dpt2 = new Department(sharedCache);
        
        Console.WriteLine($"Dpt1: {dpt1.CacheValue}");
        Console.WriteLine($"Dpt2: {dpt2.CacheValue}");
        
        sharedCache.Value = 1;
        Console.WriteLine($"Dpt1: {dpt1.CacheValue}");
        Console.WriteLine($"Dpt2: {dpt2.CacheValue}");
        
        dpt1.ChangeValue(2);
        Console.WriteLine($"Dpt1: {dpt1.CacheValue}");
        Console.WriteLine($"Dpt2: {dpt2.CacheValue}");
    }
}

public class Department
{
    private readonly MyCache cache;
    
    public Department(MyCache cache)
    {
        this.cache = cache;
    }
    
    public int CacheValue => this.cache.Value;
    public void ChangeValue(int newValue)
    {
        this.cache.Value = newValue;
    }
}

public class MyCache
{
    public int Value {get; set;} = default;
}

Выход:

Dpt1: 0
Dpt2: 0
Dpt1: 1
Dpt2: 1
Dpt1: 2
Dpt2: 2
person Fildor    schedule 27.01.2021