如何在不使用关键字的情况下使用枚举实例化对象时编写更干净的代码?

时间:2009-10-30 14:20:53

标签: c# enums namespaces

我最近创建了一个类,它有一个构造函数,它将3个枚举作为参数。这些枚举在对象本身中定义为下面示例中的ObjectEnum和AnotherObjectEnum。

LongObjectName pt = new LongObjectName(
            LongObjectName.ObjectEnum.EnumerationOne,
            LongObjectName.ObjectEnum.EnumerationTwo,
            LongObjectName.AnotherObjectEnum.EnumerationThree,
            0.0);

我必须初始化其中的8个对象,并且我想将其浓缩为更清晰的格式以供将来的编码器使用。我想构造这个代码,以便我可以简化这个对象的声明 - 就像VB.NET中的“with”。我必须实现IDisposable接口才能使用“using”命令。

理想情况下,我希望我的代码看起来像这样:

LongObjectName pt = new LongObjectName( 
                ObjectEnum.EnumerationOne,
                ObjectEnum.EnumerationTwo,
                AnotherObjectEnum.EnumerationThree,
                0.0);

有没有简单的方法来清理这样的代码? 在此先感谢 - 这是我的第一个问题,所以建设性的批评是值得赞赏的。

5 个答案:

答案 0 :(得分:10)

您对using关键字的两种用法感到困惑。

您可以使用using directive为任何类型创建别名;这与IDisposable无关。

例如:

using ObjectEnum = YourNamespace.LongObjectName.ObjectEnum;

(请注意,using指令中的所有类型都必须使用命名空间名称进行完全限定。


using statement与名称除外的using指令无关,用于处置IDisposable

例如:

using (TransactionScope.BeginTransaction())
using (dataSet)
using (new SqlCommand("SQL", connection) {
    //Do something useful
}

答案 1 :(得分:8)

有一种简单的方法:只是不要在类中声明你的枚举,而是在类的同一名称空间中声明。

顺便说一下,

using对你没有帮助,因为除了在代码中包裹try / finally并在其中调用Dispose()之外别无其他finally阻止。它与VB的With无关。

ETA:由于您选择接受此答案,即使是根据更好的答案:

可以使用using 指令为您的枚举创建别名:

using ObjectEnum = SomeNameSpace.LongObjectName.ObjectEnum;

请向SLaks投票,而不是我,因为s?他是第一个在这里提出这个想法的人。

答案 2 :(得分:4)

建设性批评

如果您真的需要建设性的批评,请在您的代码上运行FxCop,或者如果您有Visual Studio Team Suite则运行代码分析。

它会为违反最佳做法的代码生成大量警告。对于大型项目,警告可能令人生畏,但如果您一次接近一组,则可以将其减少到更合理的数量。 FxCop非常有用;它在我自己的代码中发现了一些错误,否则会被忽视。


在您的情况下,avoid public nested types。除非有令人信服的理由,否则你不应该把这些枚举放在课堂上。

答案 3 :(得分:2)

  1. 欢迎来到SO,CrimsonX。
  2. C#的“using”语句与VB的“With”不相似。 “using”语句在处置之前设置对象的范围,但它不初始化对象属性。
  3. 您可以考虑创建使用常用选项创建实例的静态工厂方法,例如“Schedule.NewScheduleSevenDaysAWeek()”和“Schedule.NewScheduleWeekdaysOnly()”。
  4. 在我看来,你只是想保存击键。如果是这样的话,Johanness关于将这些枚举移出课堂的建议将会有所帮助。但总的来说,我认为你会发现C#比VB更冗长。例如,C#'s object initializer旨在成为实例化对象和设置属性的更简洁方法,但它并不短。清洁!=更短。

答案 4 :(得分:1)

首先,你可以做到这一点:

var pt = new LongObjectName( 
                ObjectEnum.EnumerationOne,
                ObjectEnum.EnumerationTwo,
                AnotherObjectEnum.EnumerationThree,
                0.0);

其次,您可以考虑将枚举移出类定义,或者在调用者类文件中为枚举创建别名。

using ObjectEnum = LongObjectName.ObjectEnum ;