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

时间:2011-07-14 06:12:32

标签: c# .net data-binding constants strong-typing

为了保护自己免于失败,因为任何属性的重命名(假设您重新生成了poco类,因为您在相关的Db表中更改了一些列名称)是一个很好的做法来去除保留属性的常量字符串里面的名字?

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

例如:想想DataBinding;在那里显式地在DataFieldName属性中键入属性名称。

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

6 个答案:

答案 0 :(得分:2)

恕我直言,将任何“魔法字符串”移动到常量总是一个好主意。

您可以考虑使用lambda表达式“选择”您的属性,例如:

GetDataFieldName(studentCollection => studentCollection.Count)

您必须自己实施GetDataFieldName,使用一些反思。您可以从MVC查看HtmlHelperExtensions以了解它是如何完成的。这将是最安全的方法,它可以在出现问题时为您提供编译时错误,并允许使用现有的重构工具轻松重命名。

答案 1 :(得分:1)

从一个角度来看:如果你多次使用这个属性名称,这是一个好习惯。它将有助于确保重构,当您例如更改属性名称时,您会看到您还需要更改此const。

从另一个角度来看,我认为当我的10个属性的班级将有10个额外的consts时,它会很难看。如果您想要避免consts或显式名称输入,另一种解决方案是通过反射获取属性名称。

是否使用这种方法你应该自己决定。

答案 2 :(得分:1)

我认为将这种“神奇的字符串”或“神奇的数字”放在某种强大的商店中是一种常见的做法。

您可以考虑的是以面向方面的方式对其进行编码。

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

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

这个工具也有一些缺点,但我认为有些情况可以为你节省大量的工作

答案 3 :(得分:1)

我不知道我是否完全理解你的问题,但如果我理解正确的话我会使用一个属性,一个例子可能是在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,我会将DataBind用于强类型对象(当然也可以创建一个使用上述属性的类的接口,这样我以后就可以轻松地更改实现;)

答案 4 :(得分:0)

我想如果在很多地方使用名称,那么只需在这一处更改它们就可以更容易,并使用评论中描述的常量。

但是,更改数据库列名称和对象属性名称意味着更改概念数据模型。您认为这种情况会发生多久?在项目的早期阶段,虽然概念建模和实现在开发团队中进行了并列化,但这可能是非常流畅的,但是一旦最初的概念建模完成(无论是以形式化的有意识的方式还是仅仅是有机的),它通常都是相当的不太可能像这些基本的东西会发生变化。出于这个原因,我认为这样做是相对不寻常的,而且这种技术只会在边缘情况下有效。

答案 5 :(得分:0)

绝对。这是一个好主意。

顺便说一句,我认为这些事情可以更好地存储在应用程序设置中,因为您可以稍后通过覆盖这些设置在应用程序配置文件中定义这些内容。

这样做可以避免重新编译,如果某些数据库,POCO或其他任何更改,以及像2010年更新的Visual Studio版本,您可以告诉它生成具有“公共”可访问性的设置,您可以强烈共享任何引用包含它们的程序集的-typed设置。

在一天结束时,我会使用DataBindingSettings.StudentCountPropertyName而不是常量更改您的代码。

易于管理,更易于使用和可读,因为“您使用其设置配置数据绑定”。

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