Минимальный, добропорядочный гражданин, [закрытый] шаблон консольного приложения C#

Если Вы хотите оптимизировать свой код, но все еще ясны, попробуйте это:

y = x * (1.0 / 2.0);

компилятор должен быть в состоянии сделать деление во время компиляции, таким образом, Вы получаете умножение во времени выполнения. Я ожидал бы, что точность совпадет с в y = x / 2.0 случай.

то, Где это может иметь БОЛЬШОЕ ЗНАЧЕНИЕ, находится во встроенных процессорах, где эмуляция с плавающей точкой требуется, чтобы вычислять арифметику с плавающей точкой.

23
задан 5 revs 11 January 2012 в 07:10
поделиться

4 ответа

Думаю, все зависит от реальных требований к этому приложению. Если нет необходимости выполнять специальную обработку ошибок - не делайте этого. Если никакой программе не требуется проверять код выхода вашего приложения - не нужно его возвращать; и я считаю, что есть случаи, когда эти требования не применяются.

Другими словами, минимальный - минимальный; сделайте самое простое, что может сработать. И если ваше приложение соответствует требованиям, я думаю, мы можем назвать его хорошо работающим.

7
ответ дан 29 November 2019 в 03:08
поделиться

Мне бы хотелось, чтобы Run (args) заменяли на создание экземпляра класса. Что-то вроде:

Основная попытка:

try
{
    // Process args to get parameters for AClass
    AClass program = new AClass(a, b);
    return program.Run();
}

AClass:

public class AClass {
    AClass(string a, string b) { ... }
    public int Run() {
        ...
        return Environment.ExitCode;
    }
}

Что-то вроде этого будет препятствовать процессуальному коду и поощрять создание объектно-ориентированного подхода.

Что касается AClass () конструктор, я думаю, что аргументы должны быть обработаны перед передачей в AClass () вместо того, чтобы AClass () знать, что он создан через консольное приложение.

3
ответ дан 29 November 2019 в 03:08
поделиться

Я использую emacs и вещь под названием defaultcontent.el . Если вы не знакомы, Emacs - это текстовый редактор и очень расширяемый. defaultcontent.el - это расширение, которое вставляет (неожиданно) содержимое по умолчанию в новые файлы, когда они впервые создаются emacs.

Итак, если я пытаюсь открыть файл .cs, который не существует, emacs создает его, а затем помещает в него набор содержимого по умолчанию. Я решаю, какой контент включать в новые файлы. Для моих файлов C # это содержимое включает:

  • простую документацию с отметкой времени, авторскими правами и другими шаблонами.
  • набор атрибутов области сборки (FileVersion, AssemblyDescription и т. Д.)
  • один класс
  • a конструктор, который принимает массив строковых аргументов и анализирует их; логика синтаксического анализа - это оператор switch с некоторым шаблоном для синтаксического анализа целых чисел, строк, и логические.
  • Метод использования, который печатает информацию об использовании.
  • метод Main, который создает экземпляр класса и вызывает «Run ()»; это заключено в try..catch, а в catch вызывается метод Usage (). Если в программе возникает какая-либо ошибка, отображается сообщение об использовании.

defaultcontent.el также позволяет мне размещать курсор там, где я хочу. В моем случае это в середине пустого метода Run ().

Это мой контент по умолчанию:

// default.cs
// ------------------------------------------------------------------
//
// Description goes here....
// 
// Author: MyUser
// built on host: MyMachine
// Created Tue Oct 27 15:01:18 2009
//
// last saved: 
// Time-stamp: <2009-October-20 00:18:52>
// ------------------------------------------------------------------
//
// Copyright Notice here
// All rights reserved!
//
// ------------------------------------------------------------------

using System;
using System.Reflection;


