C# 这是解析函数参数的有效方法吗?

C# 这是解析函数参数的有效方法吗?,c#,bit-manipulation,multiplexing,C#,Bit Manipulation,Multiplexing,所以我对C#还不熟悉,但我已经喜欢其他高级语言的一件事是在(接近)C中执行位运算的能力。我有一系列函数,其中一些或所有参数都是可选的,我喜欢开关,因此,我构建了一个将布尔数组转换为无符号短数组的函数,该函数允许我基本上将布尔数组多路复用为开关的单个值: namespace firstAsp.Helpers{ public class argMux{ public static ushort ba2ushort (bool[]

所以我对C#还不熟悉,但我已经喜欢其他高级语言的一件事是在(接近)C中执行位运算的能力。我有一系列函数,其中一些或所有参数都是可选的,我喜欢开关,因此,我构建了一个将布尔数组转换为无符号短数组的函数,该函数允许我基本上将布尔数组多路复用为开关的单个值:

namespace firstAsp.Helpers{
    public class argMux{                       
        public static ushort ba2ushort (bool[] parms){  
            //initialize position and output                
            ushort result = 0;
            int i = parms.Length-1;
            foreach (bool b in parms){
                if (b)//put a one in byte at position of b
                    //bitwise or with position
                    result |= (ushort)(1<<i);
                i--;
            }
            return result;               
        }
    }
}
我的问题是,这是一种有效的方法,还是有一种更好的方法?我的目标是简单的使用,这对我来说是肯定的,但我也希望它是高效的代码,在运行时是快速的。有什么建议吗?这是一种愚蠢的方式吗?欢迎任何反馈,如果你相信的话,你甚至可以叫我白痴,我不太敏感。谢谢

这一切都很糟糕

编写方法的正确方法是不使用以下内容:

public IActionResult Cheese(string firstName, string lastName)
{
    @ViewData["Data"]=$"Hello, {firstName ?? "Dr."} {lastName ?? "Cheeseburger"}";
    return View();
}
我已经喜欢来自其他高级语言的一件事是能够在(接近)C中执行位运算

如果你在为解决一个高层次的业务问题而浪费时间,那么你很可能做错了什么。使用高级业务代码解决高级业务问题

此外,如果您在C#中使用无符号类型,则很可能您做错了什么。无符号类型用于与非托管代码的互操作性。在C#中,很少使用ushort、uint或ulong来表示其他内容。逻辑上无符号的量(如数组长度)始终表示为有符号量

C#具有许多功能,旨在确保拥有COM库的用户可以继续使用其库,因此需要指针算法原始、未经检查的性能的用户可以在合理安全的情况下这样做。不要把这些低级编程特性的存在误认为是C#通常被用作低级编程语言的证据。编写代码,使其作为业务工作流的实现清晰可读

代码的任务是将名称呈现为字符串,因此应该清楚地理解为将名称呈现为字符串。如果我让你在一张纸上写下一个名字,你会做的第一件事不是做一个数组来帮助你,所以它也不应该在这里

现在,在某些情况下,这类事情可能是合理的,在这些情况下,您应该使用枚举,而不是将短字段视为位字段:

[Flags]
enum Permissions 
{
  None = 0x00,
  Read = 0x01,
  Write = 0x02,
  ReadWrite = 0x03,
  Delete = 0x04,
  ReadDelete = 0x05,
  WriteDelete = 0x06,
  ReadWriteDelete = 0x07
}
...
static Permissions GetPermission(bool read, bool write, bool delete) {
  var p1 = read ? Permissions.Read : Permissions.None;
  var p2 = write ? Permissions.Write : Permissions.None;
  var p3 = delete ? Permissions.Delete : Permissions.None;
  return p1 | p2 | p3;
}
现在你有了一个方便的

switch(p)
{
  case Permissions.None: ...
  case Permissions.Read: ...
  case Permissions.Write: ...
  case Permissions.ReadWrite: ...

但是请注意,我们将所有内容都保存在业务领域中。我们在干什么检查权限。那么代码是什么样子的呢就像检查权限一样。不要旋转一堆位,然后打开一个整数。

这些都不是好的C#。我做C#才3天左右,所以我不希望有其他的事情。请向我学习你的方法。这正是我所需要的,我不知道有一个操作符可以实现我的确切目标(合并空值)@这个家伙:很好。另外,要摆脱
fname
ba2ushort
等习惯。如果您键入
firstName
PackBooleans
等等,您将不会英年早逝。使用完整的单词。方法应该是描述其行为的动词。在命名约定建议中注明。是 啊我使用unsigned的唯一原因是为了避免对符号位做额外的数学运算。但现在这些都不重要了。谢谢@这个家伙:你能描述一下你认为你可能有什么问题吗?在大多数情况下,C#会给你一个警告,你会用符号位犯错误。此外,我还添加了一些关于在C#中执行切换逻辑的正确方法的想法。我想我可以从更高的索引开始,比如
params.length
,而不是
params.length-1
,以避免符号位出现任何问题。但我实现它的方式是将其推到数组中的实际位置,这可能意味着在符号位中放入1,并且肯定会导致除以2。虽然我假设有符号int的第一位是符号,在其中加1会使值为负数,这也可能是错误的。
switch(p)
{
  case Permissions.None: ...
  case Permissions.Read: ...
  case Permissions.Write: ...
  case Permissions.ReadWrite: ...