动态字典vs对象和引用

本文关键字:引用 对象 vs 字典 动态 | 更新日期: 2023-09-27 18:18:11

我有自己的数据类型用于具有各种属性来操作值的数据库,例如:

First: original value
IsNull: is the current state null (no value in Data)
IsFirstNull: was the initial state of the object null
Changed: has the value changed since the initial value was set.
SetNull(): set the object to null
SetFirstNull: set the initial value to null
Reset: set values all to original settings.

每个对象都有这些。每种类型的标准变量都有一个对象,例如:

int - IntType
string - StringType
bool - BoolType

对于我正在使用的每个表,我在一个类中都有这些变量。

我希望能够访问这些,所以我正在考虑将这些添加到字典中。但是每个条目都是不同的类型(IntType, StringType, BoolType等)。

我把它们设为Dictionary<string, object>Dictionary<string, dynamic>

不确定哪个是最好的-一个比另一个好吗?

 public class LoginDC
 {
    private IntType loginID = new IntType();
    private StringType userName = new StringType();
    public LoginDC()
    {
       Dictionary<string, dynamic> propertyList = new Dictionary<string, dynamic>();
       propertyList.Add("LoginID", loginID);
       propertyList.Add("UserName", userName);
       propertyList["UserName"].First = "Tom"
    }
 }

我的另一个问题是:

propertyList是否包含对loginID和userName的引用?因此,如果我改变propertyList或变量都将包含相同的值。或者propertyList是否包含两个变量中值的副本?

似乎是一个参考,但不确定

动态字典vs对象和引用

Dictionary<string, object>Dictionary<string, dynamic>都有其缺点。使用object,您必须将每个对象强制转换为其类型,然后才能使用它。使用dynamic,您将失去对您调用的方法的编译时检查,从而增加了出现错误的可能性,直到您发现时为时已晚。

我根本不建议你采取这种方法。评论是对的:你似乎在试图重新发明轮子。有很多非常好的库可以将数据从数据库映射到对象。使用免费的。

回答你的第二个问题:

  • 如果您的自定义对象类型是class,那么propertyList包含对它们的引用。
  • 如果它们是struct,它将包含它们的副本。

您可以通过在LinqPad之类的工具中运行这样的快速脚本来自己测试:

void Main()
{
    var a = new A{I = 1};
    var b = new B{I = 1};
    var propertyList = new Dictionary<string, dynamic>();
    propertyList.Add("a", a);
    propertyList.Add("b", b);
    a.I = 2;
    b.I = 2;
    foreach (var value in propertyList.Values)
    {
        Console.WriteLine(value.I);
    }
    // Output:
    //  2
    //  1
}
public class A{public int I{get;set;}}
public struct B{public int I{get;set;}}