如何在 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
我在 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