C# 使用匿名对象+;动态
我有一个类,其中一个属性返回一个C# 使用匿名对象+;动态,c#,.net-4.0,C#,.net 4.0,我有一个类,其中一个属性返回一个列表。在这个列表中,我放置了一组匿名对象 之后,我有一个循环,使用该属性的项作为动态变量。 因此我的代码如下所示: private List<object> BookerTypes { get { if (this.bookerTypes == null) { this.bookerTypes = new List<object>(); var
列表
。在这个列表中,我放置了一组匿名对象
之后,我有一个循环,使用该属性的项作为动态变量。
因此我的代码如下所示:
private List<object> BookerTypes
{
get
{
if (this.bookerTypes == null)
{
this.bookerTypes = new List<object>();
var com = new SqlConnection(functions.ConnectionString).CreateCommand();
com.CommandText = @"
SELECT
BT.id
, BT.name
FROM dbo.BookerTypes AS BT
ORDER BY BT.name ASC
";
com.Connection.Open();
try
{
using (var dr = com.ExecuteReader())
{
while (dr.Read())
{
this.bookerTypes.Add(new { id = dr.GetInt32(0), name = dr.GetString(1) });
}
}
}
finally
{
com.Connection.Close();
}
}
return this.bookerTypes;
}
}
除了明显丢失强类型之外,还有什么原因我不应该这样做吗?不这样做的主要原因是,正如您所说,您已经丢失了静态类型。还有与之相关的性能成本,但它们没有此代码在可读性和可维护性方面的明显问题那么重要 如果结果是拼写错误或键入错误的变量名,则无法进行编译时检查(并且在没有代码完成支持的情况下更容易进行检查)。在编译时,您也没有任何有效的方法来知道
列表中可能存在哪些变量。追踪该列表的来源以找出可能存在哪些变量可供使用,这将成为一项非常重要的任务
在这种情况下,创建新的命名类型而不是使用匿名类型几乎肯定是值得的。创建新类的前期成本很小,实际上总是会有回报的。不这样做的主要原因是,正如您所说,您已经丢失了静态键入。还有与之相关的性能成本,但它们没有此代码在可读性和可维护性方面的明显问题那么重要
如果结果是拼写错误或键入错误的变量名,则无法进行编译时检查(并且在没有代码完成支持的情况下更容易进行检查)。在编译时,您也没有任何有效的方法来知道列表中可能存在哪些变量。追踪该列表的来源以找出可能存在哪些变量可供使用,这将成为一项非常重要的任务
在这种情况下,创建新的命名类型而不是使用匿名类型几乎肯定是值得的。创建新类的前期成本很小,实际上总是会有回报的。除了已经指出的类型安全损失和其他问题之外,我觉得在这里使用动态
是完全错误的
dynamic
的一般用例用于从外部来源(如API/COM等)使用数据。基本上,在信息类型尚未明确定义的情况下。在您的场景中,您可以控制需要什么数据,并且您知道需要什么类型的数据,因此我无法真正证明您为什么要使用它,而不是使用一个明确定义的类型安全模型所带来的好处
使用匿名对象+动态是否不明智
在你的情况下,我会说是的。除了已经指出的类型安全损失和其他问题之外,我觉得在这里使用动态
是完全错误的
dynamic
的一般用例用于从外部来源(如API/COM等)使用数据。基本上,在信息类型尚未明确定义的情况下。在您的场景中,您可以控制需要什么数据,并且您知道需要什么类型的数据,因此我无法真正证明您为什么要使用它,而不是使用一个明确定义的类型安全模型所带来的好处
使用匿名对象+动态是否不明智
在您的场景中,我会说是的。想象一下从另一个开发人员那里继承您的代码,您必须搜索以确定实际的类型是什么。想象一下从另一个开发人员那里继承您的代码,您必须搜索以确定实际的类型是什么is@James然后,请随意发布另一个答案,说明,如果有什么问题的话,您会觉得给定的代码有问题。我正在写一个答案,但您基本上已经涵盖了我所关心的问题-类型安全性的丧失以及一般使用dynamic
的缺点(简单的拼写错误等)。我只是补充一点,我不认为可读性会丢失,因为属性等都清晰可见。@James哦,我明白了。这是一个可读性问题,因为作为一名读者,很难确定程序是否正确。在运行时之前不会注意到命名错误,这是一个不容低估的问题,谢谢你提醒我,我显然需要它。@James然后,请随意发布另一个答案,说明什么,如果有的话,您觉得给定的代码有问题。我正在写答案,但您已经大致涵盖了我所关心的问题-类型安全性的丧失&通常使用dynamic
的脆弱性(简单的拼写错误等)。我只是补充一点,我不认为可读性会丢失,因为属性等都清晰可见。@James哦,我明白了。这是一个可读性问题,因为作为一个读者,很难确定程序是否正确。在运行时之前不会注意到命名错误,这是一个不容低估的问题,感谢您提供我显然需要的提醒。匿名类型是fum!:这要看情况而定。当您在使用它的代码上方几行“生成”一些真正特定的数据时,您实际上获得了时间(否则我们将永远不会使用匿名类)。在这种情况下,有更多的“几”行,所以这次我不使用dynamic+anonymous。@Serge是的,我同意在类型安全性不重要的情况下,它对于临时存储很有用。匿名类型是fum!:这要看情况而定。当您在使用它的代码上方几行“生成”一些真正特定的数据时,您实际上获得了时间(否则我们将永远不会使用匿名类)。在这种情况下,有更多的“几”行,所以这次我不使用dynamic+anonymous。@Serge是的,我同意这对临时的
this.cblSBT.Items.Clear();
foreach(dynamic bt in this.BookerTypes)
{
this.cblSBT.Items.Add(new ListItem()
{
Value = bt.id.ToString()
, Text = bt.name
, Selected = this.competition.SubscriptionTypes.Contains((int)bt.id)
});
}