วิธีจัดเก็บตัวแปรอ้างอิงในคลาส c#

ฉันกำลังส่ง classobject (วัตถุคลาสแคช) เป็นข้อมูลอ้างอิงในตัวสร้างของ 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 ควรสะท้อนให้เห็นใน Test Class แต่ฉันไม่แน่ใจว่าจะบรรลุเป้าหมายนี้ได้อย่างไร ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม

นี่คือสถานการณ์สมมติที่สมบูรณ์ซึ่งฉันพยายามทำ เราไม่มีองค์กรหลายแห่ง และมีคุณสมบัติบางอย่างขององค์กรซึ่งเหมือนกันสำหรับบางองค์กร และเราไม่ต้องการคำนวณคุณสมบัติเหล่านั้นซ้ำแล้วซ้ำอีก เนื่องจากมีการดำเนินการที่มีค่าใช้จ่ายสูง คุณสมบัติดังกล่าวได้รับการคำนวณใน doSomethingMethod ข้างต้น

จริงๆ แล้วแคชของฉันคือรายการ และตัวแปรแคชนี้จะถูกส่งไปในหลายองค์กร ดังนั้นในวิธีการบางอย่าง ฉันต้องการตรวจสอบว่าแคชถูกตั้งค่าโดยองค์กรอื่นหรือไม่ และหากมีคีย์อยู่ ฉันจะไม่คำนวณการดำเนินการ และฉันจะคืนจากแคชเท่านั้น


person Devendra Verma    schedule 27.01.2021    source แหล่งที่มา
comment
ref ไม่ควรบังคับที่นี่เลย ลองไม่ใช้มันเลย   -  person Damien_The_Unbeliever    schedule 27.01.2021
comment
แคชคืออะไร? ฉันคิดว่าคุณต้องคิดใหม่เกี่ยวกับการออกแบบ เป้าหมายของคุณคืออะไร? โปรดพยายามอธิบายปัญหาของคุณ, สภาพแวดล้อมการพัฒนา, ประเภทข้อมูล & ผลลัพธ์ที่คาดหวังให้ดียิ่งขึ้น ตลอดจนแชร์โค้ดให้มากขึ้นหรือน้อยลง (ไม่มีภาพหน้าจอ) รูปภาพหรือภาพร่างของหน้าจอ เรื่องราวของผู้ใช้ หรือไดอะแกรมสถานการณ์ รวมถึงตัวอย่าง เช่น หาก เป็นการทดสอบหน่วยหรือการใช้งาน API เนื่องจากฉันสามารถหักจากรหัสที่ให้มาได้ การเปลี่ยนคีย์และค่าจึงควรสะท้อนให้เห็นทุกที่... ฉันไม่เข้าใจการออกแบบนี้ที่แสดงไว้ที่นี่   -  person Olivier Rogier    schedule 27.01.2021
comment
สวัสดี @Damien_The_Unbeliever ขอบคุณสำหรับความคิดเห็น หมายความว่าถ้าฉันเพิ่งส่งวัตถุแคช (โดยไม่มีคำหลักอ้างอิง) มันจะถูกส่งผ่านเป็นข้อมูลอ้างอิงหรือไม่   -  person Devendra Verma    schedule 27.01.2021
comment
การส่งผ่านอินสแตนซ์ของคลาสเป็นพารามิเตอร์ของวิธีการ คุณจะส่งผ่านการอ้างอิงตามค่าของการอ้างอิงนี้ ดังนั้นเมื่อเปลี่ยนคุณสมบัติ คุณสมบัติเหล่านั้นจะถูกเปลี่ยนแปลงทันทีในออบเจ็กต์ดั้งเดิม แต่การกำหนดตัวแปร คุณจะไม่เปลี่ยนการอ้างอิงดั้งเดิม การใช้การอ้างอิงจะส่งผ่านการอ้างอิงไปยังการอ้างอิง... เพื่อแก้ไขการอ้างอิงนั้นเอง: การกำหนดการอ้างอิงด้วยอินสแตนซ์ใหม่จะตัดการเชื่อมต่อแบบเก่าสำหรับอินสแตนซ์ใหม่ แม้ว่าจะมาจากมุมมองของผู้เรียกก็ตาม   -  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 ตัวอย่างเช่น ฉันไม่เข้าใจ เรามีองค์กรไม่มากนัก และ เราไม่ต้องการคำนวณคุณสมบัติเหล่านั้นซ้ำแล้วซ้ำอีก เนื่องจากมีการดำเนินการที่มีค่าใช้จ่ายสูง และ ตัวแปรแคชนี้จะถูกส่งผ่านในหลายองค์กร และ ในวิธีการบางอย่าง ฉันต้องการตรวจสอบว่าแคชถูกตั้งค่าโดยองค์กรอื่นหรือไม่ และหากมีคีย์อยู่ ฉันจะไม่คำนวณ การดำเนินการและฉันเพิ่งจะกลับจากแคช โปรดดูที่ 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