将属性名称存储在公共常量字符串中是一种很好的做法

本文关键字:一种 很好 存储 属性 字符串 常量 | 更新日期: 2023-09-27 18:02:16

为了保护自己免受失败,因为任何重命名属性(让我们说你重新生成你的poco类,因为你已经改变了一些列名在相关的Db表),这是一个很好的做法,声明常数字符串,保持属性名称在里面?

public const string StudentCountPropertyName = "StudentCount";
public int StudentCount {get;set;}

例如:考虑一个数据绑定;其中,您可以显式地在DataFieldName属性中键入属性名称。

或者这不是一个好主意,有一个更好的和更安全的方法?

将属性名称存储在公共常量字符串中是一种很好的做法

将任何'魔法字符串'移到常量中总是一个好主意。

你可以考虑使用lambda表达式来选择你的属性,例如:

GetDataFieldName(studentCollection => studentCollection.Count)

你必须自己实现GetDataFieldName,使用一点反射。您可以查看MVC中的HtmlHelperExtensions,看看它是如何完成的。这将是最安全的方法,当某些东西出错时,它会给你编译时的错误,并允许使用现有的重构工具轻松地重命名属性。

从一个角度来看:如果您多次使用此属性名称,这是一个很好的实践。它肯定有助于重构,例如,当你改变属性名时,你会发现你也需要改变这个const。

从另一个角度来看,我想这将是丑陋的,当我的类有10个属性将有10个额外的const。如果希望避免const或显式名称类型,另一种解决方案是通过反射获取属性名称。

使用与否由你自己决定。

我认为将这些"神奇字符串"或"神奇数字"放在某种强类型存储中是一种常见的做法。

你可以考虑用面向方面的方式来编码。

例如,对notifypropertychagned的调用可以通过aop框架(如PostSharp)实现的属性来实现。

[NotifyChange]
public int Value {get;private set}

这个工具也有一些缺点,但我认为在某些情况下,它们可以为你节省很多工作

我不知道我是否完全理解你的问题,但如果我理解正确,我会使用一个属性,一个例子可以是在Linq中使用ColumnAttribute,你用它来映射属性到数据库中的特定列(http://msdn.microsoft.com/en-us/library/system.data.linq.mapping.columnattribute.dbtype.aspx),就像这个例子:

[Column(Storage="ProductID", DbType="VarChar(150)", CanBeNull=False)]
public string Id { get; set; }

我永远不会使用DataFieldName,我会将数据绑定到强类型对象(当然也要为使用上述属性的类创建一个接口,以便我可以轻松地在将来更改实现;)

我想如果名称在许多地方使用,那么在这一个地方更改它们并使用您评论中描述的常量会更容易。

但是,更改数据库列名和对象属性名意味着更改概念数据模型。你觉得这种事多久会发生一次?在项目的早期阶段,虽然概念建模和执行在整个开发团队中是并行的,但这可能是相当不稳定的,但一旦最初的概念建模完成(无论是以形式化的有意识的方式还是有机的方式),这些基本的东西通常不太可能改变。由于这个原因,我认为这样做是相对不寻常的,并且该技术只会在边缘情况下有效。

当然。这个主意不错。

顺便说一下,我认为这些东西最好存储在应用程序设置中,因为您可以稍后通过覆盖这些设置在应用程序配置文件中定义这些东西。

这样做,你将避免重新编译如果一些数据库,POCO或任何变化,并且在新的Visual Studio版本,如2010,你可以告诉它生成设置与"公共"可访问性,你可以与任何程序集共享强类型的设置,引用包含它们的一个。

在一天结束的时候,我会用DataBindingSettings.StudentCountPropertyName而不是常数来改变你的代码。

易于管理,更具可重用性和可读性,就像"你用它的设置配置数据绑定"。

查看此MSDN文章以了解有关应用程序设置的更多信息:

  • http://msdn.microsoft.com/en-us/library/a65txexh (v = VS.100) . aspx