我的问题是理论性的,请不要建议代码编辑或替代方案。
我有一个方法如下:
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/