// to allow fast ngen
[assembly: AssemblyTitle("default.cs")]
[assembly: AssemblyDescription("insert purpose here")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Dino Chiesa")]
[assembly: AssemblyProduct("Tools")]
[assembly: AssemblyCopyright("Copyright notice again")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("1.1.1.1")]


namespace Cheeso.ToolsAndTests
{

  public class default
  {
    // ctor
    public default () {}

    string _positionalParam1;
    string _param1;
    int _intParam = DefaultIntParamValue;
    bool _flag1;

    private readonly int DefaultIntParamValue = -99;

    // ctor
    public default (string[] args)
    {
        for (int i=0; i < args.Length; i++)
        {
            switch (args[i])
            {
            case "-stringArg":
                i++;
                if (args.Length <= i) throw new ArgumentException(args[i]);
                _param1 = args[i];
                break;

            case "-intArg":
                i++;
                if (args.Length <= i) throw new ArgumentException(args[i]);
                if (_intParam != DefaultIntParamValue)
                    throw new ArgumentException(args[i]);
                if (args[i].StartsWith("0x"))
                    _intParam = System.Int32.Parse(args[i].Substring(2), System.Globalization.NumberStyles.AllowHexSpecifier );
                else
                    _intParam = System.Int32.Parse(args[i]);
                break;


            case "-boolarg":
                _flag1 = true;
                break;

            case "-?":
                throw new ArgumentException(args[i]);

            default:
                if (_positionalParam1 != null)
                    throw new ArgumentException(args[i]);

                _positionalParam1 = args[i];
                break;
            }
        }

        // default values
        if (_positionalParam1 == null)
            _positionalParam1 = "default.value.for.positional.param";

        if (_param1 == null)
            _param1 = "default.value.for.param1";

        if (_param2 == 0)
            _param2 = DEFAULT_value_for_param2;

    }

    public void Run()
    {



    }

    public static void Usage()
    {
        Console.WriteLine("\ndefault: <usage statement here>.\n");
        Console.WriteLine("Usage:\n  default [-arg1 <value>] [-arg2]");
    }


    public static void Main(string[] args)
    {
      try 
      {
        new default(args)
            .Run();
      }
      catch (System.Exception exc1)
      {
        Console.WriteLine("Exception: {0}", exc1.ToString());
        Usage();
      }
    }

  }
}

У меня также есть defaultcontent, настроенный для .c, .cpp, .vb, .csproj, .xml, .xsd, .wsdl, makefile и многих других типов файлов.

Если в программе возникает какая-либо ошибка, отображается сообщение об использовании.

defaultcontent.el также позволяет мне размещать курсор там, где я хочу. В моем случае это в середине пустого метода Run ().

Это мой контент по умолчанию:

// default.cs
// ------------------------------------------------------------------
//
// Description goes here....
// 
// Author: MyUser
// built on host: MyMachine
// Created Tue Oct 27 15:01:18 2009
//
// last saved: 
// Time-stamp: <2009-October-20 00:18:52>
// ------------------------------------------------------------------
//
// Copyright Notice here
// All rights reserved!
//
// ------------------------------------------------------------------

using System;
using System.Reflection;


// to allow fast ngen
[assembly: AssemblyTitle("default.cs")]
[assembly: AssemblyDescription("insert purpose here")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Dino Chiesa")]
[assembly: AssemblyProduct("Tools")]
[assembly: AssemblyCopyright("Copyright notice again")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("1.1.1.1")]


namespace Cheeso.ToolsAndTests
{

  public class default
  {
    // ctor
    public default () {}

    string _positionalParam1;
    string _param1;
    int _intParam = DefaultIntParamValue;
    bool _flag1;

    private readonly int DefaultIntParamValue = -99;

    // ctor
    public default (string[] args)
    {
        for (int i=0; i < args.Length; i++)
        {
            switch (args[i])
            {
            case "-stringArg":
                i++;
                if (args.Length <= i) throw new ArgumentException(args[i]);
                _param1 = args[i];
                break;

            case "-intArg":
                i++;
                if (args.Length <= i) throw new ArgumentException(args[i]);
                if (_intParam != DefaultIntParamValue)
                    throw new ArgumentException(args[i]);
                if (args[i].StartsWith("0x"))
                    _intParam = System.Int32.Parse(args[i].Substring(2), System.Globalization.NumberStyles.AllowHexSpecifier );
                else
                    _intParam = System.Int32.Parse(args[i]);
                break;


            case "-boolarg":
                _flag1 = true;
                break;

            case "-?":
                throw new ArgumentException(args[i]);

            default:
                if (_positionalParam1 != null)
                    throw new ArgumentException(args[i]);

                _positionalParam1 = args[i];
                break;
            }
        }

        // default values
        if (_positionalParam1 == null)
            _positionalParam1 = "default.value.for.positional.param";

        if (_param1 == null)
            _param1 = "default.value.for.param1";

        if (_param2 == 0)
            _param2 = DEFAULT_value_for_param2;

    }

    public void Run()
    {



    }

    public static void Usage()
    {
        Console.WriteLine("\ndefault: <usage statement here>.\n");
        Console.WriteLine("Usage:\n  default [-arg1 <value>] [-arg2]");
    }


    public static void Main(string[] args)
    {
      try 
      {
        new default(args)
            .Run();
      }
      catch (System.Exception exc1)
      {
        Console.WriteLine("Exception: {0}", exc1.ToString());
        Usage();
      }
    }

  }
}

У меня также есть defaultcontent, настроенный для .c, .cpp, .vb, .csproj, .xml, .xsd, .wsdl, makefile и многих других типов файлов.

Если в программе возникает какая-либо ошибка, отображается сообщение об использовании.

defaultcontent.el также позволяет мне размещать курсор там, где я хочу. В моем случае это в середине пустого метода Run ().

Это мой контент по умолчанию:

// default.cs
// ------------------------------------------------------------------
//
// Description goes here....
// 
// Author: MyUser
// built on host: MyMachine
// Created Tue Oct 27 15:01:18 2009
//
// last saved: 
// Time-stamp: <2009-October-20 00:18:52>
// ------------------------------------------------------------------
//
// Copyright Notice here
// All rights reserved!
//
// ------------------------------------------------------------------

using System;
using System.Reflection;


// to allow fast ngen
[assembly: AssemblyTitle("default.cs")]
[assembly: AssemblyDescription("insert purpose here")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Dino Chiesa")]
[assembly: AssemblyProduct("Tools")]
[assembly: AssemblyCopyright("Copyright notice again")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("1.1.1.1")]


namespace Cheeso.ToolsAndTests
{

  public class default
  {
    // ctor
    public default () {}

    string _positionalParam1;
    string _param1;
    int _intParam = DefaultIntParamValue;
    bool _flag1;

    private readonly int DefaultIntParamValue = -99;

    // ctor
    public default (string[] args)
    {
        for (int i=0; i < args.Length; i++)
        {
            switch (args[i])
            {
            case "-stringArg":
                i++;
                if (args.Length <= i) throw new ArgumentException(args[i]);
                _param1 = args[i];
                break;

            case "-intArg":
                i++;
                if (args.Length <= i) throw new ArgumentException(args[i]);
                if (_intParam != DefaultIntParamValue)
                    throw new ArgumentException(args[i]);
                if (args[i].StartsWith("0x"))
                    _intParam = System.Int32.Parse(args[i].Substring(2), System.Globalization.NumberStyles.AllowHexSpecifier );
                else
                    _intParam = System.Int32.Parse(args[i]);
                break;


            case "-boolarg":
                _flag1 = true;
                break;

            case "-?":
                throw new ArgumentException(args[i]);

            default:
                if (_positionalParam1 != null)
                    throw new ArgumentException(args[i]);

                _positionalParam1 = args[i];
                break;
            }
        }

        // default values
        if (_positionalParam1 == null)
            _positionalParam1 = "default.value.for.positional.param";

        if (_param1 == null)
            _param1 = "default.value.for.param1";

        if (_param2 == 0)
            _param2 = DEFAULT_value_for_param2;

    }

    public void Run()
    {



    }

    public static void Usage()
    {
        Console.WriteLine("\ndefault: <usage statement here>.\n");
        Console.WriteLine("Usage:\n  default [-arg1 <value>] [-arg2]");
    }


    public static void Main(string[] args)
    {
      try 
      {
        new default(args)
            .Run();
      }
      catch (System.Exception exc1)
      {
        Console.WriteLine("Exception: {0}", exc1.ToString());
        Usage();
      }
    }

  }
}

У меня также есть defaultcontent, настроенный для .c, .cpp, .vb, .csproj, .xml, .xsd, .wsdl, makefile и многих других типов файлов.

0
ответ дан 29 November 2019 в 03:08
поделиться

Я считаю эту статью наиболее подробной и информативной по этому вопросу:

Консольные приложения в .NET, или Обучение новой собаке старым трюкам

Майкл Брук

MSDN Magazine, февраль 2004 г.

http://msdn.microsoft.com/en-us/magazine/cc164014.aspx

2
ответ дан 29 November 2019 в 03:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: