2015-02-19 3 views
4

Я пишу немного C# в математике. Многие строки последовательно используют множество абс(), min(), max(), sqrt() и т. Д. Использование C# является обычным обычным способом, я должен предисловие каждой функции с помощью «Math». НапримерКак избежать «математики». перед каждой математической функцией в C#?

double x = Math.Min(1+Math.Sqrt(A+Math.Max(B1,B2)), 
      Math.Min(Math.Cos(Z1),Math.Cos(Z2))); 

Я предпочел бы написать код, как и в C:

double x = min(1+sqrt(A+max(B1,B2)), min(cos(Z1), cos(Z2))); 

Это легче читать и выглядит более естественно, ученых и инженеров. Обычный C# способ скрывает хорошие бит в тумане «Math».

Есть ли способ в C# для этого?

Через некоторое Googling я нашел пример, который привел меня попробовать

using min = Math.Min; 
... 
double x = min(a,b);   

но «используя» заявление выдал ошибку «System.Math.Min (десятичную, десятичное) представляет собой метод, но используется как тип », но в остальном это выглядело как хорошее решение. (Что такое «десятичный», так или иначе?)

+3

«более естественно для ученых и инженеров», да, но это выглядит неестественно для программистов на C#. –

+5

До тех пор пока C# 6 не будет иметь ['using' статические члены] (https://roslyn.codeplex.com/wikipage?title=Language%20Feature%20Status&referringTitle=Documentation), вы не сможете этого сделать. –

+0

Вы не сможете это сделать до тех пор, пока C# 6 не отправится: http://davefancher.com/2014/08/07/c-6-0-using-static/. Вы * можете * писать свои собственные методы-оболочки для статических методов 'Math'. Ни один из примеров не является тем, что я бы назвал естественным или читаемым. –

ответ

0

Одним из многих решений было бы определение делегатов локально. Код

double x = Math.Min(1+Math.Sqrt(A+Math.Max(B1,B2)), 
      Math.Min(Math.Cos(Z1),Math.Cos(Z2))); 

может быть переписан на следующую реализацию.

Func<double,double,double> min = Math.Min; 
Func<double,double,double> max = Math.Max; 
Func<double,double> sqrt = Math.Sqrt; 
Func<double,double> cos = Math.Cos; 
double x = min(1+sqrt(A+max(B1,B2)), min(cos(Z1), cos(Z2))); 
+2

Единственная проблема заключается в том, что все заставляет вас быть «двойным», вы не можете использовать перегрузки с делегатами. (Я собирался ответить на один и тот же ответ и понял эту проблему, набрав пример) –

+0

@ScottChamberlain Очень верно, но с помощью любого решения в любом случае нужно будет определять функции для каждой желаемой перегрузки. – Codor

+1

Это значительно ухудшит производительность. Примите это во внимание, если это имеет значение. –

8

Если вы действительно заботитесь, что много, вы можете написать свой собственный метод

private int min(int a, int b) 
{ 
    return Math.Min(a, b); 
} 

если вы амбициозны, вы можете посмотреть в делать это с generics


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

double piece2 = 1+Math.Sqrt(A+Math.Max(B1,B2)); 
double piece1 = Math.Min(Math.Cos(Z1),Math.Cos(Z2)) 
double x = min(piece1, piece2); 

Единственная причина, почему я называть вещи piece2 и piece2, потому что я на самом деле не знаю, что ваше выражение должно рассчитать. На практике у вас должны быть более значимые имена, такие как velocity, или incomeTaxPercentage

+2

обертывание метода аналогично этому или в качестве метода расширения является наилучшим способом в настоящее время. Вы можете делать умные вещи с делегатами, но это будет болью для поддержания. +1 –

+0

Вы использовали 'piece2' дважды в своем коде и в тексте, а не' шт1' и 'штука2'. –

4

Есть функция для этого в следующей версии C#. См. «Статические с использованием выражений» here.

+0

+1 для предстоящей функции, и она помечена как «уже реализована» на roslyn github's: https://github.com/dotnet/roslyn/wiki/Languages-features-in-C%23-6-and-VB- 14 – rducom

6

Вы не можете этого сделать. По крайней мере, вы не мог сделать это до C# 6.

Если вы используете C# 6, вы можете написать:

using static System.Math; 

В верхней части файла, что позволит вам получить доступ его статические методы без использования имени типа (Math).

«using» a метод на самом деле не имеет никакого смысла для компилятора или семантически, поэтому вы получили эту ошибку.

И наконец, decimal является еще одним цифровым типом (например, double). Он просто выбрал , что перегрузка Math.Min при генерировании ошибки.

+0

Синтаксис этой функции фактически изменился на ['using static'] (https://msdn.microsoft.com/library/sf0df423.aspx). –

+0

@ SimonMᶜKenzie Спасибо, я исправил синтаксис – BradleyDotNET

2

Поскольку Math класс не имен вы не можете поместить его, как обычно, используя, вместо этого вы можете поставить его так:

с использованием статического System.Math;

Он применим для любого другого класса внутри пространства имен.

+0

Чтобы избежать путаницы, следует отметить, что это [C# 6] (http://blogs.msdn.com/b/csharpfaq/archive/2014/11/20/new-features-in-c-6. aspx). –

Смежные вопросы