You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何从其他类的void方法中获取参数变量?

如何在外部类获取MyClass中void方法内的随机number值?

嘿,这个问题挺接地气的!咱们先把场景明确下——假设你的MyClass里的myVoid方法大概是这样的:

public class MyClass {
    public void myVoid() {
        int number = new Random().nextInt(); // 方法内部的随机局部变量
        // 其他业务逻辑...
    }
}

你想在另一个类里拿到这个number的值,还不能给MyClass新增任何成员变量,对吧?那咱们分情况说:

常规合法手段:不行

如果只靠Java的基础语法和常规API,你没办法直接获取到这个number。因为它是方法内部的局部变量,作用域只限于myVoid方法执行的那段时间,方法执行完毕后,这个变量就会被JVM的垃圾回收机制处理掉,外部类没有任何直接访问它的途径——毕竟你还不能给MyClass加成员变量来暂存它。

非常规"黑科技"手段:可以,但极度不推荐

如果你硬要实现,也不是完全没招,但这些方法都属于剑走偏锋,生产环境绝对不建议用:

  • 反射读取栈帧:通过反射API获取当前线程的栈帧,再读取方法的局部变量表。但这种方式完全依赖JVM的具体实现,不同版本、不同厂商的JVM可能有差异,代码脆弱得一批,而且很容易出问题。
  • 字节码修改:用ASM、Javassist这类字节码操作库,在运行时修改myVoid的字节码,把number的值传递到外部类。这同样属于非常规操作,会大幅增加代码的复杂度和维护成本,还可能破坏原有方法的逻辑。

更合理的替代方案(推荐)

如果允许你修改myVoid方法的实现(只是不能给MyClass加成员变量),其实有两种非常靠谱的方式:

  1. 调整方法返回值:把void改成返回int,直接返回number。不过如果方法原本就有其他设计意图,这种方式可能不太合适。
  2. 使用回调函数:给myVoid方法加一个回调参数,在方法内部把number传给回调,外部类通过回调获取值:
    // 修改后的MyClass
    public class MyClass {
        public void myVoid(Consumer<Integer> numberCallback) {
            int number = new Random().nextInt();
            numberCallback.accept(number); // 把number传递给外部
            // 原来的业务逻辑...
        }
    }
    
    // 外部类调用
    public class AnotherClass {
        public static void main(String[] args) {
            MyClass myObj = new MyClass();
            myObj.myVoid(number -> {
                // 这里就能拿到随机生成的number了
                System.out.println("获取到的number:" + number);
            });
        }
    }
    
    这种方式既不用给MyClass加成员变量,又能合法、安全地拿到number的值,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Pow Mert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:57:45