Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# If语句的更好语法_C#_.net_If Statement - Fatal编程技术网

C# If语句的更好语法

C# If语句的更好语法,c#,.net,if-statement,C#,.net,If Statement,我有这样一个条件: if (string.IsNullOrEmpty(filename) || size != "Large" || size != "Medium" || size != "Small") 将来我可能需要在if语句中管理更多的size 我想知道是否存在一种更易于管理和可读的方式来编写此条件 请提供一个真实的例子,感谢您在这方面花费的时间。选项1: 编写一个小函数,返回bool,只包含大小测试,并在if中使用它 if (string.IsNullOrEmpty(filename

我有这样一个条件:

if (string.IsNullOrEmpty(filename) || size != "Large" || size != "Medium" || size != "Small")
将来我可能需要在
if
语句中管理更多的
size

我想知道是否存在一种更易于管理和可读的方式来编写此条件

请提供一个真实的例子,感谢您在这方面花费的时间。

选项1:

编写一个小函数,返回bool,只包含大小测试,并在
if
中使用它

if (string.IsNullOrEmpty(filename) || GoodSize(size))
{
 //...
}

private bool GoodSize(string size)
{
   return size != "Large" || size != "Medium" || size != "Small";
}
备选案文2:

创建要测试的尺寸列表,并使用
包含的

var goodSizes = new[] { "Large", "Medium", "Small" };
if (string.IsNullOrEmpty(filename) || !goodSizes.Contains(size))
{
    //...
}

您可以将这两个选项结合使用,以提高清晰度和封装性。

如果它们要更改,静态列表可能更好:

// you could externalize and manage this list somewhere else 
var sizes = new[] { "Large", "Medium", "Small" }; 

if (string.IsNullOrEmpty(filename) || !sizes.Contains(size))
{
    ...
}
private static List<string> Sizes = new List<string> { "large", "medium", "small" };

if (string.IsNullOrEmpty(filename) || Sizes.Contains(size.ToLower()))
{

}
私有静态列表大小=新列表{“大”、“中”、“小”};
if(string.IsNullOrEmpty(filename)| | size.Contains(size.ToLower()))
{
}
对于更干净的代码,将大小检查封装到自己的方法中,并在需要时修改该方法:

if (MeetsSizeRequirementsOrIsNull(filename, size))
{        
}

private static bool MeetsSizeRequirementsOrIsNull(string filename, string size)
{
    List<string> sizes = new List<string>() { "..." };

    return string.IsNullOrEmpty(filename) || sizes.Contains(size.ToLower())
}
if(MeetsSizeRequirementsOrIsNull(文件名,大小))
{        
}
私有静态bool MeetsSizeRequirementsOrIsNull(字符串文件名、字符串大小)
{
列表大小=新列表(){“…”};
返回字符串.IsNullOrEmpty(文件名)| | size.Contains(size.ToLower())
}

您可以保留一组单词并检查:

HashSet<string> filterWords = new HashSet<string>();
// Put all words in the hash set


if (filterWords.contains(size))
{
    // Do what ever you need
}
HashSet filterWords=newhashset();
//将所有单词放入哈希集中
if(filterWords.contains(大小))
{
//你需要什么就做什么
}

将大小放入某种类型的集合中,并使用“包含”。请参阅MSDN以获取示例:

如果测试结果中有多件事情要做,那么将其作为开关/案例写出可能更具可读性

   if (string.IsNullOrEmpty(filename) || 
    size != "Large" || 
    size != "Medium" || 
    size != "Small")

否则,如果您有大量的这些值,那么最好将列表保存在某些字典中——比如
nothandledize
。分配“大”=>true,“中”=>true。。。只需检查字典中是否存在
size

你所做的看起来是最直接的方法。任何修改都只会将混乱转移到其他地方。如果您不需要在其他任何地方重用此代码,我会保持原样。

下面的换行符使其更具可读性

   if (string.IsNullOrEmpty(filename) || 
    size != "Large" || 
    size != "Medium" || 
    size != "Small")
设计提示

如果许多对象涉及长If条件,那么最好编写在这些类中返回true/false的小属性/方法

if (string.IsNullOrEmpty(filename) || object.IsProperSize)

有时,枚举标志属性也有助于这种情况。请看一个好的解释。

任何IEnumerable都可以,不是吗?HashSet是一个例子,但是你也可以使用一个数组。但是哈希应该比其他人更快地进行字符串匹配。也可以考虑使用<代码> var hash集=新哈希集(String比较器。code>如果
larGE
larGE
larGE
等都应该是线程化的。为什么要使用数组而不是散列集?@abatishchev,为什么要使用散列集而不是数组:-)散列集确实会更好,因为它会更快地找到元素,而且它们保证是唯一的。@Darin当然,如果3项列表的性能改进对代码整体产生了很大影响,我很想看看他们是如何快速获得其他代码的:-)您可能想使用
Enumerable.Contains()
StringComparer.OrdinalIgnoreCase
@abatishchev语义,它们都实现了相同的效果,这只是一个示例。这还假设不需要大小写。无论如何,使用ToLower()/ToUpport()进行字符串比较是非常糟糕的做法。因此,我不建议将其作为例子,因为有人可以开始这样做。@abatishchev的不良做法是自以为是的-你强调的代码部分甚至没有受到OP的质疑。就我个人而言,我也会采取忽略案例的方式,但是我一时记不起语法。标志的语法和方法很有趣