如何在 c# 中分配后保留有关对象的信息?

Posted

技术标签:

【中文标题】如何在 c# 中分配后保留有关对象的信息?【英文标题】:How can I persist information about an object after assignment in c#? 【发布时间】:2016-05-17 07:19:50 【问题描述】:

我一直在问我的想法might be solutions,但有人指出我陷入了 XY 问题,我应该问我的确切问题。

我有一个结构,我希望其他人能够在他们自己的程序中使用它。需要可以从其他现有类型隐式转换为此类型,但同时在此分配之后需要保留一些信息。下面是一个简单的问题示例:

using System;
public struct MyStruct 
    public string SomethingImportant;
    public MyStruct(string s) 
        SomethingImportant = s;
    

    //this function needs to have no knowledge of how/where the struct is being used
    public bool SomeFunction(string s) 
        return s == SomethingImportant;
    

    public static implicit operator MyStruct(double x) 
        return new MyStruct();
    

public class MyClass 
    MyStruct child = new MyStruct("important");

    public MyClass() 
        //prints out "important"
        Console.WriteLine(child.SomethingImportant);
        child = 7.5;
        //prints out ""
        Console.WriteLine(child.SomethingImportant);
    

在用隐式转换的新结构替换结构后,SomethingImportant 中存储的信息将丢失。这将是重载赋值运算符的自然位置,但不幸的是,这在 c# 中是不可能的。

我的想法转向属性,因为在对象的初始声明之后不需要修改额外的信息,如果持久性仅限于类的字段,这将是几乎可以接受的。这似乎不是一个可行的选择,因为结构无法访问与其关联的属性,除非它知道它所在的类型。

有没有办法在 c# 中远程完成这样的事情?我知道添加像MyStruct.Update(double x) 这样的显式更新函数会提供所需的行为,但是根据库的功能,这对于重写大量现有代码的用户来说将是一个巨大的负担。我宁愿在自己的代码中做一些凌乱、不安全或晦涩难懂的事情,也不愿需要为图书馆用户进行如此多的重写。

感谢您的任何想法!

【问题讨论】:

由于child 是一个对象引用,而不是实际对象,我看不出有一种明显的方法可以使= 的行为符合您对隐式转换的期望。 【参考方案1】:

我想说这根本不可能,因为“重要的事情”并不适用于所有 MyStruct 实例(在这种情况下,简单的解决方案是使其成为 static)。

隐式转换创建了一个新对象,它不知道它被分配给哪个变量,即使它根本没有被分配。因此,您无法访问该变量中的任何数据。

也许您对属性的想法值得追求,即将标记在您的类层次结构中上移一级。

为了澄清我的观点,预期的输出是什么:

public class MyClass

    public MyClass() 
    
        MyStruct child1 = new MyStruct( "abc" );
        // should print "abc"
        Console.WriteLine(child1.SomethingImportant);

        MyStruct child2 = 7.5;
        // should print out what?
        Console.WriteLine(child2.SomethingImportant);

        MyStruct child3 = new MyStruct( "cde" );
        child3 = 5.7;
        // will never, ever print "cde" (if not static)
        Console.WriteLine(child2.SomethingImportant);
    

但这会起作用:

public MyOtherClass

    public MyStruct TheChild;
    public string SomethingImportantAssociatedToTheChild;


[...]

MyOtherClass a;
a.SomethingImportantAssociatedToTheChild = "abc";
a.TheChild = 7.5;

【讨论】:

预期输出将是“”,因为从未设置过SomethingImportant。我知道这也是我原始示例中第二个输出为 "" 的原因,但我正在寻找解决方法或技巧。

以上是关于如何在 c# 中分配后保留有关对象的信息?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中释放在 C++ 中分配的内存

有关如何在 c# 中为 Windows 7 任务栏编码所需的信息

方法逃逸

将孩子存储在数据库中,保留有关其订单的信息

使用 c# 如何提取有关本地计算机上存在的硬盘驱动器的信息

我们如何在 C# 中获取磁盘性能信息