C# 在一个简单的测试代码中发生了什么

C# 在一个简单的测试代码中发生了什么,c#,C#,我有以下几行代码,并在Microsoft文档中查找了方法和对象定义,但我仍然不理解它是如何工作的 using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace HelloWorld.Tests { [TestClass] public class WhenProgramRuns { private string _consoleOutput; [Te

我有以下几行代码,并在Microsoft文档中查找了方法和对象定义,但我仍然不理解它是如何工作的

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace HelloWorld.Tests
{
    [TestClass]
    public class WhenProgramRuns
    {
        private string _consoleOutput;
        [TestInitialize]
        public void Initialize()
        {
            var w = new System.IO.StringWriter();
            Console.SetOut(w);
            Program.Main(new string[0]);
            _consoleOutput = w.GetStringBuilder().ToString().Trim();
        }
        [TestMethod]
        public void SayHelloWorld()
        {
            Assert.AreEqual("Hello, World", _consoleOutput);
        }
    }
}
我不明白“w”将如何捕获Main执行的结果,以及为什么代码作者在调用Main时传递字符串[0]

主要内容如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloWorld
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello, World");
        }
    }
}

Console.SetOut函数将标准输出从控制台重定向到“w”。

好吧,让我们把它分成几部分:

我不明白“w”将如何捕捉执行结果 主要的

从技术上讲,说它将捕获执行结果是不正确的。我们的
w
StringWriter
的一个实例。
StringWriter
实现将信息写入字符串的
TextWriter

控制台将使用此
w
实例写入输出数据

以及为什么代码作者在调用Main时传递字符串[0]

main方法接受
string[]
作为参数,因此为了调用它,我们必须传递一些东西,并且因为我们以后并不真正需要这个参数,所以传递一个空数组就可以了

执行逻辑可以描述为:

  • 创建
    StringWriter
  • 将console设置为使用此
    StringWriter
    输出数据
  • 使用所需参数
    string[]运行Main方法的唯一重载
  • 通过调用
    StringWriter
    上的
    GetStringBuilder()
    获取生成器,并通过调用
    ToString()

  • 你需要花一些时间研究控制台应用程序的入口点是如何工作的,
    out
    关键字是如何工作的`以及参数传递是如何工作的。投票结束时选择“太宽”,当然这是一个简短的程序,但是StackOverflow不是私人教练/教育服务。@DavidL这里没有使用
    out
    关键字。@Servy是的,你说得很对,谢谢。在编辑计时器过期后,事后才意识到这一点。我认为其他两点仍然有效。@DavidL确实有效。这是一个正确问题的正确答案。提问者可能不知道流、方法参数和有机西瓜之间的区别。这个问题在这里很难回答。