C# 无法修改其值的数据字段或局部变量?
嘿,伙计们,我是c#的新手。我在读这本书,空白处填的是,数据字段或局部变量的值是不能修改的吗?有人能告诉我答案吗?谢谢 ps:我在youtube上搜索了很多新手,但我在代码上搞砸了。 谢谢。答案是Const。 这是链接答案是常量。C# 无法修改其值的数据字段或局部变量?,c#,C#,嘿,伙计们,我是c#的新手。我在读这本书,空白处填的是,数据字段或局部变量的值是不能修改的吗?有人能告诉我答案吗?谢谢 ps:我在youtube上搜索了很多新手,但我在代码上搞砸了。 谢谢。答案是Const。 这是链接答案是常量。 以下是链接完整的答案有两个: 1) 对于基本类型(如int、double、string等),可以使用const修饰符,这确实意味着该类型变量的值不能通过任何方式更改 2) 对于非基本类型,存在一个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
修饰符时必须小心-这可能会导致可变结构的细微错误。例如,见。但是,如果您的结构是不可变的,则可以有效地获得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如果你的搜索引擎是Youtubereadonly
,答案也是正确的,那就不是了。因为问题被表述为“是数据字段还是局部变量”。Readonly不能用于局部变量,但可以用于字段,因此不违反or条件。const和readonly之间的区别在于可以在ctor中指定只读字段。它们不是编译时常量,而const是。常量可以是答案。@Yoda仅适用于基本类型though@Yoda如果你的搜索引擎是Youtubereadonly
,答案也是正确的,那就不是了。因为问题被表述为“是数据字段还是局部变量”。Readonly不能用于局部变量,但可以用于字段,因此不违反or条件。const和readonly之间的区别在于可以在ctor中指定只读字段。它们不是编译时常量,而常量是。readonly
可用于非基元类型。对于值和引用类型,这两个关键字的工作方式相同,并且它们的语义不会因变量的类型而改变。程序员的结果确实会改变。可变类没有问题,但可变结构确实有问题。可变类没有问题
取决于您的意图。如果我用readonly标记引用变量,我可能认为它不会被更改,但如果对象是这种类型的可变对象,我可能会大错特错。@IlyaIvanov我在回答中提到了这一点。问题是只读!=无论如何,我试图强调的是,我完全同意。在我这边,我只想指出,readonly
对于值和引用类型的行为完全相同。对于值和引用类型,const
行为不会改变。readonly
可用于非基元类型。对于值和引用类型,这两个关键字的工作方式相同,并且它们的语义不会因变量的类型而改变。程序员的结果确实会改变。可变类没有问题,但可变结构确实有问题。可变类没有问题
取决于您的意图。如果我用readonly标记引用变量,我可能认为它不会被更改,但如果对象是这种类型的可变对象,我可能会大错特错。@IlyaIvanov我在回答中提到了这一点。问题是只读!=无论如何,我试图强调的是,我完全同意。在我这边,我只想指出,readonly
对于值和引用类型的行为完全相同。以及const
值和引用类型的行为不会改变。