Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将int的值声明为不可更改_C#_Variables_Declaration - Fatal编程技术网

C# 将int的值声明为不可更改

C# 将int的值声明为不可更改,c#,variables,declaration,C#,Variables,Declaration,嘿,我想要那样的东西 int a=0; a=5(be unchangeable); a=3; Console.WriteLine(a);//which will print 5 and not 3 所以基本上把变量声明为一个数字,并使其成为最终的、不可更改的,我试着四处看看,但我只发现在声明int时起作用的东西,而不是作为它的新值 const int a = 0; const关键字用于修改字段或本地字段的声明 变量它指定字段的值或本地 变量是常量,这意味着它不能被修改 .您需要const关键

嘿,我想要那样的东西

int a=0;
a=5(be unchangeable);
a=3;
Console.WriteLine(a);//which will print 5 and not 3
所以基本上把变量声明为一个数字,并使其成为最终的、不可更改的,我试着四处看看,但我只发现在声明int时起作用的东西,而不是作为它的新值

const int a = 0;
const关键字用于修改字段或本地字段的声明 变量它指定字段的值或本地 变量是常量,这意味着它不能被修改


.

您需要
const
关键字

const int a = 5;
const int a = 5;
发件人:

const关键字用于修改字段或局部变量的声明。它指定不能修改字段或局部变量的值

编辑:你的要求听起来很奇怪,没有用。但是如果你真的需要它,你必须创建一个自定义类型。我建议使用一个带有
bool
属性的类来说明它是否是可变的

public class MyCustomInt
{
    public bool IsMutable { get; set; }

    private int _myInt;
    public int MyInt 
    { 
        get
        {
            return _myInt;
        } 
        set
        {
            if(IsMutable)
            {
                _myInt = value;
            }
        }
    }

    public MyCustomInt(int val)
    { 
        MyInt = val;
        IsMutable = true;
    }
}
然后,当您使用它时:

MyCustomInt a = new MyCustomInt(0);
a.MyInt = 5;
a.IsMutable = false;
a.MyInt = 3; //Won't change here!
Console.WriteLine(a); //Prints 5 and not 3
我想这是你能得到的最好的了

这不管用吗

const int a = 5;

请参见您可以将常量与
const
关键字一起使用

const int a = 5;
const int a = 5;
但如果您这样做,将不允许更改为其他值

您还可以检查指针的使用情况:

int x = 5;
int y = 3;
int *ptr1 = &x; // point to x memory address
int *ptr2 = &y; // point to y memory address

Console.WriteLine(x); // print 5
Console.WriteLine(y); // print 3

Console.WriteLine((int)ptr1); // print 5
Console.WriteLine((int)ptr2); // print 3
Console.WriteLine(*ptr1); // print 5
Console.WriteLine(*ptr2); // print 3

*
char标识指针并
&
指定内存地址。但是您应该注意指针,因为与引用类型不同,默认的垃圾收集机制不会跟踪指针类型

使用
只读

因为它可以被构造函数更改,但不能再次更改

public class MyClass {
 private readonly int a = 0;
 public MyClass(int a) {
  this.a = a;
 }

 public void DoSomethingWithA() {
   Console.WriteLine(this.a);
   //a = 5 // don't try this at home kids
 }
}

new MyClass(5).DoSomethingWithA();

const
readonly

使用常量,例如:
const int a=5这与整数或值无关。它与变量有关(并防止重新分配)。@jenson button事件
readonly
仅适用于字段/成员变量;不是局部变量。有点遗憾,因为它确实有一个用例(这个问题就是一个例子):(你到底为什么要对局部变量这样做?你正在编写代码,如果你不想更改,就不要更改它。与局部变量相关的所有内容都在本地可见,因此没有任何借口。@rbaryyoung的原因与Scala鼓励使用
val
-阻止副作用的原因相同,因为您无法更改它。虽然这是一个稍微做作的示例,但C#没有相应的“我不希望重新分配此变量”,并且不能为
const
分配一个“非const”表达式,这使得它与
val
非常不同。这并不意味着没有用例。它只是不受C#的支持。(Java实际上通过在变量上使用
final
修饰符来很好地支持这一点。就像大多数Java:D一样笨重)但是如果我使用const int a=0,那么它根本不能做我想做的事情,我想声明变量,然后给它另一个值,它将是最终的,不可更改的,然后如果它得到另一个值,它应该忽略它。对于本机类型,这是不可能的。而且,这是一个愚蠢和任意的要求!太糟糕了,他们应该添加hehe.erm,描述一个使用原生类型的有意义的用例…你当然可以编写你自己的类来模仿这个行为……@ C中的米切尔假设,但是考虑在赋值之前防止变量使用的规则:<代码>只读int i;如果(x){i= a;}否则{i= b;}。
或者,即使不受const的限制:
inta=1;const inti=a
(也就是说,我不明白为什么局部变量上没有可用的
只读
。。当然,语言不支持它。)+1(以及其他变量)-对于更复杂的对象来说,这种要求并不少见,它们在某一点上应该是不可变的-您的示例显示了这一点。@AlexeiLevenkov谢谢,我以前从未听说过“冰棒不可变性”这个词!我不认为这是真正的官方术语,但我喜欢Eric Lippert为这种行为想出的名字。