当代码流是这样的:
if(check())
{
...
...
if(check())
{
...
...
if(check())
{
...
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
我一般都看到这个工作,以避免上面的凌乱的代码流:
do {
if(!check()) break;
...
...
if(!check()) break;
...
...
if(!check()) break;
...
...
} while(0);
Run Code Online (Sandbox Code Playgroud)
有哪些更好的方法可以避免这种解决方案/黑客攻击,从而使其成为更高级别(行业级别)的代码?
任何开箱即用的建议都是受欢迎的!
假设,我有这个界面,
interface IContact
{
IAddress address { get; set; }
}
interface IAddress
{
string city { get; set; }
}
class Person : IPerson
{
public IContact contact { get; set; }
}
class test
{
private test()
{
var person = new Person();
if (person.contact.address.city != null)
{
//this will never work if contact is itself null?
}
}
}
Run Code Online (Sandbox Code Playgroud)
Person.Contact.Address.City != null (这可以检查City是否为空.)
但是,如果Address或Contact或Person本身为null,则此检查将失败.
目前,我能想到的一个解决方案是:
if (Person != null && Person.Contact!=null && Person.Contact.Address!= null && Person.Contact.Address.City != …Run Code Online (Sandbox Code Playgroud) 我知道,||并&&在C#中被定义为短路运营商,这种行为是由语言规范保证,但做|=和&=短路呢?
例如:
private bool IsEven(int n)
{
return n % 2 == 0;
}
private void Main()
{
var numbers = new int[] { 2, 4, 6, 8, 9, 10, 14, 16, 17, 18, 20 };
bool allEven = true;
bool anyOdd = false;
for (int i = 0; i < numbers.Length; i++)
{
allEven &= IsEven(numbers[i]);
anyOdd |= !IsEven(numbers[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
当9条目被命中时,allEven变为false,这意味着所有后续条目都是无关紧要的 - allEven对于将来对该表达式的所有调用,该值保证为false.同样如此anyOdd,当它看到9时设置为true,并且对于该表达式的所有后续调用将保持为true.
那么,做&= …
我正在使用API调用,因此使用Python字典.
但是,对于相同的请求,我并不总是键入相同的键,我想知道何时可以在没有异常的情况下调用键...
让我说我有
test = {'a':{'b':{'c':{'d':'e'}}}}
Run Code Online (Sandbox Code Playgroud)
有时密钥d会存在,有时则不会.有时c甚至不存在.
我想以某种方式test['a']['b']['c']['d']在一行中检查是否存在.
到目前为止我尝试过的:
用test.get('a', {}).get('b', {}).get('c', {}).get('d', {}).工作正常,但它是一个烂摊子,有时我有5-6个嵌套的词典,名字很长......
使用try/except块很好,但通常如果test['a']['b']['c']['d']不存在,我会尝试调用test['a']['b']['e']['f']检查是否存在,因此我需要为每个if语句添加一个try/catch,就好像我没有错,如果异常是catch,则不再执行try块.
我可能试图寻找一种反身的方式来做这件事,调用一个函数,将我的"对象"的名称作为字符串,检查每个键是否存在,如果存在,则返回对象本身.
有什么想法吗 ?
它背后的用法是,省略无用的情况,并假设有时信息在测试['a'] ['b'] ['c'] ['d'],有时在测试['a'] [' b'] ['f']:
if test['a']['b']['c']['d'] **exists**:
do sthg with the value of test['a']['b']['c']['d']
elif test['a']['b']['f'] **exists**:
do sthg else with the value of test['a']['b']['f']
else:
do sthg different
Run Code Online (Sandbox Code Playgroud)
如果我把try/except放在那里,第一个异常不会停止执行并且不让我执行elif吗?
而且,我真的很喜欢打电话的方式而test['a']['b']['c']['d']不是给出一个按键列表.事实上,我希望它对我和那些阅读/使用我的代码的人们尽可能透明.
谢谢 !
该程序用于验证Excel行数据.如果if语句为false,我需要将消息附加到字符串,依此类推N个if语句.这不起作用,因为你可以看到第一个if语句是否失败,我不会继续查看其他if语句.后来,我需要处理100多列,所以我正在寻找一种方法来做到这一点.
有没有其他方法可以重写这个,所以它更具可读性和重复性?我知道我可以做一个巨大的if(.... && ....)来验证所有单元格和if if语句来附加消息,但我想知道是否还有另一种方法可以做到这一点.我想保留错误的顺序,但这并不重要.结果就像"facilityID is invalid, daysOfTheWeek is invalid"我还返回一个自定义Pair数据类型.
string facilityID, facilityDockDoorID, increment, hoursOfOperationId, updatedById, startTime, endTime, dockDoorServiceType, daysOfTheWeek;
facilityID = row[0];
facilityDockDoorID = row[1];
increment = row[2];
hoursOfOperationId = row[3];
updatedById = row[4];
startTime = row[5];
endTime = row[6];
dockDoorServiceType = row[7];
daysOfTheWeek = row[8];
string errorMessage = " is invalid";
if (IsInt(facilityID))
{
if (IsInt(facilityDockDoorID))
{
if (IsInt(increment))
{
if (IsInt(hoursOfOperationId))
{
if (IsInt(updatedById))
{
if (IsTime(startTime))
{
if (IsTime(endTime))
{
if (IsValidDockDoorServiceType(dockDoorServiceType))
{
if …Run Code Online (Sandbox Code Playgroud)