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))继续,他本可以做一个
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.
}