C# 如何在C中创建引用成员变量,就像在C+中一样+;
对不起,这是一个基本问题,我找不到答案 我必须用C#编写一些代码,并且我需要创建一个类成员变量作为引用 在C++中,这个代码是C# 如何在C中创建引用成员变量,就像在C+中一样+;,c#,windows,pointers,visual-studio-2015,reference,C#,Windows,Pointers,Visual Studio 2015,Reference,对不起,这是一个基本问题,我找不到答案 我必须用C#编写一些代码,并且我需要创建一个类成员变量作为引用 在C++中,这个代码是 public class MyClass { MyClass(int& m_var): mVar(m_var){} int& mVar; } 然而,在C语言中,我似乎无法做到这一点# 我可以使用 MyClass(ref int m_var) 但我无法使用创建引用成员变量 class MyClass { MyClass(r
public class MyClass
{
MyClass(int& m_var): mVar(m_var){}
int& mVar;
}
然而,在C语言中,我似乎无法做到这一点#
我可以使用
MyClass(ref int m_var)
但我无法使用创建引用成员变量
class MyClass
{
MyClass(ref int m_var)
{
mVar = m_var;
}
ref int mVar;
}
因为这一行:
ref int mVar;
告诉我错误:类、结构或接口成员声明中的“无效令牌”ref。
为什么会这样?为什么C#取消了创建引用成员变量的功能
int只是另一个类的占位符 哇
int
不仅仅是“另一个类”int
是一种值类型。不能有一个引用它的字段。您可以有一个ref
参数。在C#7中,可以有ref
返回和局部变量,但仍然不能有字段
在CLR中,int
与我们在这里讨论的领域中的类有很大的不同x
是我们形象地称之为“堆栈”的整数,因为我不想查看它们是如何实际实现的。在C中,我似乎记得将其描述为堆栈变量:
int x = 0;
List
是一个类y
,这里是一个“堆栈变量”,它是对“堆”上对象的可重新绑定引用:
为什么C#取消了创建引用成员变量的功能
他们没有“把它拿走”;他们没有绑架婴儿C++编译器并切断它的脚趾。他们只是觉得在C#中这样做不是个好主意,他们是对的。C#不是C,也不应该是C。丹尼斯·里奇设计C是为了像肯·汤普森这样的人使用;Anders Hejlsberg明确地设计了C#供我们其他人使用,他们更容易困惑
:
但是,CLR类型系统不允许字段作为其他变量的别名
(这是一篇老文章;C#7现在确实支持CLR一直支持的ref
的附加用法)
新的C#程序员在ref
和引用类型方面已经有足够多的麻烦了。就在最近,我在一个问题中看到了如下代码:
public void F(ref List<int> x) { ... }
public void F(参考列表x){…}
编写代码的人只想传入一个
列表
,而不需要创建昂贵的副本 奥安说了些什么。如果是int
,请查看类似于此的问题int
是一种值类型。在C#7中,可以有ref
返回和局部变量,但仍然不能有字段。方法是编写一个带有int
属性的简单类,并共享对该类实例的引用。int只是另一个类的占位符,我不想用模板将其复杂化。因此,您的意思是,如果我为int mVar
分配另一个引用,它会自动成为引用成员变量?@Ðаn您是对的。该功能没有被删除。它还在那里。您只需声明您打算通过使用safe
code向自己的脚开枪。然后你可以使用像C++一样的指针(记住C++的代码>和/代码>引用类型只是伪装的指针)。C#7添加了ref
局部变量,但它有严格的规则来确保运行时的安全性,包括这些变量必须是局部变量,允许编译器分析其使用情况以确保安全(即确保变量不会比它所指的东西更长寿)。
public class C {
// x is passed by value. It is the value of a reference. Seriously, it is.
public C(List<String> x) {
List = x;
}
public List<String> List { get; set; }
}
var list = new List<String>();
var x = new C(list);
var y = new C(list);
public class Reference<T> where T : struct
{
public Reference(T t) {
Value = t;
}
public T Value { get; set; }
}
class MyClass
{
MyClass(Reference<int> ref)
{
_ref = ref;
}
Reference<int> _ref;
}
public void F(ref List<int> x) { ... }