简体   繁体   English

C#构造函数未调用

[英]c# Constructor not called

My code just prints: 我的代码只是打印:

welcome to battleship

but the ship coordinates or ship created and even the end "Press any key to exit" is not printed. 但不会打印出船舶坐标或创建的船舶,甚至不会打印出“按任意键退出”的结尾。

My suspicion goes to the Constructor, looks like its not called but why my program is counting and not crashing? 我怀疑构造函数,好像没有调用它,但是为什么我的程序在计数并且没有崩溃?

Im running the code on a Mac with Xamarin Studio. 我在使用Xamarin Studio的Mac上运行代码。

Code: 码:

using System;
using System.Collections.Generic;

namespace battleship
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("welcome to battleship");

            EnumShipClassification.ShipClassification cruiser = EnumShipClassification.ShipClassification.theCruiser;
            Coordinate startCoordinate = new Coordinate(5, 5);
            EnumDirection.Direction direction = EnumDirection.Direction.west;

            Ship ship = new Ship(cruiser, startCoordinate, direction);
            Console.WriteLine("ship created"); // @debug
            Console.WriteLine("all coords: " + ship.coordinates);

            //@end
            Console.WriteLine("Press any key to exit.");
            Console.ReadLine();
        }
    }

    public class Ship
    {
        public int size; // values from wikipedia
        public int amount; // values from wikipedia
        public List<Coordinate> coordinates = new List<Coordinate>();

        public EnumShipClassification.ShipClassification classification;
        public Ship(EnumShipClassification.ShipClassification classification, Coordinate startCoordinate, EnumDirection.Direction toDirection)
        {
            Console.WriteLine("Ship Constructor called "); // @debug
            this.classification = classification;
            Console.WriteLine("classification added"); // @debug

            switch (classification)
            {
                case EnumShipClassification.ShipClassification.theBattleship: size = 5; amount = 1; break;
                case EnumShipClassification.ShipClassification.theCruiser: size = 4; amount = 2; break;
                case EnumShipClassification.ShipClassification.theDestroyer: size = 3; amount = 3; break;
                case EnumShipClassification.ShipClassification.theSubmarine: size = 2; amount = 4; break;
                default: break;
            }

            Console.WriteLine("switch ended with size {0} and amout {1}", size, amount);

            for (int i = 0; i < size; i++)
            {
                coordinates.Add(startCoordinate.advancedBy(i, toDirection));
                Console.WriteLine("i is: " + i); // @debug
            }
        }
    }

public class EnumDirection
{
    public enum Direction
    {
        north, south, east, west // + all (Direction[] array with content [.n, .s, .e, .w]
    }

    public Direction[] all = { Direction.north, Direction.south, Direction.east, Direction.west };
}

    public class EnumShipClassification
    {
        public enum ShipClassification // numbers: BoatSize
        {
            theBattleship = 5, theCruiser = 4, theDestroyer = 3, theSubmarine = 2
        }
    }


public class Coordinate
    {
        public int row;
        public int column;

        private int fieldSize = 10;

        public void init()
        {
            row = 0;
            column = 0;
        }

        public Coordinate invalid = new Coordinate(-1, -1);

        public Coordinate(int row, int column)
        {
            this.row = row;
            this.column = column;
        }

        public Coordinate getRandomCoordinate(int betweenX, int Y)
        {
            Random r = new Random(fieldSize);
            return new Coordinate(r.Next(), r.Next());
        }

        public Coordinate neighbor(EnumDirection.Direction inDirection)
        {
            return advancedBy(1, inDirection: inDirection);
        }

        public Coordinate advancedBy(int displacement, EnumDirection.Direction inDirection)
        {
            switch (inDirection)
            {
                case EnumDirection.Direction.north: return new Coordinate(column: column, row: row + displacement);
                case EnumDirection.Direction.south: return new Coordinate(column: column, row: row - displacement);
                case EnumDirection.Direction.east: return new Coordinate(column: column + displacement, row: row);
                case EnumDirection.Direction.west: return new Coordinate(column: column - displacement, row: row);

                default: break; // never happens
            }
            return null; // never happens
        }

        public string description
        {
            get
            {
                return "column: " + column + ", row: " + row;
            }
        }

        public override bool Equals(object obj)
        {
            if (ReferenceEquals(null, obj)) return false;
            if (ReferenceEquals(this, obj)) return true;

            try
            {
                Coordinate _obj = (Coordinate)obj;
                return _obj.row == this.row && _obj.column == this.column;
            }
            catch
            {
                return false;
            }
        }

        public override int GetHashCode()
        {
            return 1; // TODO: return a real value
        }

        public static bool operator ==(Coordinate lhs, Coordinate rhs)
        {
            return lhs.row == rhs.row && lhs.column == rhs.column;
        }

        public static bool operator !=(Coordinate lhs, Coordinate rhs)
        {
            return lhs.row != rhs.row && lhs.column != rhs.column;
        }
    }

Change 更改

public Coordinate invalid = new Coordinate(-1, -1);

To

public static Coordinate invalid = new Coordinate(-1, -1);

public Coordinate invalid = new Coordinate(-1, -1); causes stack overflow. 导致堆栈溢出。 that's because new Coordinate initialized inside Coordinate class so every time new coordinate must be created. 那是因为新坐标在坐标类中初始化,所以每次必须创建新坐标时。 Make the field static so that is created once and can be used for all instances. 将字段设置为静态,以便创建一次即可用于所有实例。

You can also add readyonly keyword if the reference is not supposed to change. 如果不应该更改引用,也可以添加readyonly关键字。

public readonly static Coordinate invalid = new Coordinate(-1, -1);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM