c# - 可以避免分配 out 值吗?

标签 c# roslyn

我的问题是理论性的,请不要建议代码编辑或替代方案。

我有一个方法如下:

private bool SomeMethod(int D, out SomeStruct SXY) {

    if (D<0) {
         return false;
    }

    SXY = new SomeStruct(D);
    return true;
}

我以下列方式使用此方法:

if (true) {
    SomeStruct SXY; // Local scope, not used anywhere else.
    if (SomeMethod(12, out SXY)) {
        // Use SXY only when it has a meaningful value
    }
}

编译器提示在 SomeMethod 返回之前未分配 SXY 输出值。

我们能否在 SomeMethod 中避免无用的赋值和结构创建,当 SomeMethod 很明显时——我假设,即使对于编译器——SXY 仅在有意义时才使用? 代码分析能否深入到允许在上述情况下进行编译?

编辑:

Freggar 要求的,我在生产中使用的实际代码是这样的:

private SomeStruct? SomeMethod(int D) {

    if (D < 0) {
        return null;
    }

    return new SomeStruct(D);
}

称为:

if (true) {
    SomeStruct? SXY = SomeMethod(12);
    if (SXY != null) {
        // Use SXY only when it is not null
    }
}

同样,这只是一个简化的代码来演示它的要点。 SomeMethod 比较复杂,可能多处返回null,调用也不一样。我的目的是了解为什么 Roslyn 无法判断 SomeMethod 是否可以在没有分配 SXY 的情况下安全返回。

最佳答案

从编译器的角度来看,out 参数和您的return 值之间没有关联。所以它不能也不会做任何编译器魔术。

干净的方法是将您的函数拆分为前提条件和对象创建部分:

private bool CanCreateSomeStruct(int D) {
    return D >= 0;
}

private SomeStruct CreateSomeStruct(int D) {
    return new SomeStruct(D);
}

然后像这样使用它:

if (CanCreateSomeStruct(D)) {
     SomeStruct SXY = CreateSomeStruct(D);
}

关于c# - 可以避免分配 out 值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50961051/

相关文章:

c# - 当我的应用程序失败时如何通知 Windows 任务计划程序?

c# - 如何在 GridView 中打开 pdf

.net - .NET CoreCLR、CoreRT、Roslyn 和 LLILC 之间有什么区别

c# - 使用roslyn编译Xaml得到*.g.cs文件

c# - 在 CSharpScript 的脚本类中访问全局变量

C# 枚举反向索引

c# - IEnumerable<T>、Task<T> 和 IDisposable 是否在 C# 编译器中进行了硬编码?

c# - 如何在 GroupPrincipal 上设置 ManagedBy 属性

c# - 在 Roslyn 中使用 System.Dynamic

c# - 一次对 SyntaxTree 进行多项修改