繁体   English   中英

C#类的初始化和运行脚本的构造方法

[英]C# Constructor of class initialising and running script

使用脚本有一些奇怪的行为,我的FileHandler类的构造函数似乎正在调用该类并运行该脚本。 该类本身仅在VS15中被引用一次,即由其构造函数引用,main方法甚至还没有FileHandler对象,该对象在代码中其他任何地方都没有提及。

当然该代码不应该运行吗?

在此处输入图片说明

编辑:我在Program.cs的开头放置了一个断点,并开始逐步执​​行,但是当我这样做时,我注意到public class FileHandler变成了class Program而我的构造函数被Main方法“替换”了。

这是C#设计的吗?

在此处输入图片说明

Programs.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using QuantConnect;
using QuantConnect.Securities;
using QuantConnect.Securities.Forex;

namespace TradingDaysFileChecker
{
    class Program
    {
        static void Main(string[] args)
        {
            var securityType = SecurityType.Forex;
            var ticker = TickType.Trade;
            var marketHoursDatabase = MarketHoursDatabase.FromDataFolder();
            var market = Market.FXCM;
            var symbol = Symbol.Create(ticker.ToString(), securityType, market);
            var marketHoursDbEntry = marketHoursDatabase.GetEntry(symbol.ID.Market, symbol.Value, symbol.ID.SecurityType);
            var exchange = new ForexExchange(marketHoursDbEntry.ExchangeHours);


            Console.ReadLine();
        }


    }
}

FileHandler.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using QuantConnect.Securities.Forex;

namespace TradingDaysFileChecker
{
    public class FileHandler
    {

        private readonly StreamWriter _writeToFile;
        private readonly List<Tuple<string, string>> _missingDays;
        private readonly string _dataFilePath;
        private readonly DateTime _startDate;
        private readonly DateTime _endDate;
        private readonly ForexExchange _exchange;
        private readonly IEnumerable<DateTime> _validTradingDays;
        private readonly string[] _forexSecuritiesFolders;

        public FileHandler(ForexExchange exchange)
        {
            _startDate = new DateTime(2007, 04, 01);
            _endDate = new DateTime(2016, 07, 25);
            _exchange = exchange;

            _writeToFile = new StreamWriter(@"C:\Users\RichardsPC\Documents");
            _dataFilePath = @"C:\Users\RichardsPC\Desktop\export\exporter\forex\fxcm\minute\";
            _forexSecuritiesFolders = Directory.GetDirectories(_dataFilePath);

            _missingDays = new List<Tuple<string, string>>();
            _validTradingDays = IterateOverDateRange(_exchange, _startDate, _endDate);
        }

        public void CheckForMissingFiles()
        {
            foreach (var validDay in _validTradingDays)
            {
                foreach (var forexSecurity in _forexSecuritiesFolders)
                {
                    var fxPair = new DirectoryInfo(forexSecurity).Name;
                    var formattedDate = FormatDate(validDay);
                    var path = SetPath(_dataFilePath, fxPair, formattedDate);

                    if (!File.Exists(path))
                    {
                        _missingDays.Add(Tuple.Create(fxPair, formattedDate));
                    }
                }
            }

            Results();
        }

        public void Results()
        {
            if (_missingDays.Count > 0)
            {
                foreach (var missingDay in _missingDays.OrderBy(md => md.Item1))
                {
                    var formattedTupleOutput = missingDay.ToString().TrimStart('(').TrimEnd(')');
                    Console.WriteLine(formattedTupleOutput);
                    WriteResultsToFile(formattedTupleOutput);
                }
            }

            else
            {
                var noFilesMissing = "No results missing";
                Console.WriteLine(noFilesMissing);
                WriteResultsToFile(noFilesMissing);
            }

            Console.WriteLine("Records missing: " + _missingDays.Count);
        }

        public void WriteResultsToFile(string result)
        {
            _writeToFile.WriteLine(result);
        }

        public static string FormattedFileName(string tradingDay)
        {
            return tradingDay + "_quote.zip";
        }

        public string FormatDate(DateTime validDay)
        {
            return validDay.ToString("yyyyMMdd");
        }

        public static string SetPath(string dataFilePath, string fxPair, string formattedDate)
        {
            return dataFilePath + fxPair + @"\" + FormattedFileName(formattedDate);
        }

        public IEnumerable<DateTime> IterateOverDateRange(ForexExchange exchange, DateTime start, DateTime end)
        {
            for (var day = start.Date; day.Date <= end.Date; day = day.AddDays(1))
                if (exchange.IsOpenDuringBar(day.Date, day.Date.AddDays(1), false))
                {
                    yield return day;
                }
        }
    }
}

我知道发生了什么事。 我的系统出于某些原因备份了我的系统的Documents文件夹中的旧版本的TradingDaysFileChecker.cs 在那个版本中,所有文件处理逻辑都在Program.cs内部。 我重构并将文件处理提取到新类中。

由于某种原因,当我运行脚本时,即使它不在解决方案文件夹中,它仍在使用旧副本。 这就是为什么更改类名并似乎发生的原因,它跳到另一个文件的Program.csMain方法中,并将其从我的Documents文件夹中拉出。 这是怎么发生的,我不知道。

我从“文档”文件夹中删除了该文件,现在它的行为正常。

暂无
暂无

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

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