C# 在C中创建具有多个选项的类驱动程序命令的最干净和/或最好的方法是什么#

C# 在C中创建具有多个选项的类驱动程序命令的最干净和/或最好的方法是什么#,c#,C#,我有一个硬件数据位时钟,我想在C#中设置为不同的模式,但我想知道实现这一点的最佳方法。这是我当前的实现,但使用字符串和字符串比较似乎容易出错。有更好的方法吗 int SetDAI_BCLK(int32 Hz, string mode) { // int32 Hz Specifies the BCLK rate in Hz // string mode: "master" => master mode, "slave" => slave mode, "off" =&

我有一个硬件数据位时钟,我想在C#中设置为不同的模式,但我想知道实现这一点的最佳方法。这是我当前的实现,但使用字符串和字符串比较似乎容易出错。有更好的方法吗

int SetDAI_BCLK(int32 Hz, string mode)
{
     // int32 Hz Specifies the BCLK rate in Hz
     // string mode: "master" => master mode, "slave" => slave mode, "off" => clock off, "poll1" => special polling mode

     // Implementation here, use str compares to set the clock mode

     // return 1 if success, -1 if comm error, -2 if invalid clock settings, -3 if invalid string master
}
编辑:如果所有函数都在同一个项目中,那么效果很好,但是如果我想在另一个项目中使用函数,使用枚举而不是字符串,该怎么办呢。如果不在这两个项目中对枚举进行硬编码,我就想不出如何做到这一点


项目A包含枚举定义,并引用包含设备功能的项目B。项目B不知道这些枚举,当我尝试引用项目A时,我得到一个循环引用错误,不允许引用它。是否只引用一个文件?在这两个项目中使用相同枚举的最佳方法是什么。使用VS 2013 Express。

我建议使用枚举,而不是字符串值和返回值。它们提供了关于允许哪些值或给定返回值指示什么的明确含义。例如:

enum DAIMode {
    Off,
    Master,
    Slave,
    Poll1
}

我认为最不容易出错的实现是
enum
,如下所示:

enum Mode
{
    Master = 1,
    Slave = 2,
    Off= 3,
    Poll1 = 4
}
enum Error
{
    Success = 1,
    CommError = -1,
    InvalidClockSettings = -2,
    InvalidStringMaster = -3
}
那么你的方法签名看起来像这样

Error SetDAI_BCLK(Int32 Hz, Mode mode)
{
     //Do Work
}
但当然,更有意义的枚举名称可能是有序的,您可以通过使用
字节
(如果可以将数字全部更改为正数)或
,来降低它们的大小要求,如下所示:

enum Mode: short 
{
    ...
}
额外:


因为你的模式有一个字符串,为了彻底起见,如果你需要使用字符串值,那么最快的比较就是检查第一个字符,因为你有4个不同的起始字符,但是,如果你需要整个单词,我所知道的最好的选择是以小写顺序比较区域性不变的字符串,如:
string.CompareOrdinal(“poll1”,mode)
预期结果为
0

考虑使用枚举?最佳->主要基于意见…
我想知道实现这一点的最佳方法。
有更好的方法吗?
没有,你是最好的:;;;;;;;)严重基于意见的。。。在这里,另一个:你所展示的与公共的.NET友好API无关,它与C代码的实现/交互的内部细节完全一致,但是如果你正在寻找好的可用和安全的API——考虑你希望它如何被使用,并提供一个被命名的类/方法/属性,而不是单一的方法。+ 1,那是我要走的路线。一种可能的替代方法(但对于这样一个低级函数来说,它的级别可能太高):根据与返回“幻值”相关的条件的确切含义,抛出异常而不是返回值可能是发出错误条件信号的适当方法。我不关心运行速度,但是谢谢你的补充细节。第一个例子正是我所需要的,也是我所想象的。非常感谢。就命名而言,处理枚举命名的最佳方法是什么。这是我目前所拥有的,我觉得有点笨重。enum Edut{a,b}----Edut dut=Edut.a;我通常建议使用一个指示性的词,如
类型
模式
,例如:
DAI_BCLKMode{Master,Slave,etc…}
,但实际上这是你想要的,只要把它说清楚并保持一致。好的,谢谢你的提示