C# 无法修改其值的数据字段或局部变量?

C# 无法修改其值的数据字段或局部变量?,c#,C#,嘿,伙计们,我是c#的新手。我在读这本书,空白处填的是,数据字段或局部变量的值是不能修改的吗?有人能告诉我答案吗?谢谢 ps:我在youtube上搜索了很多新手,但我在代码上搞砸了。 谢谢。答案是Const。 这是链接答案是常量。 以下是链接完整的答案有两个: 1) 对于基本类型(如int、double、string等),可以使用const修饰符,这确实意味着该类型变量的值不能通过任何方式更改 2) 对于非基本类型,存在一个readonly修饰符。请注意,不能将const应用于非基本类型。对于引

嘿,伙计们,我是c#的新手。我在读这本书,空白处填的是,数据字段或局部变量的值是不能修改的吗?有人能告诉我答案吗?谢谢 ps:我在youtube上搜索了很多新手,但我在代码上搞砸了。 谢谢。

答案是Const。 这是链接

答案是常量。
以下是链接

完整的答案有两个:

1) 对于基本类型(如
int
double
string
等),可以使用
const
修饰符,这确实意味着该类型变量的值不能通过任何方式更改

2) 对于非基本类型,存在一个
readonly
修饰符。请注意,不能将
const
应用于非基本类型。对于引用和值类型,它的含义是相同的: 构造此对象后,无法更改对此变量的引用。 然而,它有不同的后果:

2.1)
只读
对象本身可以通过其公共API进行更改。例如:

class Foo{
  private readonly List<int> list;
  public Foo(){ list = new List<int>();}

  public Test()
  {
    list = new List<int>(); // invalid; your reference is readonly
    list.add(5);//works, you are changing the object, but not touching it's reference
  }
}
class-Foo{
私有只读列表;
public Foo(){list=new list();}
公开考试()
{
list=new list();//无效;您的引用是只读的
list.add(5);//工作,您正在更改对象,但不接触它的引用
}
}

2.2)对于值类型
readonly
使用
readonly
修饰符时必须小心-这可能会导致可变结构的细微错误。例如,见。但是,如果您的
结构是不可变的,则可以有效地获得
const
关键字的语义,完整的答案有两个:

1) 对于基本类型(如
int
double
string
等),可以使用
const
修饰符,这确实意味着该类型变量的值不能通过任何方式更改

2) 对于非基本类型,存在一个
readonly
修饰符。请注意,不能将
const
应用于非基本类型。对于引用和值类型,它的含义是相同的: 构造此对象后,无法更改对此变量的引用。 然而,它有不同的后果:

2.1)
只读
对象本身可以通过其公共API进行更改。例如:

class Foo{
  private readonly List<int> list;
  public Foo(){ list = new List<int>();}

  public Test()
  {
    list = new List<int>(); // invalid; your reference is readonly
    list.add(5);//works, you are changing the object, but not touching it's reference
  }
}
class-Foo{
私有只读列表;
public Foo(){list=new list();}
公开考试()
{
list=new list();//无效;您的引用是只读的
list.add(5);//工作,您正在更改对象,但不接触它的引用
}
}


2.2)对于值类型
readonly
使用
readonly
修饰符时必须小心-这可能会导致可变结构的细微错误。例如,见。但是,如果您的
struct
是不可变的,您可以有效地得到
const
关键字的语义,常量可以是答案。@Yoda仅适用于基本类型though@Yoda如果你的搜索引擎是Youtube
readonly
,答案也是正确的,那就不是了。因为问题被表述为“是数据字段还是局部变量”。Readonly不能用于局部变量,但可以用于字段,因此不违反or条件。const和readonly之间的区别在于可以在ctor中指定只读字段。它们不是编译时常量,而const是。常量可以是答案。@Yoda仅适用于基本类型though@Yoda如果你的搜索引擎是Youtube
readonly
,答案也是正确的,那就不是了。因为问题被表述为“是数据字段还是局部变量”。Readonly不能用于局部变量,但可以用于字段,因此不违反or条件。const和readonly之间的区别在于可以在ctor中指定只读字段。它们不是编译时常量,而常量是。
readonly
可用于非基元类型。对于值和引用类型,这两个关键字的工作方式相同,并且它们的语义不会因变量的类型而改变。程序员的结果确实会改变。可变类没有问题,但可变结构确实有问题。
可变类没有问题
取决于您的意图。如果我用readonly标记引用变量,我可能认为它不会被更改,但如果对象是这种类型的可变对象,我可能会大错特错。@IlyaIvanov我在回答中提到了这一点。问题是只读!=无论如何,我试图强调的是,我完全同意。在我这边,我只想指出,
readonly
对于值和引用类型的行为完全相同。对于值和引用类型,
const
行为不会改变。
readonly
可用于非基元类型。对于值和引用类型,这两个关键字的工作方式相同,并且它们的语义不会因变量的类型而改变。程序员的结果确实会改变。可变类没有问题,但可变结构确实有问题。
可变类没有问题
取决于您的意图。如果我用readonly标记引用变量,我可能认为它不会被更改,但如果对象是这种类型的可变对象,我可能会大错特错。@IlyaIvanov我在回答中提到了这一点。问题是只读!=无论如何,我试图强调的是,我完全同意。在我这边,我只想指出,
readonly
对于值和引用类型的行为完全相同。以及
const
值和引用类型的行为不会改变。