c#使用空检查重构开关语句
我只是在一些切换语句上遇到了一些麻烦,我觉得有更好的方法来实现最终目标 所以本质上,我将viewmodel传递到一个方法中。该方法首先从数据库检索与viewmodel相关的对象,然后switch语句对特定属性执行空检查。根据该结果,另一个switch语句对视图模型执行另一个null检查。在每个点上,将从数据库中为对象指定值,然后在最后进行数据库更新 这是密码c#使用空检查重构开关语句,c#,switch-statement,refactoring,C#,Switch Statement,Refactoring,我只是在一些切换语句上遇到了一些麻烦,我觉得有更好的方法来实现最终目标 所以本质上,我将viewmodel传递到一个方法中。该方法首先从数据库检索与viewmodel相关的对象,然后switch语句对特定属性执行空检查。根据该结果,另一个switch语句对视图模型执行另一个null检查。在每个点上,将从数据库中为对象指定值,然后在最后进行数据库更新 这是密码 public async Task UpdateContractWithRepository(ViewModel view
public async Task UpdateContractWithRepository(ViewModel viewModel)
{
// Get the contract from db
Contract contract = GetContract(viewModel.Id);
switch (viewModel.RepositoryId == null)
{
case true:
switch (contract.RepositoryId == null)
{
case true:
// nothing to do
// no change
break;
case false:
// Unassign Repository
UpdateRepositoryAssignment(contract.RepositoryId, false);
// Update properties
contract.RepositoryId = null;
contract.ConsumedUnits = null;
break;
}
break;
case false:
switch (contract.RepositoryId == null)
{
case true:
// assign repository
UpdateRepositoryAssignment(viewModel.RepositoryId, true);
// Get repository
Repository repository = GetRepository(viewModel.RepositoryId);
// Update properties
contract.RepositoryId = repository.Id;
contract.ConsumedUnits = repository.Units;
break;
case false:
// assign repository
UpdateRepositoryAssignment(viewModel.RepositoryId, true);
// Get repository
Repository repository = GetRepository(viewModel.RepositoryId);
// Update properties
contract.RepositoryId = repository.Id;
contract.ConsumedUnits = repository.Units;
break;
}
break;
}
UpdateContract(contract);
}
我想我可能会放弃switch语句,改用if语句,但根据我的判断,仍然会有一些嵌套。只是想知道有没有人有什么建议
我在这里看过重构switch语句,但它们似乎并没有真正涵盖空检查
感谢您的帮助 我不完全确定您卡在哪里-但是用
if
/else
替换开关几乎和用if
替换开关一样简单。以下是转换后的代码:
public async Task UpdateContractWithRepository(ViewModel viewModel)
{
// Get the contract from db
Contract contract = GetContract(viewModel.Id);
if (viewModel.RepositoryId == null)
{
if (contract.RepositoryId == null)
{
// nothing to do
// no change
} else {
// Unassign Repository
UpdateRepositoryAssignment(contract.RepositoryId, false);
// Update properties
contract.RepositoryId = null;
contract.ConsumedUnits = null;
}
} else {
if (contract.RepositoryId == null)
{
// assign repository
UpdateRepositoryAssignment(viewModel.RepositoryId, true);
// Get repository
Repository repository = GetRepository(viewModel.RepositoryId);
// Update properties
contract.RepositoryId = repository.Id;
contract.ConsumedUnits = repository.Units;
} else {
// assign repository
UpdateRepositoryAssignment(viewModel.RepositoryId, true);
// Get repository
Repository repository = GetRepository(viewModel.RepositoryId);
// Update properties
contract.RepositoryId = repository.Id;
contract.ConsumedUnits = repository.Units;
}
}
UpdateContract(contract);
}
我认为没有必要这么复杂。
试试这个,我想它也能起到同样的作用:
public async Task UpdateContractWithRepository(ViewModel viewModel){
Contract contract = GetContract(viewModel.Id);
if (viewModel.RepositoryId == null)
{
if(contract.RepositoryId != null){
UpdateRepositoryAssignment(contract.RepositoryId, false);
contract.RepositoryId = null;
contract.ConsumedUnits = null;
}
}
else
{
if (contract.RepositoryId == null)
{
UpdateRepositoryAssignment(viewModel.RepositoryId, true);
Repository repository = GetRepository(viewModel.RepositoryId);
contract.RepositoryId = repository.Id;
contract.ConsumedUnits = repository.Units;
}
else
{
UpdateRepositoryAssignment(viewModel.RepositoryId, true);
Repository repository = GetRepository(viewModel.RepositoryId);
contract.RepositoryId = repository.Id;
contract.ConsumedUnits = repository.Units;
}
}
UpdateContract(contract);
}
我真的会在bool条件下使用if….else if
。您可以使用有意义的变量名使其更具可读性:
public async Task UpdateContractWithRepository(ViewModel viewModel)
{
// Get the contract from db
Contract contract = GetContract(viewModel.Id);
bool modelRepositoryKnown = viewModel.RepositoryId != null;
bool contractRepositoryKnown = contract.RepositoryId != null;
if (modelRepositoryKnown)
{
if (contractRepositoryKnown)
{
// assign repository
UpdateRepositoryAssignment(viewModel.RepositoryId, true);
// Get repository
Repository repository = GetRepository(viewModel.RepositoryId);
// Update properties
contract.RepositoryId = repository.Id;
contract.ConsumedUnits = repository.Units;
}
else
{
// assign repository
UpdateRepositoryAssignment(viewModel.RepositoryId, true);
// Get repository
Repository repository = GetRepository(viewModel.RepositoryId);
// Update properties
contract.RepositoryId = repository.Id;
contract.ConsumedUnits = repository.Units;
}
}
else if(contractRepositoryKnown) // Model-Repository unknown but Contract-Repository Known
{
// Unassign Repository
UpdateRepositoryAssignment(contract.RepositoryId, false);
// Update properties
contract.RepositoryId = null;
contract.ConsumedUnits = null;
break;
}
UpdateContract(contract);
}
如果您只需去掉两个布尔,整个代码就可以简化:
bool IsVMRepoNull = viewModel.RepositoryId == null;
bool IsContractRepoNull = contract.RepositoryId == null;
if(IsVMRepoNull && !IsContractRepoNull )
{
UpdateRepositoryAssignment(contract.RepositoryId, false);
// Update properties
contract.RepositoryId = null;
contract.ConsumedUnits = null;
}
else if(!IsVMRepoNull)
{
UpdateRepositoryAssignment(viewModel.RepositoryId, true);
// Get repository
Repository repository = GetRepository(viewModel.RepositoryId);
// Update properties
contract.RepositoryId = repository.Id;
contract.ConsumedUnits = repository.Units;
}
可以通过将嵌套的开关条件组合到使用多个条件的if-else语句中来实现
if(viewModel.RepositoryId == null && !contract.RepositoryId)
{
// Unassign Repository
UpdateRepositoryAssignment(contract.RepositoryId, false);
// Update properties
contract.RepositoryId = null;
contract.ConsumedUnits = null;
}
else if(!viewModel.RepositryId && contract.RepositoryId == null)
{
// assign repository
UpdateRepositoryAssignment(viewModel.RepositoryId, true);
// Get repository
Repository repository = GetRepository(viewModel.RepositoryId);
// Update properties
contract.RepositoryId = repository.Id;
contract.ConsumedUnits = repository.Units;
}
else if(!viewModel.RepositryId && !contract.RepositoryId == null)
{
// assign repository
UpdateRepositoryAssignment(viewModel.RepositoryId, true);
// Get repository
Repository repository = GetRepository(viewModel.RepositoryId);
// Update properties
contract.RepositoryId = repository.Id;
contract.ConsumedUnits = repository.Units;
}
为什么对简单的if/then/else构造使用switch语句?切换到if语句不是更好吗?另外,如果你在一个开关中做了很多工作,那么最好使用自己的(私有)方法。。。true和false都执行相同的代码…@WilkovanderVeen c#开关的执行速度不是比if/else快吗?