动态字典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是否包含两个变量中值的副本?
似乎是一个参考,但不确定
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;}}