如何在C#中传递常量引用? 在C++中,传递const引用是一种常见的实践,例如: #include <iostream> using namespace std; class X { public : X() {m_x = 0; } X(const int & x) {m_x = x; } X(const X & other) { *this = other; } X & operator = (const X & other) { m_x = other.m_x; return *this; } void print() { cout << m_x << endl; } private : int m_x; }; void main() { X x1(5); X x2(4); X x3(x2); x2 = x1; x1.print(); x2.print(); x3.print(); } #包括 使用名称空间std; X类 { 公众: X(){m_X=0;} X(常数int&X){m_X=X;} X(常数X&other){*this=other;} X&operator=(constx&other){m_X=other.m_X;返回*this;} 无效打印(){cout

如何在C#中传递常量引用? 在C++中,传递const引用是一种常见的实践,例如: #include <iostream> using namespace std; class X { public : X() {m_x = 0; } X(const int & x) {m_x = x; } X(const X & other) { *this = other; } X & operator = (const X & other) { m_x = other.m_x; return *this; } void print() { cout << m_x << endl; } private : int m_x; }; void main() { X x1(5); X x2(4); X x3(x2); x2 = x1; x1.print(); x2.print(); x3.print(); } #包括 使用名称空间std; X类 { 公众: X(){m_X=0;} X(常数int&X){m_X=X;} X(常数X&other){*this=other;} X&operator=(constx&other){m_X=other.m_X;返回*this;} 无效打印(){cout,c#,reference,constants,C#,Reference,Constants,C#没有常量对象(即您不能修改的对象)的概念;只有变量(即字段)可以是常量或只读的,这意味着您不能分配给它们 ref关键字在概念上传递对变量的引用作为参数,即被调用方可以修改变量(而不仅仅是修改值)。这对于基本类型(int、bool等)特别有用.回答问题的ref部分;当您将变量传递给方法时,将创建该变量的副本。使用ref关键字将传递该变量的相同实例,以便该方法能够为调用方更新该变量 很多人似乎认为这只适用于值类型,因为引用类型只是作为引用传递的,所以ref关键字并没有任何效果。然而,这不是真的,

C#没有常量对象(即您不能修改的对象)的概念;只有变量(即字段)可以是常量或只读的,这意味着您不能分配给它们


ref关键字在概念上传递对变量的引用作为参数,即被调用方可以修改变量(而不仅仅是修改值)。这对于基本类型(int、bool等)特别有用.

回答问题的ref部分;当您将变量传递给方法时,将创建该变量的副本。使用ref关键字将传递该变量的相同实例,以便该方法能够为调用方更新该变量

很多人似乎认为这只适用于值类型,因为引用类型只是作为引用传递的,所以ref关键字并没有任何效果。然而,这不是真的,引用以和值相同的方式传递给方法;它被复制并创建该引用的新实例。这意味着调用方我将看到对对象本身的修改,但不会看到对引用的修改。因此,如果您试图将对象设置为null或新对象,则如果未使用ref关键字,调用方将看不到此修改:

无参考文献:

void UpdatePerson(Person person)
{
   // Caller would see this change
   person.Name = "Bob";
   // Caller wouldn't see this change
   person = null;
}
带有ref

void UpdatePerson(ref Person person)
{
   // Caller would see this change
   person.Name = "Bob";
   // Caller would see this change
   person = null;
}

7.2,这是可能的。

因为C++中的思维方式,最好的方法是把REF关键字当作指针。如果你使用它是一个值类型,那么它是一个指针,带有一个REF类型,它是指向一个指针的指针。重复:Eric Lipperts博客是一个很好的参考。“引用不是地址”。@ Malina HARRIS我读过,找不到任何反对你的评论。谢谢你指出相似性。我相信我已经学习了C++和C语言中的概念,这是非常感谢的。实际上,int不是严格意义上的不可变的,因为它可以在创建后修改。(而不可变对象在创建后不能更改)。int和其他基元类型的问题是它们是通过值传递的,因此实际上可以在函数中更改它们,但您将更改它们的副本,而不是它们本身。因此我宁愿编写“不可变类型和基元类型”“。好的,我不再提不可变。您如何修改int?赋值不算数(您也可以通过分配新的引用来“修改”不可变的引用类型)。int既是值类型也是不可变的。实际上,对于不可变类型,您无法真正区分引用类型和值类型(除非使用ReferenceEquals)。只有当类型是可变的(具有属性设置器或变异方法)时,引用和值之间的差异才开始发挥作用。NET中的大多数值类型都是不可变的(所有基元类型、DateTime、TimeSpan等)来自C++,没有引用的第一个例子非常奇怪!因此,作为参数传递的<代码>人>代码>对象复制到代码<> UpDeTeNeNe(人)的本地<代码>人>代码>对象中。和对参数的字段成员的修改是允许的,好像参数是通过引用传递的,但是对本地对象的修改根本不影响参数对象?@为什么McHHTRAN在C++中是奇怪的?<代码>人>代码>是通过值传递的,所以它完全取决于如何定义复制构造函数。ber变量
name
属于
std::string
类型,编译器生成的复制构造函数的行为与C#完全相同。这是一个不错的选择。谢谢。