C#从函数返回跳转语句 作为所有的代码,我讨厌重复的代码块,但是作为C++的DEV,我真的希望空校验,因为它被烧毁了,这意味着有很多块看起来像 if(object == null) { //For loops continue; //To check function inputs/creation return; //maybe with a value }
我知道我可以尝试/抓住每件事,但我真的不喜欢那种编码风格 有没有办法用泛型函数替换空检查块。差不多C#从函数返回跳转语句 作为所有的代码,我讨厌重复的代码块,但是作为C++的DEV,我真的希望空校验,因为它被烧毁了,这意味着有很多块看起来像 if(object == null) { //For loops continue; //To check function inputs/creation return; //maybe with a value },c#,function,return,C#,Function,Return,我知道我可以尝试/抓住每件事,但我真的不喜欢那种编码风格 有没有办法用泛型函数替换空检查块。差不多 jumpstatement CheckNull<T>(T thingToCheck) { if(thingToCheck == null) { return continue; } return null; } jumpstatement CheckNull(T thingToCheck) { if(thingToCheck==null
jumpstatement CheckNull<T>(T thingToCheck)
{
if(thingToCheck == null)
{
return continue;
}
return null;
}
jumpstatement CheckNull(T thingToCheck)
{
if(thingToCheck==null)
{
继续返回;
}
返回null;
}
然后在实际代码中,而不是在旧的重复块中,我只需要函数(根据请求填充)
for(int i=0;i
我能看到的最接近的东西是谈论代码剪贴画或内联函数,但我真的不认为这是我想要的。我不认为你想在这里做什么是可能的。基本上,您希望能够调用影响调用它的函数中的控制流的函数(例如,您希望能够从您的函数中从调用函数返回)。这在正常功能下是不可能的 在C/C++中,使用类似宏的函数,以及在其他几种支持“真实”宏的语言中,这类事情是可能的。不幸的是,C#没有宏,因此这类事情无法按您想要的方式完成。C#8有一个新功能,名为“那更好”。您可以在这里或那里添加一些注释,然后编译器就可以为您处理许多注释。您只需编写您想要编写的代码,而不用担心引用可能会意外地为
null
。这需要一些时间来适应,但一旦你掌握了这个概念,它就相当酷了
除此之外,您不能返回任意跳转或转到。。。但是您可以返回一个。这类似于C/C++函数指针。从理论上讲,您可以使用此选项来转换此建议呼叫:
CheckNull(someObject);
为此:
CheckNull(someObject)();
其中,CheckNull()
的返回值是要调用的方法。但实际上,它可能看起来更像这样:
CheckNull(someObject, o => {
//Do something with someObject here, where you can be **sure** someObject is not null
});
您甚至可以在方法中嵌入一个线程,以使事情更加线程安全
public void CheckNull<T>(T target, Action<T> action)
{
if (target is object)
{ //naive implementation -- potential thread race between these two lines
// ... but it does narrow the race to JUST those two lines, regardless of how much work is hidden in the action.
lock(target)
{
action(target);
}
}
}
您可以在不为null的项上编写类似于此循环的代码:
foreach(var item in items.Where(i => i is object))
{
//item will not be null, as long as you're in a single thread. Otherwise, lock on something first.
}
这是不可能的。在某些情况下,可以使用。一般来说,我不使用那种风格(无论是90年代还是C++时,因为它在NoTTS中发布)。一般来说,如果
if
,我倾向于反转空检查并将代码主体包含在范围内。您还可能会发现空条件运算符(?。
和?[]
)和空合并运算符(?
和C#8?=
)可能会大大减少您对该模式的需求。您必须将代码置于CheckNull(someObject)周围
插入到您的示例中,以便我们知道在出现空值时,您希望执行流向何处continue
仅在while
、do
、for
或foreach
中相关,但您的CheckNull
示例周围没有相关代码。你能用它来演示你想要的控制流吗?我想你应该看看。这将帮助您优雅地处理来自具有不同值的循环的返回。。。他希望在空检查方法中有一个continue。如果(CheckNull(someObject))继续,他本可以做一个但是他没有。。。表示不想这样做。此外可空引用类型在这里不会帮助他,因为他希望某个对象是空的。是的,在C++中,我会写一个宏函数并完成;这正是我想要的。虽然当我写了一个关于这个影响的问题时,我得到了“使用snippits”并被标记为重复的…Nemerle语言,类似于C#,有宏。微软正在逐渐将功能从Nemerle转移到C#,但它还没有达到宏。也许在C#10我们最终会等他们@贾斯廷
object[] items = new object[100];
FillArray(items);
foreach(var item in items.Where(i => i is object))
{
//item will not be null, as long as you're in a single thread. Otherwise, lock on something first.
}