Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中的类之间共享对象#_C#_.net_Pass By Reference - Fatal编程技术网

C# 在C中的类之间共享对象#

C# 在C中的类之间共享对象#,c#,.net,pass-by-reference,C#,.net,Pass By Reference,我想让两个类共享一个对象,如果它们有相同的键(它只是一个字符串),那么如果对象的值发生变化,它在两个类中都会发生变化。我认为这就像让两个对象指向同一个内存地址一样,所以在C语言中可以使用指针来完成。为了阐明我想做什么,我准备了下一个示例代码: class MyObject { string key; int value; public MyObject(string key, int value) { this.key = key;

我想让两个类共享一个对象,如果它们有相同的键(它只是一个字符串),那么如果对象的值发生变化,它在两个类中都会发生变化。我认为这就像让两个对象指向同一个内存地址一样,所以在C语言中可以使用指针来完成。为了阐明我想做什么,我准备了下一个示例代码:

class MyObject
{
    string key;
    int value;

    public MyObject(string key, int value)
    {
        this.key = key;
        this.value = value;
    }
}

class MainClass{

    MyObject parameter = new MyObject("key", 5);
    List<MyObject> list = new List<MyObject>();
    list.Add(parameter);

}

class SecondaryClass{

    MyObject parameter = new MyObject("key", 0);
    List<MyObject> list = new List<MyObject>();
    list.Add(parameter);
}

MainClass mainClass = new MainClass();
SecondaryClass secondaryClass = new SecondaryClass();

foreach (MyObject newParameter in mainClass.list)
{
    // Try to find a match in the parameterKey
    MyObject parameter = secondaryClass.list.Find(p => p.Key == newParameter.Key);

    // If there is a match, update the object
    if (parameter != null)
    {
        parameter = newParameter;
    }
}

Console.WriteLine(mainClass.parameter.value) // This output 5

Console.WriteLine(secondaryClass.parameter.value) // This output 0
主要有两个问题:

  • MyObject比这里显示的更复杂,有更多 属性内部

  • MainClass和SecondaryClass有多个对象MyObject,只需要共享具有相同键的对象(并且两个类都可以不共享MyObject对象)


使用
parameter=newParameter
,您只需修改作为局部变量的
MyObject参数的引用。

您没有修改secondaryClass列表中对象的引用。

问题的原因由S.Schenkel描述:您只是用当前的伪代码重新分配局部变量

例如,如果要更新“参考”的实际对象,可以执行以下操作来访问实际对象并更改实际感兴趣的字段:

您可以像这样访问实际对象,例如:

if (parameter != null)
{
    parameter.value = newParameter.value;
}
但是,您应该将
value
设置为公共字段或具有公共setter的属性,这样才能做到这一点


当然,这只是为了让你明白

也许你应该做一些更清楚/更好的事情,比如:

class SecondaryClass
{
    public MyObject parameter = new MyObject("key", 0);
    public List<MyObject> list = new List<MyObject>();

    public SecondaryClass()
    {
        list.Add(parameter);
    }

    public UpdateParameter(MyObject newParameter, string key) 
    {
        // here you can write code that can *directly* access your field or list.
        // you can, for instance, search for the object by key in the list, delete it from the list, and add `newParameter` to the list
        // and reassign "parameter" with this new object.
    }
}
注意:我不理解除了使用一个字段存储单个参数外,还使用参数“列表”的想法


正如所建议的,如果您有多个键值对,您应该使用
字典
作为Main类和Secondary类的内部字段,这将大大简化代码的访问和可读性。

您是否尝试过将MyObject类设为单例?然后可以利用任何数据结构类,如哈希表。我建议使用哈希表的原因是因为它是线程安全的

只能快速读取,这不是答案,但仅供参考,所有对象(类)变量都包含对C#中对象的引用<代码>变量a=新事物();变量b=a;//现在b指的是与a*在内存中完全相同的对象(如果
某物
是一个类)。顺便说一句,类也被称为引用类型,原因与此相同。@Pac0是的,我希望是这样,但实际情况并非如此。很难确切地理解您在寻找什么,因为您只发布了伪代码。请提供一个。使用字典这太简单了。@JonSkeet done,下次我会从头开始这样做。这正是造成混淆的原因。这只会更新值,而不会更新对象本身。我已经包含了新的代码,在最后几行中可以看出我希望两个对象是一样的。@Ignacio:您必须创建一些代码来执行更新,例如SecondaryClass的方法。为了更好地理解:您有一个引用对象的字段。您在其他地方有对同一对象的引用。如果您通过重新分配变量来更改后一个引用,那么这不会更改字段最初引用的对象。这只是更改了本地的后一个引用。我真的不知道如何处理这样一个事实,即您的参数有两个引用:一个在字段“parameter”中,另一个在列表中的某处。这真的有必要吗?问题是有一个包含许多MyObject的Main类(比示例更复杂,包含更多的东西)和几个共享对象的其他类(SecondaryClass、SecondaryClass2等)。如果我在一个object SecondaryClass中更改其中一个MyObject的值,我希望该更改传播到MainClass、SecondaryClass2等的其他对象。可能这超出了堆栈溢出问题的范围。也许最好的办法是解释你想要达到什么,你的最终目标。对我来说,这闻起来像是一场灾难。也许您的总体架构可以得到很大的改进和简化,但我们需要了解您的规范,以及您想要实现的目标。
if (parameter != null)
{
    parameter.value = newParameter.value;
}
class SecondaryClass
{
    public MyObject parameter = new MyObject("key", 0);
    public List<MyObject> list = new List<MyObject>();

    public SecondaryClass()
    {
        list.Add(parameter);
    }

    public UpdateParameter(MyObject newParameter, string key) 
    {
        // here you can write code that can *directly* access your field or list.
        // you can, for instance, search for the object by key in the list, delete it from the list, and add `newParameter` to the list
        // and reassign "parameter" with this new object.
    }
}
    foreach (MyObject newParameter in mainClass.list)
    {
        // Try to find a match, and update it in the parameterKey
        secondaryClass.UpdateParameter(newParameter);
    }