Wiem, że zostało to bardzo wiele zapytane, ale tylko dla C/C++ i Java. Pytanie dotyczy korzyści związanych z używaniem wyrażeń stałych:ocenia wyrażenie w czasie kompilacji
Kiedy wywołuję funkcję statyczną z tylko stałymi jako argumentami, czy istnieje sposób, aby powiedzieć kompilatorowi, że powinien ocenić połączenie już w czasie kompilacji i zastąpić połączenie przez wynik?
Przykład:
const double pi = Math.PI; //works as Math.PI is a constant
const double spi = Math.Sin(Math.PI); //compiler error, because expression must be constant
Czy istnieją żadne wytyczne (lepiej: Atrybuty), aby poinformować kompilator jawnie, że metoda statyczna jak Math.sin() nie modyfikuje ani czytać żadnych danych wewnętrznie, tak że było technicznie możliwe do oceny połączenia w czasie kompilacji?
Aha, i proszę nie odpowiadać jak "po prostu zrób const double spi = 0
" :), ponieważ mój przykład jest po prostu uproszczoną wersją problemu, który mam: Poprawa łatwości kodowania przy zachowaniu maksymalnej wydajności.
Dzięki za pomoc - to naprawdę doceniane!
nie ma sposobu, aby określić metodę jako __pure__ funkcji. Kompilator nie ma możliwości określenia, czy Math.Sin() nie powoduje skutków ubocznych. – qxg
O ile mi wiadomo, nie. Możesz wygenerować wynikowy kod (przy użyciu T4 lub niestandardowego narzędzia), lub użyć narzędzia do tkania IL do postprocesowania wygenerowanego zespołu lub utworzyć dostosowany kompilator za pomocą Roslyn. Gdyby tylko C# było Lispiem, nie byłoby to takie trudne. ;) –
Czy próbujesz rozwiązać * rzeczywisty * problem, czy zakładasz, że potrzebna jest tutaj specyficzna składnia związana z C++? W języku C# const oznacza ** const **, tzn. Nigdy się nie zmienia po kompilacji. Jeśli chcesz uzyskać niezmienny wynik, są * inne * sposoby, aby to zrobić, np. 'Statyczna wartość readonly' lub właściwość tylko do uzyskania, która zwraca stałą wartość –