【问题标题】:Console.WriteLine not working?Console.WriteLine 不工作?
【发布时间】:2012-01-01 22:18:03
【问题描述】:

我创建了一个程序来计算不规则形状物体的表面积,例如湖。 我读入了一个文件,其中包含 x 和 y 值的值以及深度。

我是 C# 新手,所以我还没有完全理解所有内容,但我认为我的代码应该可以工作,但是,它似乎没有将区域的值写入屏幕。

我知道 Console.WriteLine(_surface); 应该可以工作,但我似乎无法让它做任何事情,而且它可能在错误的地方!

谁能告诉我哪里出错了?

我的代码如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using NUnit.Framework;


namespace ConsoleApplication1
{


    public class ValueXyz
    {
        public double X { get; set; }
        public double Y { get; set; }
        public int Z { get; set; }


    }


    public class SurfaceCalculator
    {

        private ValueXyz[] _valuesXyz;
        private double _surface;
        private readonly string _textWithValues;
       public SurfaceCalculator(string textWithValues)

        {
            _textWithValues = textWithValues;
            SetValuesToCalculate();
        }

        public double Surface
        {
            get { return _surface; }

        }


        public void CalculateSurface()
        {

            for (var i = 0; i < _valuesXyz.Length; i++)
            {
                if (_valuesXyz[i].Z == 0)
                    _surface = (_valuesXyz[i].X * _valuesXyz[i + 1].Y) - (_valuesXyz[i + 1].X * _valuesXyz[i].Y);

                Console.WriteLine(_surface);
            }


        }


        private void SetValuesToCalculate()
        {
            var valuesXyz = _textWithValues.Split(' ');


            _valuesXyz = valuesXyz.Select(item => new ValueXyz
            {
                X = Convert.ToDouble(item.Split(',')[0]),
                Y = Convert.ToDouble(item.Split(',')[1]),
                Z = Convert.ToInt32(item.Split(',')[2])


            }).ToArray();




        }



        public void TestSurfaceCalculatorGetsAValue()
        {

            var textWithValues = File.ReadAllLines(@"C:\Users\user\Documents\Visual Studio 2010\Projects\Lake_Take_Toooooo\Lake_Take_Toooooo\bin\Debug\Lake_Test.csv");
            var calculator = new SurfaceCalculator(_textWithValues);
            calculator.CalculateSurface();


            Assert.IsNotNull(calculator.Surface);

        }

        static void Main()
        {

            Console.ReadKey();
        }
    }
}

这是我第一次使用类,如果有明显的答案,请道歉。

感谢您的帮助!

【问题讨论】:

  • 在您的 Main 方法中,您永远不会调用任何其他方法。
  • 这个以及其他一百万个初学者错误可以通过调试来解决。非常重要和有用的技能。只需在 Visual Studio 中按 F10,您就可以在执行时单步执行每一行代码
  • 请注意,您的公式很奇怪(我什至会假装它是错误的)并且肯定会因数组越界异常而失败。
  • @Kieren,虽然我同意知道使用调试器是一项重要技能,但应该尽量少调试。甚至(或尤其是)初学者也应该被告知如何为此类任务进行单元测试。您在调试器中花费的每一分钟都是非生产时间。
  • ..如果他们的单元测试失败了?创建更细粒度的单元测试,直到每个测试都有一条 IL 指令?单元测试有时间和地点,但这不是。特别是对于初学者来说,单步调试、观察变量变化和调用堆栈对于了解事物如何组合在一起绝对是无价的。比单元测试 IMO 更重要。 [从实际意义上扩展它,迭代地修改单元测试、重建解决方案和读取单元测试输出是解决许多问题的糟糕方式。只需按 F10 看看发生了什么。]

标签: c# class methods


【解决方案1】:

你需要实际调用Main方法里面的方法,这是程序的入口点。喜欢:

    static void Main()
    {
        CalculateSurface();
        Console.ReadKey();
    }

当你运行你的程序时,只有Main 方法中的代码实际被执行。如果您不从那里调用任何内容,则不会执行任何代码。

【讨论】:

  • @K720:如果它解决了您的问题,请不要忘记接受答案。
  • 执行此操作时,我收到错误错误“当前上下文中不存在名称 'CalculateSurface'”。我该如何克服这个问题?
【解决方案2】:

主事件中没有调用函数... 我应该想象读取键将等待键输入然后关闭,对吗?

【讨论】:

    【解决方案3】:

    您是想将其作为控制台应用程序还是作为单元测试运行? (看起来您正在尝试将其作为单元测试运行,因为您使用的是 NUnit.Framework 并且有一个带有 Assert 的测试方法......)

    如果你想将它作为控制台应用程序运行,你必须调用应该在 Main 方法中执行的代码。

    如果你想将它作为单元测试运行,你必须为你的测试类和测试方法添加一些“属性”。类应该有[TestFixture]属性,方法应该有[Test]属性,比如:

    [TestFixture]
    public class SurfaceCalculator {
    
    ...
    
    [Test]
    public void TestSurfaceCalculatorGetsAValue() {
    ...
    }
    
    }
    

    【讨论】:

    • 不,我想将它作为控制台应用程序运行。我应该摆脱“Assert.IsNotNull(calculator.Surface);”和 NUnit.Framework,在那种情况下?
    • 不,其他问题和 cmets 所说的是准确的。您的Main 方法实际上是程序的核心,它只是读取密钥并完成。
    猜你喜欢
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    相关资源
    最近更新 更多