Если Вы хотите оптимизировать свой код, но все еще ясны, попробуйте это:
y = x * (1.0 / 2.0);
компилятор должен быть в состоянии сделать деление во время компиляции, таким образом, Вы получаете умножение во времени выполнения. Я ожидал бы, что точность совпадет с в y = x / 2.0
случай.
то, Где это может иметь БОЛЬШОЕ ЗНАЧЕНИЕ, находится во встроенных процессорах, где эмуляция с плавающей точкой требуется, чтобы вычислять арифметику с плавающей точкой.
Думаю, все зависит от реальных требований к этому приложению. Если нет необходимости выполнять специальную обработку ошибок - не делайте этого. Если никакой программе не требуется проверять код выхода вашего приложения - не нужно его возвращать; и я считаю, что есть случаи, когда эти требования не применяются.
Другими словами, минимальный - минимальный; сделайте самое простое, что может сработать. И если ваше приложение соответствует требованиям, я думаю, мы можем назвать его хорошо работающим.
Мне бы хотелось, чтобы 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 ()
знать, что он создан через консольное приложение.
Я использую emacs и вещь под названием defaultcontent.el . Если вы не знакомы, Emacs - это текстовый редактор и очень расширяемый. defaultcontent.el - это расширение, которое вставляет (неожиданно) содержимое по умолчанию в новые файлы, когда они впервые создаются emacs.
Итак, если я пытаюсь открыть файл .cs, который не существует, emacs создает его, а затем помещает в него набор содержимого по умолчанию. Я решаю, какой контент включать в новые файлы. Для моих файлов C # это содержимое включает:
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 и многих других типов файлов.
Я считаю эту статью наиболее подробной и информативной по этому вопросу:
Консольные приложения в .NET, или Обучение новой собаке старым трюкам
Майкл Брук
MSDN Magazine, февраль 2004 г.