2014-02-01 6 views
7

Итак, я работаю над проектом на основе химии и столкнулся с этой сложной проблемой. У меня есть куча функций, выполняющих вычисления типа химии, и вы хотите передать номер avogadros в качестве параметра по умолчанию для функции. Позвольте мне просто дайте код говорить:Как заставить постоянную времени выполнения быть константой времени компиляции?

class Constants 
{ 
    //must be readonly to b/c Math.Pow is calculated at run-time 
    public static double readonly avogadrosNum = 6.022*Math.Pow(10,-22); 
} 

class chemCalculations 
{ //getting default parameter must be a compile-time constant 
    public double genericCalc(double avogadrosNum = Constants.avogadrosNum); 
} 

Edit: не знал о экспоненциальном формате, спасибо ребята

+0

Почему бы вам не рассчитать результат inst ead вызова pow, а затем использовать const? –

+3

Это пустая микроватт. Подумайте о будущем. –

+0

@ DanielS. Если вы имеете в виду предварительное вычисление результата с использованием Math.Pow и сохранение его в переменной, я пробовал это, и он не работал, потому что Math.Pow не вычисляется до времени выполнения – user2202911

ответ

14

Вы не можете, в общем. Все, что связано с вызовом метода, - это , а не, которая будет константой времени компиляции, что касается компилятора.

Что вы можете сделать это выразить double буквального с использованием научной нотации, хотя:

public const double AvogadrosNumber = 6.022e-22; 

Так этот конкретный случай вы можете написать его без потери читаемости.

В других настройках, если тип является одним из примитивных типов или decimal, вы можете просто написать константу как литерал и использовать комментарий, чтобы объяснить, как вы его получили. Например:

// Math.Sqrt(Math.PI) 
public const double SquareRootOfPi = 1.7724538509055159; 

Обратите внимание, что даже если вызовы методов не могут использоваться в постоянных выражениях, могут использоваться другие операторы. Например:

// This is fine 
public const double PiSquared = Math.PI * Math.PI; 

// This is invalid 
public const double PiSquared = Math.Pow(Math.PI, 2); 

См раздел 7.19 на # 5 спецификации C для получения более подробной информации о том, что допускается в постоянном выражении.

+0

Что хорошего в этом ответе, так это то, что вы знали точный раздел спецификации C#, который рассказал вам о выражениях 'const' и написал принятый ответ об этом без необходимости редактировать и делать это в течение 5 минут. –

+0

@dudeprgm: Я подозреваю, что я * сделал * отредактировал его, но в течение 5-минутного льготного периода, чтобы быть справедливым :) –

2

Просто определить avogadros число как научной нотации:

class Constants 
{ 
    public double const avogadrosNum = 6.022e-22; 
} 
+2

Поле 'const' не может быть помечено как статическое. Это не скомпилируется. –

+0

@RohitVats исправлено – user1937198

1

Вы можете это сделать в экспоненциальной формат: 6.022E-22

2

Для постоянной времени компиляции необходимо использовать ключевое слово const. Но, чтобы использовать его, ваше выражение должно также быть константой времени компиляции, как вы заметили: вы не можете использовать такие функции, как Math.Pow.

class Constants 
{ 
    public const double avogadrosNum = 6.022E-22; 
} 

Если вы не можете или не хотите, чтобы переработать вашу константу время компиляции константы, вы не можете использовать его в время компиляции контекстов, но вы могли бы работать вокруг этого путем перегрузки, так что значение времени выполнения может быть использованы в качестве рода аргументов по умолчанию: (. Кстати, значение константы либо неправильно, либо имеет очень обманчивое название это должно, скорее всего, будет 6.022E+23.)

class chemCalculations 
{ 
    public double genericCalc() { 
     return genericCalc(Constants.avogadrosNum); 
    } 
    public double genericCalc(double avogadrosNum) { 
     // real code here 
    } 
} 

+0

Хороший улов, на «+23». даже не осознавали, что – user2202911

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