如何在 class c# 中存储引用变量

how to store a reference variable in class c#

我在 Myclass.

的构造函数中传递一个 class 对象(Cache class 对象)作为引用
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
  }
}

现在在我的Class中,我要设置这个缓存的值

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 中更改缓存值应该反映在测试 Class 中。但我不确定如何实现这一目标。任何帮助将不胜感激。

这是我正在尝试做的完整方案。我们没有多个组织,并且组织的某些属性对于某些组织是相同的,我们不想一次又一次地计算这些 属性,因为它是昂贵的操作。这些属性是在上面的 doSomethingMethod 中计算的。

我的缓存实际上是一个列表。并且这个缓存变量将在多个组织中传递。所以在 dosomething 方法中,我想检查缓存是否被任何其他组织设置,如果密钥存在,我将不会计算操作,我只会从缓存中 return。

如果您省略 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