【问题标题】:What is c# analog of C++ const reference return value什么是 C++ const 引用返回值的 c# 模拟
【发布时间】:2015-09-20 14:58:03
【问题描述】:

我确实将类成员的 c++ 访问器编写为

SomeClass const& x() const { return m_x; }

似乎在 c# 中这种类型的唯一保护是用私有(或未定义)集定义属性。但这只能防止分配而不是防止对某些类状态的操纵。

旁注:c++ 允许通过 const 指针删除 m_x - 恕我直言,这简直是对标准体的惊人疏忽。

【问题讨论】:

  • “恕我直言,这简直是对标准机构的惊人监督。” -。不,这不对。甚至const 对象也需要被销毁。否则,您将如何处理 void f() { Foo const foo; } 之类的事情?
  • @Christian - 我强烈反对:编译器足够聪明,可以将堆栈和类成员对象的破坏与对删除的显式调用区分开来,没有必要再让这扇门敞开。
  • 但是通过const指针禁止删除有什么好处呢?这将与语言的其余部分完全不一致。如果您对此问题感兴趣,请谷歌“删除指针常量”并查看所有 Stackoverflow 问题和答案。即使你不同意其他人,这也算不上“疏忽”。
  • 好吧,但是删除 const 指针并不是崩溃。如果它因const 指针而崩溃,那么它也会因非const 指针而崩溃...
  • 重点是:改变一个对象的状态和销毁一个对象是有很大区别的。销毁一个对象考虑改变它的状态。不是 C++,也不是我知道的任何其他编程语言。

标签: c# c++ constants


【解决方案1】:

现在,在 C# 7.2 中,您可以将 ref readonly 用于相同目的。您可以查看更多关于 here 的信息。检查第三点。

【讨论】:

    【解决方案2】:

    C++ 中的const 不能保护任何东西,您可以将其丢弃而不会出现任何问题。

    虽然 C# 没有它的等价物,但您可以(通常应该)创建真正的不可变类。这将constness 的负担放在返回它所属的对象上,并且您无法“将其丢弃”(除非反射)。

    【讨论】:

    • “C++ 中的const 不能保护任何东西,你可以毫无问题地抛弃它。” - C++ 保护的是墨菲,而不是马基雅维利。此外,“没有任何问题”是错误的。您可以通过const_cast 轻松进入未定义行为领域。
    • 顺便说一句... C# 中的不可变不保护任何东西,您可以通过反射将其消除,没有任何问题。
    • @blindy。我想拥有不可变类的唯一方法是保持设置属性私有并让所有访问函数从内部字段动态创建返回值。还有其他方法吗?任何已发布的建议可以遵循?
    • @zzz777 如果您的属性返回值类型或不可变引用类型,则您无需做任何事情,用户将无法通过这些修改任何类状态(好吧,如果值type 持有对原始类型的引用,并且可以访问所述类型的可变状态,但这可能很顽皮)。我的建议是让事物不可变,直到它们需要可变为止。
    • @kyle。对不起,我对 c# 很陌生,有什么关于如何在 c# 中使事物不可变的一般建议的指针吗?
    猜你喜欢
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2016-10-28
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    相关资源
    最近更新 更多