这是解析函数参数的有效方法吗?
Is this an efficient way to parse function parameters?
所以我是 C# 的新手,但我已经喜欢来自其他高级语言的一件事是能够在(接近)C 中进行按位运算。我有一堆函数,其中一些或所有参数是可选的,我喜欢开关,所以我构建了一个将布尔数组转换为无符号 Shorts 的函数,这使我基本上可以将布尔数组复用为开关的单个值:
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 fname,string lname)
{
bool[] tf = {fname!=null,lname!=null};
switch(argMux.ba2ushort(tf)){
case 3:
@ViewData["Data"]=$"Hello, {fname} {lname}";
break;
case 2:
@ViewData["Data"]=$"Hello, {fname}";
break;
case 1:
@ViewData["Data"]=$"Hello, Dr. {lname}";
break;
case 0:
@ViewData["Data"]="Hello, Dr. CheeseBurger";
break;
}
return View();
}
我的问题是,这是执行此操作的有效方法,还是有更好的方法?我的目标是使用简单,这无疑为我提供了,但我也希望它是运行时快速的高效代码。任何指针?这是一种愚蠢的方法吗?欢迎任何和所有反馈,如果你相信,你甚至可以说我是白痴,我不是太敏感。谢谢!
这一切都不好。
编写方法的正确方法是使用 none 这个:
public IActionResult Cheese(string firstName, string lastName)
{
@ViewData["Data"]=$"Hello, {firstName ?? "Dr."} {lastName ?? "Cheeseburger"}";
return View();
}
one thing I already like coming from other higher level languages is the ability to do bitwise operations in (close to) C.
如果您只是为了解决高级业务问题而绞尽脑汁,那么您可能做错了什么。用高阶业务代码解决高阶业务问题
此外,如果您在 C# 中使用无符号类型,则很可能您做错了什么。无符号类型用于与非托管代码的互操作性。在 C# 中,很少将 ushort、uint 或 ulong 用于其他任何东西。逻辑上无符号的数量,如数组的长度,始终表示为带符号的数量。
C# 有许多功能,旨在确保拥有 COM 库的人可以继续使用他们的库,这样需要指针运算的原始、未经检查的性能的人可以在相当安全的情况下这样做。不要将这些低级编程功能的存在误认为是 C# 通常用作低级编程语言的证据。编写您的代码,使其读起来清晰作为业务工作流的实现。
您的代码的任务是将名称呈现为字符串,因此它应该清楚地读作 将名称呈现为字符串。如果我让你在一张纸上写下一个名字,你做的第一件事不会是做一个位数组来帮助你,所以它也不应该在这里。
现在,可能在某些情况下这种事情是明智的,在这些情况下你应该使用枚举而不是将 short 作为位域:
[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 中进行按位运算。我有一堆函数,其中一些或所有参数是可选的,我喜欢开关,所以我构建了一个将布尔数组转换为无符号 Shorts 的函数,这使我基本上可以将布尔数组复用为开关的单个值:
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 fname,string lname)
{
bool[] tf = {fname!=null,lname!=null};
switch(argMux.ba2ushort(tf)){
case 3:
@ViewData["Data"]=$"Hello, {fname} {lname}";
break;
case 2:
@ViewData["Data"]=$"Hello, {fname}";
break;
case 1:
@ViewData["Data"]=$"Hello, Dr. {lname}";
break;
case 0:
@ViewData["Data"]="Hello, Dr. CheeseBurger";
break;
}
return View();
}
我的问题是,这是执行此操作的有效方法,还是有更好的方法?我的目标是使用简单,这无疑为我提供了,但我也希望它是运行时快速的高效代码。任何指针?这是一种愚蠢的方法吗?欢迎任何和所有反馈,如果你相信,你甚至可以说我是白痴,我不是太敏感。谢谢!
这一切都不好。
编写方法的正确方法是使用 none 这个:
public IActionResult Cheese(string firstName, string lastName)
{
@ViewData["Data"]=$"Hello, {firstName ?? "Dr."} {lastName ?? "Cheeseburger"}";
return View();
}
one thing I already like coming from other higher level languages is the ability to do bitwise operations in (close to) C.
如果您只是为了解决高级业务问题而绞尽脑汁,那么您可能做错了什么。用高阶业务代码解决高阶业务问题
此外,如果您在 C# 中使用无符号类型,则很可能您做错了什么。无符号类型用于与非托管代码的互操作性。在 C# 中,很少将 ushort、uint 或 ulong 用于其他任何东西。逻辑上无符号的数量,如数组的长度,始终表示为带符号的数量。
C# 有许多功能,旨在确保拥有 COM 库的人可以继续使用他们的库,这样需要指针运算的原始、未经检查的性能的人可以在相当安全的情况下这样做。不要将这些低级编程功能的存在误认为是 C# 通常用作低级编程语言的证据。编写您的代码,使其读起来清晰作为业务工作流的实现。
您的代码的任务是将名称呈现为字符串,因此它应该清楚地读作 将名称呈现为字符串。如果我让你在一张纸上写下一个名字,你做的第一件事不会是做一个位数组来帮助你,所以它也不应该在这里。
现在,可能在某些情况下这种事情是明智的,在这些情况下你应该使用枚举而不是将 short 作为位域:
[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: ...
但请注意,我们将所有内容都保留在业务域中。我们在做什么? 检查权限。那么代码是什么样的呢? 好像在检查权限。不要摆弄一堆位然后打开一个整数。