C#中复用out创建的变量并实现增量操作是否可行?
关于C#中
out参数的增量操作问题解答 首先,咱们先明确C#里out参数的核心规则:在方法内部,你必须先给out参数赋值,才能读取它的值。这意味着你不能直接写y = y + 1或者y++这种增量操作,除非你已经先给y赋过值——否则编译器会直接报错,因为它认为y是未定义的状态。
你遇到的具体问题分析
看你贴的Albahari示例代码,Foo方法里每次都先把y设为1,再加1变成2。所以不管你调用多少次Foo(out x),x都会被重置为1再增量,最后结果永远是2,这显然不符合你想要的“新变量设0,已有变量自增”的需求。
但这里有个关键限制:out参数的设计目的就是让方法强制覆盖传入变量的值,方法内部无法知道外部变量是否已经被初始化过——哪怕外部变量已经有值,out参数也要求你必须重新赋值,而且在赋值前不能读取它的旧值。所以直接用out参数实现“判断变量是否存在再增量”是做不到的。
解决方案:用重载区分初始化和增量操作
要实现你想要的效果,最清晰的方式是做两个方法重载:一个用out负责初始化新变量,一个用ref负责增量已有变量。这样既满足你用out声明新变量的需求,又能实现后续的增量操作:
using System; namespace ConsoleAppX { class D { // 用out初始化新变量:第一次调用时用这个版本 static void Foo(out int y) { y = 0; // 新变量直接设为0 } // 用ref增量已有变量:后续调用时用这个版本 static void Foo(ref int y) { y += 1; // 直接对已有变量执行增量操作 } static void Main(string[] args) { // 第一次调用:用out声明并初始化x为0 Foo(out int x); // 第二次调用:用ref增量x到1 Foo(ref x); // 第三次调用:用ref增量x到2 Foo(ref x); Console.WriteLine(x); // 输出结果:2 } } }
关于“访问并增量由out创建的非自行声明变量”
在C# 7及以上版本,你甚至可以用out var语法直接声明变量,不需要提前写int x:
Foo(out var x); // 直接创建并初始化x为0 Foo(ref x); // 增量到1
这完全符合你“不自行提前声明变量”的需求。
为什么不能只用out实现?
再强调一次:out参数强制方法内部必须先赋值才能读取,所以你没办法在方法内部先读取变量的旧值再增量——因为读取前必须赋值,而赋值会覆盖旧值。所以如果只用out,你永远只能给变量设置新值,而无法基于旧值做增量。
内容的提问来源于stack exchange,提问作者streamc
相关产品推荐
相关产品推荐

