Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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
NET中的readonly/const在哪里? 在C++中,你会看到代码>空格FUNC(const t&t)< /代码>无处不在。然而,我在.NET中没有看到任何类似的东西。为什么?_.net_Language Design_Library Design - Fatal编程技术网

NET中的readonly/const在哪里? 在C++中,你会看到代码>空格FUNC(const t&t)< /代码>无处不在。然而,我在.NET中没有看到任何类似的东西。为什么?

NET中的readonly/const在哪里? 在C++中,你会看到代码>空格FUNC(const t&t)< /代码>无处不在。然而,我在.NET中没有看到任何类似的东西。为什么?,.net,language-design,library-design,.net,Language Design,Library Design,我注意到使用struct的参数很多。但我看不到具有readonly/const的函数。事实上,现在我已经试过了,我不能用这些关键字来创建一个函数来保证不会修改传入的列表。是否无法向调用者保证此函数永远不会修改列表的内容?难道没有办法说调用代码,说这个列表永远不应该被修改吗?(我知道我可以克隆列表或查看文档,但有时我喜欢编译错误)C#中的方法参数没有const修饰符。如果您希望有类似于const的保证,那么可以在接口中使用不可变类型。例如,方法可以接受IEnumerable而不是可变集合类型。你也

我注意到使用struct的参数很多。但我看不到具有readonly/const的函数。事实上,现在我已经试过了,我不能用这些关键字来创建一个函数来保证不会修改传入的列表。是否无法向调用者保证此函数永远不会修改列表的内容?难道没有办法说调用代码,说这个列表永远不应该被修改吗?(我知道我可以克隆列表或查看文档,但有时我喜欢编译错误)

C#中的方法参数没有
const
修饰符。如果您希望有类似于const的保证,那么可以在接口中使用不可变类型。例如,方法可以接受
IEnumerable
而不是可变集合类型。你也可以看看。

我知道这不是一个简单的方法。也许这篇文章给了你一些想法:


< P><强>不变是C语言正在成熟的一个区域。到目前为止,C语言没有采用C++的<>代码> const 语义。我觉得这是件好事。C++中的<>代码> const 的行为常常使设计类层次结构成为挑战。在代码中添加了

const_cast
以绕过不需要的constness,这种情况并不少见。希望C#的设计者们能发明出一种更简单但仍然富有表现力的替代方案

目前,没有任何语言功能将传递给方法的参数或对象标记为不可变。最好使用只允许读取操作的接口(或更好的包装器)传递对象

对于.NET中的一些标准集合,可以使用包装器,它将任何可变类型封装在只读容器中

创建不可变类型需要计划和了解语言功能。例如,关键字是您的朋友。它允许您将类或结构的成员声明为不可变的。不幸的是,这种不变性只适用于引用,而不适用于被引用对象的成员。这意味着您可以声明:

private readonly int[] m_Values = new int[100];

public void SomeMethod()
{
    m_Values = new int[50]; // illegal, won't compile!
    m_Values[10] = 42;      // perfectly legal, yet undesirable
}
在上面的示例中,对数组的引用是不可变的,但数组的各个元素不是。当然,这种行为不仅仅局限于数组

我发现在设计不可变类型时有一种做法很有用,那就是将不可变行为分离到自己的接口中,然后由管理数据的类实现。接口仅公开保证不改变对象状态的get属性和方法。然后可以将您的类型的实例作为该接口类型的参数传递给方法。这是一种弱形式的不变性支持——因为被调用的方法通常可以将引用强制转换为可变类型。一个更好但更麻烦的替代方法是创建一个包装器实现,该实现实现了相同的接口并维护了对实际实例的引用(很像
ReadOnlyCollection
does)这是更多的工作,但为不变性提供了更有力的保证。

您选择使用的方法取决于不变性的保证有多重要,以及您愿意花费多少时间和精力来实现这一点


如果您有兴趣阅读有关此主题的更多内容,Eric Lippert有一个非常好的方法。

问题是C/C++中使用的常量正确性仅由编译器强制执行。顺便说一句,CLR实际上在托管代码中实施类型安全,而不是编译器。当然是这样,因为.NET framework支持多种语言。类型系统和交互规则在CLI中列出,CLI是一种公共语言基础设施,需要为许多目标和主人服务

常量正确性在当前的语言中很少见。就个人而言,我只知道C++,它没有移植到CLI。在语法与之相去甚远的语言上强制执行规则是困难的。CLS中没有无符号整数类型这样简单的东西在基程序集的设计上留下了显著的标记

不变性(真实的,不是用编译器伪造的)让MSFT团队保持思考。它很受欢迎,我知道C#团队一直在考虑它。好的并发性,等等。埃里克·利珀特对此做了一番研究,但有点消失了。对一个人和他的观众来说太大了。如果真的要付诸实施,我相信他们会仔细考虑,让它发挥作用。总有一天。一些语言

我注意到使用struct的参数很多

<>这里有一点值得注意的是,C++通过夸大值类型和引用类型之间的差异,夸大了结构和类与C++的区别。在C#中,所有类都是引用类型,所有结构都是值类型。在.Net中,默认情况下,所有内容都按值传递

值类型的这种区别的结果是,所有值类型在传递给函数时都会被复制。如果将结构传递给函数,则可以保证该函数不会更改原始结构,因为该函数只处理副本。向这样的参数添加常量是愚蠢的

引用类型也按值传递。或者,更具体地说,引用本身是通过值传递的。因此,您有一个引用的副本,但它指向(引用)同一个对象。因此,函数对对象所做的更改将在函数退出后保持不变

表面上看,添加一个
const
选项(至少对于引用类型)似乎是个好主意。它变得有点模糊是因为有副作用。或者,更确切地说,这是如何实施的?显然很容易说你的鳕鱼