【问题标题】:C# Console Application crashes when start debugging, but not without debugger [duplicate]C#控制台应用程序在开始调试时崩溃,但不是没有调试器[重复]
【发布时间】:2017-05-27 22:00:35
【问题描述】:

当我运行此代码时,我的应用程序由于某种原因崩溃了,它只是关闭并退出 VS。对我来说,一切似乎都是正确的,但我对 C# 和 VS 很陌生。在不调试 (CTRL + F5) 的情况下启动时它可以正常工作。代码中的所有内容对我来说似乎都是正确的,而且代码中也没有任何警告。

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

namespace phoneSpace{

    class PhoneNumber{

        private string Number; 

        public string number{
             get; set; 
        }

        public PhoneNumber(string number){
             Number = number;
        }

        public void printNumber(){
            Console.WriteLine("{0}", Number);
        }

        static void Main(string[] args)
        {
            PhoneNumber phoneOne = new PhoneNumber("0703502341");
            phoneOne.printNumber();
        }
    }
}

【问题讨论】:

  • 您确定它会崩溃吗?有什么例外?尝试在 Main() 方法的底部添加 Console.ReadLine()
  • 您确定它已关闭吗?也许它执行得太快,您看不到结果。 VS 将在程序完成时关闭控制台窗口;这个是正常的。见this question
  • 代码不是问题,它工作正常。
  • 请注意,骗子似乎是关于 C/C++ 但答案是一样的。
  • 您的程序没有崩溃。这是 @TheLethalCoder 的重复链接中指出的 Visual Studio 的结果。默认情况下,当程序完成运行时,它会关闭。如果您转到程序的 /bin 文件夹并双击它将打开的 .exe,打印您的 Console.WriteLine 消息,然后关闭。这个是正常的。 Visual Studio 特别 启动它,以便它通过“按任意键继续”保持打开状态。您可以在您的应用中构建类似的行为,如下所示:Console.WriteLine("{0}", Number); Console.WriteLine("Press any key to continue.."); Console.ReadLine();.

标签: c# visual-studio


【解决方案1】:

你确定它是在执行后崩溃而不是自动关闭吗?

代码对我来说似乎是正确的,只需在 main 函数的最后一行之后添加以下行。

Console.ReadKey();

【讨论】:

  • 就是,自动关闭,谢谢
  • 太棒了.. 如果您能接受我的回答,不胜感激。谢谢
【解决方案2】:

每当您在调试模式下运行应用程序时,并且每当应用程序在该模式下完成执行时,它都会自动关闭,在非调试模式下不会发生(在不调试的情况下运行)。

我建议你应该在Main方法的最后一行添加Console.Read();,它会等待用户按下按键然后关闭。

【讨论】:

    【解决方案3】:

    在我看来,代码很好,应用程序刚刚关闭,因为没有什么可以等待。如果您查看this question(引用以供参考):

    如果您在没有调试的情况下运行 (Ctrl+F5),则默认情况下会提示您按回车键关闭窗口。如果你想使用调试器,你应该在最后一行下一个断点。

    所以在没有调试器的情况下运行时,Visual Studio 会自动阻止应用程序关闭。

    要在使用调试器运行时解决此问题,您有多种选择,例如设置断点或提示用户输入:

    Console.ReadKey(); //Any key press will close the application
    //Or
    Console.ReadLine(); //On ending a line the application will close: usually with enter
    //etc
    

    另请注意,由于变量的名称与@PaulF 提到的相同,因此以下代码可能会产生警告:

    private string Number; 
    
    public string number 
    {
        get; set; 
    }
    
    public PhoneNumber(string number)
    {
        Number = number;
    }
    

    我会更改代码以匹配命名约定,并使其属性实际使用其支持字段:

    private string _number; 
    
    public string Number { get { return _number; } set { _number = value; } }
    
    public PhoneNumber(string number)
    {
        _number = number;
    }
    

    更好的是,由于该属性没有做任何特别的事情,我会删除该字段:

    public string Number { get; set; }
    
    public PhoneNumber(string number)
    {
        Number = number;
    }
    

    【讨论】:

    • 到目前为止,代码量很少,看起来删除私有字符串并将数字属性大写将是一个很好的解决方案。
    • @PaulF 更新以反映这一点并添加额外信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 2021-10-05
    • 2016-12-12
    • 1970-01-01
    相关资源
    最近更新 更多