在C#中,可以像这样定义一个类型成员常量:
class Foo { public const int Bar = 600; }
Run Code Online (Sandbox Code Playgroud)
IL看起来像这样.
.field public static literal int32 Bar = int32(600)
Run Code Online (Sandbox Code Playgroud)
我如何在Visual F#/ FSharp中做同样的事情?
我试过这个无济于事:
[<Sealed>]
type Foo() =
[<Literal>]
let Bar = 600
Run Code Online (Sandbox Code Playgroud) 我已经读过,当每次调用函数时不希望变量值改变/初始化时,静态变量在函数内部使用.但是如何在"main"之前在主程序中定义变量static,例如
#include <stdio.h>
static double m = 30000;
int main(void)
{
value = m * 2 + 3;
}
Run Code Online (Sandbox Code Playgroud)
这里变量m具有一个常量值,以后不会在主程序中修改.在同样的思路中,它有什么不同,而不是使用静态定义:
const double m = 30000;
Run Code Online (Sandbox Code Playgroud)
要么
#define m 30000 //m or M
Run Code Online (Sandbox Code Playgroud)
然后确保在主代码中使用双重操作,以便将m转换为正确的数据类型.
有没有办法创建一个常量对象(即它无法编辑并在编译时创建)?
我只是在玩C#语言并注意到可选参数功能,并认为可以将默认对象用作可选参数.考虑以下:
//this class has default settings
private const SettingsClass DefaultSettings = new SettingsClass ();
public void doSomething(SettingsClass settings = DefaultSettings)
{
}
Run Code Online (Sandbox Code Playgroud)
这显然不能编译,但是我想做的一个例子.是否可以创建这样的常量对象并将其用作可选参数的默认值?
我想检查一下我对此事的理解和结论.
在IRC上,有人问:
绑定到临时对象
const_cast的const引用是否可以接受?
翻译:他有一个临时的ref-to-const,他想抛弃它const来修改它.
我的回答是我之前曾问过一个类似的问题,其中的共识似乎是临时性本身并不是天生的const,因此你可以抛弃const你对它们的引用的性质,并通过结果修改它们.而且,只要原始参考const仍然存在,这不会影响临时的生命周期.
那是:
int main()
{
const int& x = int(3);
int& y = const_cast<int&>(x);
y = 4;
cout << x;
}
// Output: 4
// ^ Legal and safe
Run Code Online (Sandbox Code Playgroud)
我对吗?
(当然,这些代码是否真的是可取的完全是另一回事!)
或者是否有一些其他保护措施不能修改它们?
如果它们在只读存储器中是有意义的 - 这就是制作它们的原因const,对吗?
码:
const char* const* const* foo(int bar);
Run Code Online (Sandbox Code Playgroud)
我已经看过双锥体,之前也阻止了指针的修改.我第一次见到生命中的三重常数.想知道它的用途是什么.
在C中,typedef使用这种结构可以使用数组:
typedef int table_t[N];
这里,table_t现在定义为N的数组int.声明的任何变量table_t t;现在将表现为正常数组int.
这种构造的要点是在函数中用作参数类型,例如:
int doSomething(table_t t);
一个相对等效的函数原型可能是:
int doSomething(int* t);
第一个结构的优点是它强制执行N表的大小.在许多情况下,强制执行此属性更安全,而不是依赖程序员来正确地找出这种情况.
现在一切都很好,除了为了保证表的内容不会被修改,有必要使用const限定符.
以下陈述相对简单易懂:
int doSomething(const int* t);
现在,doSomething保证它不会修改作为指针传递的表的内容.现在,这几乎相同的建筑怎么样?:
int doSomething(const table_t t);
这是什么const?表的内容,或指向表的指针?如果它是指针const,是否有另一种方式(C90兼容)保留定义表大小的能力并告诉它的内容将是const?
请注意,有时还需要修改表的内容,因此该const属性不能嵌入到typedef定义中.
[ 编辑 ]感谢到目前为止收到的优秀答案.总结一下:
const属性的行为也与指针相同(与指针类型的typedef形成鲜明对比,如下面的@random所示)我正在尝试使用node-jslint https://github.com/reid/node-jslint以保持我的代码清洁
我的nodejs脚本中有一个const,但是jslint说它不是有效的ES6代码
Unexpected ES6 feature.
const pdPersonsFilterId = process.argv[2]; // Line 10, Pos 0
Run Code Online (Sandbox Code Playgroud)
这是我在控制台中使用的命令
jslint --edition=latest index.js
Run Code Online (Sandbox Code Playgroud)
根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const,可以使用全局常量.
为什么jslint不认为此代码有效?
有谁可以帮助我吗
我有2个文件main.ts和hi.ts
hi.ts:
export const hello = "dd";
Run Code Online (Sandbox Code Playgroud)
main.ts:
import { hello } from "./hi";
...
class A {
public sayHello() {
console.log("hello=" + hello);
}
...
}
Run Code Online (Sandbox Code Playgroud)
我有例外:
未捕获的ReferenceError:未定义hello(...)
如何从A类中看到这个const变量?可能吗?
我一直在编写一组类来允许一个简单的类似python的zip函数.以下代码片段(几乎)可以正常工作.然而,这两个变量a并b没有const.
std::vector<double> v1{0.0, 1.1, 2.2, 3.3};
std::vector<int> v2{0, 1, 2};
for (auto const& [a, b] : zip(v1, v2))
{
std::cout << a << '\t' << b << std::endl;
a = 3; // I expected this to give a compiler error, but it does not
std::cout << a << '\t' << b << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我一直在使用gcc 7.3.0.这是MCVE:
#include <iostream>
#include <tuple>
#include <vector>
template <class ... Ts>
class zip_iterator
{
using value_iterator_type = …Run Code Online (Sandbox Code Playgroud) const ×10
c ×4
c++ ×3
.net ×1
arrays ×1
c# ×1
c++17 ×1
const-cast ×1
declaration ×1
ecmascript-6 ×1
export ×1
f# ×1
import ×1
javascript ×1
jslint ×1
node.js ×1
reference ×1
static ×1
typedef ×1
typescript ×1