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

为何C#向可执行文件传递参数时未提供argc参数?

C与C#命令行参数传递的底层逻辑差异

首先要明确核心逻辑:操作系统只负责提供原始的命令行输入数据,而参数的解析、封装成对应语言的函数参数形式,是由编程语言的运行时或启动代码完成的。

操作系统的统一输入

不管是C编译的原生可执行文件,还是C#的.NET可执行文件,操作系统都会向进程传递命令行相关的原始数据:

  • 在类Unix系统(Linux、macOS等)中,操作系统通过execve系统调用传递以NULL结尾的字符串数组(包含可执行文件路径和所有参数),以及环境变量数组。
  • 在Windows系统中,操作系统传递的是一个完整的命令行字符串(包含可执行文件路径和所有参数)。

C语言的处理方式

C语言的标准启动代码(由编译器自动链接到可执行文件中)会对操作系统提供的原始数据进行处理:

  • 类Unix系统下:直接遍历操作系统传递的字符串数组,计算出元素个数作为argc,再把数组本身作为argv[],一起传给main函数。
  • Windows系统下:启动代码会把完整的命令行字符串解析成字符串数组,计算元素个数得到argc,再传递给main。

你看到的int main(int argc, char *argv[])形式,是C标准规定的统一接口,argc本质是运行时推导出来的,而非操作系统直接传递的独立值。示例代码:

#include <stdio.h>
int main(int argc, char *argv[]) {
    printf("参数个数: %d\n", argc);
    for (int i = 0; i < argc; i++) {
        printf("参数[%d]: %s\n", i, argv[i]);
    }
    return 0;
}

C#的处理方式

.NET运行时(包括.NET Framework、.NET Core/.NET 5+)会负责处理操作系统传递的原始命令行数据:

  • 首先解析出所有参数(自动剔除可执行文件路径),然后封装成string[] args数组,传递给Main方法。
  • 因为C#的数组自带Length属性,完全可以替代argc的作用,所以语言设计时直接省略了单独的参数个数参数,避免冗余。

示例代码:

using System;
class Program {
    static void Main(string[] args) {
        Console.WriteLine($"参数个数: {args.Length}");
        for (int i = 0; i < args.Length; i++) {
            Console.WriteLine($"参数[{i}]: {args[i]}");
        }
    }
}

总结

两者的底层输入来源都是操作系统,但最终传递给main/Main函数的形式差异,是由各自的语言运行时/启动代码封装导致的:

  • C语言为了兼容早期标准和底层操作习惯,保留了argc + argv的形式。
  • C#则利用自身语言特性(数组自带长度),简化了参数形式,只传递参数数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:32:21